public interface LuceneQueryModifier
Query
and add a
MatchAllDocsQuery
to the portion of the query that require them.
This inspects the query to determine if there are any nodes in the query that are marked as
BooleanClause.Occur.MUST_NOT
AND they do not have a positive query to work
against.
This is because Lucene will drop queries of this kind instead of trying to find the correct result.
When we specify a query that is -A || B lucene treats this as equivilent to B. When we specify this query what we
mean is (-A && ALL_VALUES) || B which is obviously not equivilent to B.
The algorithm for determining if a BooleanQuery
should have a
MatchAllDocsQuery
added to it with an occur of
BooleanClause.Occur.MUST_NOT
is:
Case 1: BooleanQuery contains only BooleanClause.Occur.MUST_NOT
clauses THEN add a
MatchAllDocsQuery
Case 2: BooleanQuery contains at least one BooleanClause.Occur.MUST
and no
BooleanClause.Occur.SHOULD
THEN do not add a MatchAllDocsQuery
Case 3: BooleanQuery contains at least one BooleanClause.Occur.SHOULD
THEN
add a MatchAllDocsQuery
to each
BooleanClause.Occur.MUST_NOT
portion of the query. This may mean that we need to
rewrite the a single term to be a BooleanQuery that contains the single term AND the MatchAllDocsQuery
.
NOTE: A BooleanQuery that contains at least one BooleanClause.Occur.MUST
and at least
one BooleanClause.Occur.SHOULD
is the same as Case 2 since the MUST portion of the
query will provide a positive set of results.Modifier and Type | Method and Description |
---|---|
org.apache.lucene.search.Query |
getModifiedQuery(org.apache.lucene.search.Query originalQuery)
Will clone and rewrite the query as per the rules defined above.
|
org.apache.lucene.search.Query getModifiedQuery(org.apache.lucene.search.Query originalQuery)
originalQuery
- defines the lucene query to inspect, must not be null.Copyright © 2002-2015 Atlassian. All Rights Reserved.