Skip to content

Commit fe6bf0f

Browse files
authored
Fix Position Search for Boosted Queries (#249)
* Unwrap FunctionScoreQueries during span conversion * Unwrap BoostQuery objects during span conversion
1 parent 767e3ca commit fe6bf0f

File tree

1 file changed

+20
-11
lines changed
  • montysolr/src/main/java/org/apache/lucene/queryparser/flexible/aqp/builders

1 file changed

+20
-11
lines changed

montysolr/src/main/java/org/apache/lucene/queryparser/flexible/aqp/builders/SpanConverter.java

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.apache.lucene.index.LeafReaderContext;
44
import org.apache.lucene.index.Term;
55
import org.apache.lucene.index.TermStates;
6+
import org.apache.lucene.queries.function.FunctionScoreQuery;
67
import org.apache.lucene.queryparser.flexible.core.QueryNodeException;
78
import org.apache.lucene.queryparser.flexible.core.messages.QueryParserMessages;
89
import org.apache.lucene.queryparser.flexible.messages.MessageImpl;
@@ -48,23 +49,31 @@ public SpanQuery getSpanQuery(SpanConverterContainer container)
4849
return new EmptySpanQuery(container.query);
4950
} else if (q instanceof SynonymQuery) {
5051
return wrapBoost(convertSynonymToSpan(container), boost);
51-
} else {
52+
} else if (q instanceof FunctionScoreQuery functionScoreQuery) {
53+
container.query = functionScoreQuery.getWrappedQuery();
54+
return getSpanQuery(container);
55+
} else if (q instanceof BoostQuery boostQuery) {
56+
container.query = boostQuery.getQuery();
57+
return getSpanQuery(container);
58+
} else if (q instanceof ConstantScoreQuery constantScoreQuery) {
59+
container.query = constantScoreQuery.getQuery();
60+
return getSpanQuery(container);
61+
}
5262

53-
SpanQuery wrapped = wrapNonConvertible(container);
54-
if (wrapped != null)
55-
return wrapped;
63+
SpanQuery wrapped = wrapNonConvertible(container);
64+
if (wrapped != null)
65+
return wrapped;
5666

57-
throw new QueryNodeException(new MessageImpl(
58-
QueryParserMessages.LUCENE_QUERY_CONVERSION_ERROR, q.toString(),
59-
"(yet) Unsupported clause inside span query: "
60-
+ q.getClass().getName()));
61-
}
67+
throw new QueryNodeException(new MessageImpl(
68+
QueryParserMessages.LUCENE_QUERY_CONVERSION_ERROR, q.toString(),
69+
"(yet) Unsupported clause inside span query: "
70+
+ q.getClass().getName()));
6271
}
6372

6473
private SpanQuery convertDisjunctionQuery(SpanConverterContainer container) throws QueryNodeException {
6574
DisjunctionMaxQuery q = (DisjunctionMaxQuery) container.query;
6675
Collection<Query> clauses = q.getDisjuncts();
67-
if (clauses.size() == 0) {
76+
if (clauses.isEmpty()) {
6877
container.query = new MatchNoDocsQuery();
6978
return getSpanQuery(container);
7079
} else if (clauses.size() == 1) {
@@ -83,7 +92,7 @@ private SpanQuery convertDisjunctionQuery(SpanConverterContainer container) thro
8392
}
8493

8594
private SpanQuery wrapBoost(SpanQuery q, float boost) {
86-
if (Math.abs(boost - 1.0f) < 1e-6f) {
95+
if (Float.compare(boost, 1f) == 0) {
8796
return q;
8897
}
8998

0 commit comments

Comments
 (0)