Class TermInSetQuery

  • All Implemented Interfaces:
    Accountable

    public class TermInSetQuery
    extends MultiTermQuery
    implements Accountable
    Specialization for a disjunction over many terms that, by default, behaves like a ConstantScoreQuery over a BooleanQuery containing only BooleanClause.Occur.SHOULD clauses.

    For instance in the following example, both q1 and q2 would yield the same scores:

     Query q1 = new TermInSetQuery("field", new BytesRef("foo"), new BytesRef("bar"));
    
     BooleanQuery bq = new BooleanQuery();
     bq.add(new TermQuery(new Term("field", "foo")), Occur.SHOULD);
     bq.add(new TermQuery(new Term("field", "bar")), Occur.SHOULD);
     Query q2 = new ConstantScoreQuery(bq);
     

    Unless a custom MultiTermQuery.RewriteMethod is provided, this query executes like a regular disjunction where there are few terms. However, when there are many terms, instead of merging iterators on the fly, it will populate a bit set with matching docs for the least-costly terms and maintain a size-limited set of more costly iterators that are merged on the fly. For more details, see MultiTermQuery.CONSTANT_SCORE_BLENDED_REWRITE.

    Users may also provide a custom MultiTermQuery.RewriteMethod to define different execution behavior, such as relying on doc values (see: MultiTermQuery.DOC_VALUES_REWRITE), or if scores are required (see: MultiTermQuery.SCORING_BOOLEAN_REWRITE). See MultiTermQuery documentation for more rewrite options.

    NOTE: This query produces scores that are equal to its boost

    • Field Detail

      • BASE_RAM_BYTES_USED

        private static final long BASE_RAM_BYTES_USED
      • field

        private final java.lang.String field
      • termDataHashCode

        private final int termDataHashCode
    • Constructor Detail

      • TermInSetQuery

        public TermInSetQuery​(java.lang.String field,
                              java.util.Collection<BytesRef> terms)
      • TermInSetQuery

        public TermInSetQuery​(java.lang.String field,
                              BytesRef... terms)
      • TermInSetQuery

        private TermInSetQuery​(java.lang.String field,
                               PrefixCodedTerms termData)
    • Method Detail

      • packTerms

        private static PrefixCodedTerms packTerms​(java.lang.String field,
                                                  java.util.Collection<BytesRef> terms)
      • getTermsCount

        public long getTermsCount()
                           throws java.io.IOException
        Description copied from class: MultiTermQuery
        Return the number of unique terms contained in this query, if known up-front. If not known, -1 will be returned.
        Overrides:
        getTermsCount in class MultiTermQuery
        Throws:
        java.io.IOException
      • visit

        public void visit​(QueryVisitor visitor)
        Description copied from class: Query
        Recurse through the query tree, visiting any child queries.
        Specified by:
        visit in class Query
        Parameters:
        visitor - a QueryVisitor to be called by each query in the tree
      • equals

        public boolean equals​(java.lang.Object other)
        Description copied from class: Query
        Override and implement query instance equivalence properly in a subclass. This is required so that QueryCache works properly.

        Typically a query will be equal to another only if it's an instance of the same class and its document-filtering properties are identical to those of the other instance. Utility methods are provided for certain repetitive code.

        Overrides:
        equals in class MultiTermQuery
        See Also:
        Query.sameClassAs(Object), Query.classHash()
      • getTermData

        @Deprecated
        public PrefixCodedTerms getTermData()
        Deprecated.
        the encoded terms will no longer be exposed in a future major version; this is an implementation detail that could change at some point and shouldn't be relied on directly
        Returns the terms wrapped in a PrefixCodedTerms.
      • toString

        public java.lang.String toString​(java.lang.String defaultField)
        Description copied from class: Query
        Prints a query to a string, with field assumed to be the default field and omitted.
        Specified by:
        toString in class Query
      • ramBytesUsed

        public long ramBytesUsed()
        Description copied from interface: Accountable
        Return the memory usage of this object in bytes. Negative values are illegal.
        Specified by:
        ramBytesUsed in interface Accountable
      • getChildResources

        public java.util.Collection<Accountable> getChildResources()
        Description copied from interface: Accountable
        Returns nested resources of this class. The result should be a point-in-time snapshot (to avoid race conditions).
        Specified by:
        getChildResources in interface Accountable
        See Also:
        Accountables
      • getTermsEnum

        protected TermsEnum getTermsEnum​(Terms terms,
                                         AttributeSource atts)
                                  throws java.io.IOException
        Description copied from class: MultiTermQuery
        Construct the enumeration to be used, expanding the pattern term. This method should only be called if the field exists (ie, implementations can assume the field does exist). This method should not return null (should instead return TermsEnum.EMPTY if no terms match). The TermsEnum must already be positioned to the first matching term. The given AttributeSource is passed by the MultiTermQuery.RewriteMethod to share information between segments, for example TopTermsRewrite uses it to share maximum competitive boosts
        Specified by:
        getTermsEnum in class MultiTermQuery
        Throws:
        java.io.IOException