Class PhraseWildcardQuery


  • public class PhraseWildcardQuery
    extends Query
    A generalized version of PhraseQuery, built with one or more MultiTermQuery that provides term expansions for multi-terms (one of the expanded terms must match).

    Its main advantage is to control the total number of expansions across all MultiTermQuery and across all segments.

    Use the PhraseWildcardQuery.Builder to build a PhraseWildcardQuery.

    This query is similar to MultiPhraseQuery, but it handles, controls and optimizes the multi-term expansions.

    This query is equivalent to building an ordered SpanNearQuery with a list of SpanTermQuery and SpanMultiTermQueryWrapper. But it optimizes the multi-term expansions and the segment accesses. It first resolves the single-terms to early stop if some does not match. Then it expands each multi-term sequentially, stopping immediately if one does not match. It detects the segments that do not match to skip them for the next expansions. This often avoid expanding the other multi-terms on some or even all segments. And finally it controls the total number of expansions.

    Immutable.

    • Field Detail

      • NO_MATCH_QUERY

        protected static final Query NO_MATCH_QUERY
      • field

        protected final java.lang.String field
      • slop

        protected final int slop
      • maxMultiTermExpansions

        protected final int maxMultiTermExpansions
      • segmentOptimizationEnabled

        protected final boolean segmentOptimizationEnabled
    • Constructor Detail

      • PhraseWildcardQuery

        protected PhraseWildcardQuery​(java.lang.String field,
                                      java.util.List<PhraseWildcardQuery.PhraseTerm> phraseTerms,
                                      int slop,
                                      int maxMultiTermExpansions,
                                      boolean segmentOptimizationEnabled)
    • Method Detail

      • getField

        public java.lang.String getField()
      • rewrite

        public Query rewrite​(IndexSearcher indexSearcher)
                      throws java.io.IOException
        Description copied from class: Query
        Expert: called to re-write queries into primitive queries. For example, a PrefixQuery will be rewritten into a BooleanQuery that consists of TermQuerys.

        Callers are expected to call rewrite multiple times if necessary, until the rewritten query is the same as the original query.

        The rewrite process may be able to make use of IndexSearcher's executor and be executed in parallel if the executor is provided.

        However, if any of the intermediary queries do not satisfy the new API, parallel rewrite is not possible for any subsequent sub-queries. To take advantage of this API, the entire query tree must override this method.

        Overrides:
        rewrite in class Query
        Throws:
        java.io.IOException
        See Also:
        IndexSearcher.rewrite(Query)
      • 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
      • createWeight

        public Weight createWeight​(IndexSearcher searcher,
                                   ScoreMode scoreMode,
                                   float boost)
                            throws java.io.IOException
        Description copied from class: Query
        Expert: Constructs an appropriate Weight implementation for this query.

        Only implemented by primitive queries, which re-write to themselves.

        Overrides:
        createWeight in class Query
        scoreMode - How the produced scorers will be consumed.
        boost - The boost that is propagated by the parent queries.
        Throws:
        java.io.IOException
      • earlyStopWeight

        protected Weight earlyStopWeight()
      • noMatchWeight

        protected Weight noMatchWeight()
      • equals

        public boolean equals​(java.lang.Object o)
        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.

        Specified by:
        equals in class Query
        See Also:
        Query.sameClassAs(Object), Query.classHash()
      • hashCode

        public int hashCode()
        Description copied from class: Query
        Override and implement query hash code properly in a subclass. This is required so that QueryCache works properly.
        Specified by:
        hashCode in class Query
        See Also:
        Query.equals(Object)
      • toString

        public final java.lang.String toString​(java.lang.String omittedField)
        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
      • collectMultiTermData

        protected int collectMultiTermData​(PhraseWildcardQuery.MultiTerm multiTerm,
                                           IndexSearcher searcher,
                                           java.util.List<LeafReaderContext> segments,
                                           int remainingMultiTerms,
                                           int maxExpansionsForTerm,
                                           PhraseWildcardQuery.TermsData termsData)
                                    throws java.io.IOException
        Collects the TermState and TermStatistics for a multi-term with expansion.
        Parameters:
        remainingMultiTerms - the number of remaining multi-terms to process, including the current one, excluding the multi-terms already processed.
        termsData - receives the collected data.
        Throws:
        java.io.IOException
      • shouldOptimizeSegments

        protected boolean shouldOptimizeSegments()
      • checkTermsHavePositions

        protected void checkTermsHavePositions​(Terms terms)