public abstract class MultiTermQuery extends Query
Query
that matches documents
containing a subset of terms provided by a FilteredTermEnum
enumeration.
This query cannot be used directly; you must subclass
it and define getEnum(org.apache.lucene.index.IndexReader)
to provide a FilteredTermEnum
that iterates through the terms to be
matched.
NOTE: if setRewriteMethod(org.apache.lucene.search.MultiTermQuery.RewriteMethod)
is either
CONSTANT_SCORE_BOOLEAN_QUERY_REWRITE
or SCORING_BOOLEAN_QUERY_REWRITE
, you may encounter a
BooleanQuery.TooManyClauses
exception during
searching, which happens when the number of terms to be
searched exceeds BooleanQuery.getMaxClauseCount()
. Setting setRewriteMethod(org.apache.lucene.search.MultiTermQuery.RewriteMethod)
to CONSTANT_SCORE_FILTER_REWRITE
prevents this.
The recommended rewrite method is CONSTANT_SCORE_AUTO_REWRITE_DEFAULT
: it doesn't spend CPU
computing unhelpful scores, and it tries to pick the most
performant rewrite method given the query. If you
need scoring (like FuzzyQuery
, use
MultiTermQuery.TopTermsScoringBooleanQueryRewrite
which uses
a priority queue to only collect competitive terms
and not hit this limitation.
Note that QueryParser
produces
MultiTermQueries using CONSTANT_SCORE_AUTO_REWRITE_DEFAULT
by default.
Modifier and Type | Class and Description |
---|---|
static class |
MultiTermQuery.ConstantScoreAutoRewrite
A rewrite method that tries to pick the best
constant-score rewrite method based on term and
document counts from the query.
|
static class |
MultiTermQuery.RewriteMethod
Abstract class that defines how the query is rewritten.
|
static class |
MultiTermQuery.TopTermsBoostOnlyBooleanQueryRewrite
A rewrite method that first translates each term into
BooleanClause.Occur.SHOULD clause in a BooleanQuery, but the scores
are only computed as the boost. |
static class |
MultiTermQuery.TopTermsScoringBooleanQueryRewrite
A rewrite method that first translates each term into
BooleanClause.Occur.SHOULD clause in a BooleanQuery, and keeps the
scores as computed by the query. |
Modifier and Type | Field and Description |
---|---|
static MultiTermQuery.RewriteMethod |
CONSTANT_SCORE_AUTO_REWRITE_DEFAULT
Read-only default instance of
MultiTermQuery.ConstantScoreAutoRewrite , with ConstantScoreAutoRewrite.setTermCountCutoff(int) set to
ConstantScoreAutoRewrite.DEFAULT_TERM_COUNT_CUTOFF
and ConstantScoreAutoRewrite.setDocCountPercent(double) set to
ConstantScoreAutoRewrite.DEFAULT_DOC_COUNT_PERCENT . |
static MultiTermQuery.RewriteMethod |
CONSTANT_SCORE_BOOLEAN_QUERY_REWRITE
Like
SCORING_BOOLEAN_QUERY_REWRITE except
scores are not computed. |
static MultiTermQuery.RewriteMethod |
CONSTANT_SCORE_FILTER_REWRITE
A rewrite method that first creates a private Filter,
by visiting each term in sequence and marking all docs
for that term.
|
protected MultiTermQuery.RewriteMethod |
rewriteMethod |
static MultiTermQuery.RewriteMethod |
SCORING_BOOLEAN_QUERY_REWRITE
A rewrite method that first translates each term into
BooleanClause.Occur.SHOULD clause in a
BooleanQuery, and keeps the scores as computed by the
query. |
Constructor and Description |
---|
MultiTermQuery()
Constructs a query matching terms that cannot be represented with a single
Term.
|
Modifier and Type | Method and Description |
---|---|
void |
clearTotalNumberOfTerms()
Deprecated.
Don't use this method, as its not thread safe and useless.
|
boolean |
equals(Object obj) |
protected abstract FilteredTermEnum |
getEnum(IndexReader reader)
Construct the enumeration to be used, expanding the pattern term.
|
MultiTermQuery.RewriteMethod |
getRewriteMethod() |
int |
getTotalNumberOfTerms()
Deprecated.
Don't use this method, as its not thread safe and useless.
|
int |
hashCode() |
protected void |
incTotalNumberOfTerms(int inc)
Deprecated.
Don't use this method, as its not thread safe and useless.
|
Query |
rewrite(IndexReader reader)
To rewrite to a simpler form, instead return a simpler
enum from
getEnum(IndexReader) . |
void |
setRewriteMethod(MultiTermQuery.RewriteMethod method)
Sets the rewrite method to be used when executing the
query.
|
clone, combine, createWeight, extractTerms, getBoost, getSimilarity, mergeBooleanQueries, setBoost, toString, toString, weight
protected MultiTermQuery.RewriteMethod rewriteMethod
public static final MultiTermQuery.RewriteMethod CONSTANT_SCORE_FILTER_REWRITE
This method is faster than the BooleanQuery
rewrite methods when the number of matched terms or
matched documents is non-trivial. Also, it will never
hit an errant BooleanQuery.TooManyClauses
exception.
public static final MultiTermQuery.RewriteMethod SCORING_BOOLEAN_QUERY_REWRITE
BooleanClause.Occur.SHOULD
clause in a
BooleanQuery, and keeps the scores as computed by the
query. Note that typically such scores are
meaningless to the user, and require non-trivial CPU
to compute, so it's almost always better to use CONSTANT_SCORE_AUTO_REWRITE_DEFAULT
instead.
NOTE: This rewrite method will hit BooleanQuery.TooManyClauses
if the number of terms
exceeds BooleanQuery.getMaxClauseCount()
.
public static final MultiTermQuery.RewriteMethod CONSTANT_SCORE_BOOLEAN_QUERY_REWRITE
SCORING_BOOLEAN_QUERY_REWRITE
except
scores are not computed. Instead, each matching
document receives a constant score equal to the
query's boost.
NOTE: This rewrite method will hit BooleanQuery.TooManyClauses
if the number of terms
exceeds BooleanQuery.getMaxClauseCount()
.
public static final MultiTermQuery.RewriteMethod CONSTANT_SCORE_AUTO_REWRITE_DEFAULT
MultiTermQuery.ConstantScoreAutoRewrite
, with ConstantScoreAutoRewrite.setTermCountCutoff(int)
set to
ConstantScoreAutoRewrite.DEFAULT_TERM_COUNT_CUTOFF
and ConstantScoreAutoRewrite.setDocCountPercent(double)
set to
ConstantScoreAutoRewrite.DEFAULT_DOC_COUNT_PERCENT
.
Note that you cannot alter the configuration of this
instance; you'll need to create a private instance
instead.public MultiTermQuery()
protected abstract FilteredTermEnum getEnum(IndexReader reader) throws IOException
IOException
@Deprecated public int getTotalNumberOfTerms()
This method is not thread safe, be sure to only call it when no query is running!
If you re-use the same query instance for another
search, be sure to first reset the term counter
with clearTotalNumberOfTerms()
.
On single-segment indexes / no MultiReaders, you get the correct number of unique terms for the whole index. Use this number to compare different queries. For multi-segment indexes this number can also be achieved in non-constant-score mode. In constant-score mode you get the total number of terms seeked for all segments / sub-readers.
clearTotalNumberOfTerms()
@Deprecated public void clearTotalNumberOfTerms()
getTotalNumberOfTerms()
@Deprecated protected void incTotalNumberOfTerms(int inc)
public final Query rewrite(IndexReader reader) throws IOException
getEnum(IndexReader)
. For example,
to rewrite to a single term, return a SingleTermEnum
rewrite
in class Query
IOException
public MultiTermQuery.RewriteMethod getRewriteMethod()
public void setRewriteMethod(MultiTermQuery.RewriteMethod method)
MultiTermQuery.RewriteMethod
.