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-2018 Atlassian. All Rights Reserved.