Skip to content

Commit

Permalink
Fixed span prefix query to use the default logic by introducing a boo…
Browse files Browse the repository at this point in the history
…lean field and added rewrite method for automaton query
  • Loading branch information
manav113 committed Feb 5, 2025
1 parent 9e3f0e5 commit 06d1822
Show file tree
Hide file tree
Showing 8 changed files with 1,101 additions and 1,088 deletions.
2,130 changes: 1,065 additions & 1,065 deletions grpc-gateway/luceneserver.pb.go

Large diffs are not rendered by default.

8 changes: 5 additions & 3 deletions grpc-gateway/luceneserver.swagger.json
Original file line number Diff line number Diff line change
Expand Up @@ -3341,7 +3341,7 @@
},
"indexPrefixes": {
"$ref": "#/definitions/luceneserverIndexPrefixes",
"title": "IndexPrefixes when set for TEXT field"
"title": "Parameter enables the indexing of term prefixes to speed up prefix searches"
}
},
"title": "Definition of a field in an index"
Expand Down Expand Up @@ -3970,11 +3970,13 @@
"properties": {
"minChars": {
"type": "integer",
"format": "int32"
"format": "int32",
"description": "The minimum prefix length to index. Must be greater than 0, and defaults to 2."
},
"maxChars": {
"type": "integer",
"format": "int32"
"format": "int32",
"description": "The maximum prefix length to index. Must be less than 20, and defaults to 5."
}
},
"title": "Options for including IndexPrefixes for field"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,8 @@ public Query getRangeQuery(RangeQuery rangeQuery) {
}

@Override
public Query getPrefixQuery(PrefixQuery prefixQuery, MultiTermQuery.RewriteMethod rewriteMethod) {
public Query getPrefixQuery(
PrefixQuery prefixQuery, MultiTermQuery.RewriteMethod rewriteMethod, boolean spanQuery) {
verifySearchable("Prefix query");
return new org.apache.lucene.search.PrefixQuery(
new Term(prefixQuery.getField(), prefixQuery.getPrefix()), rewriteMethod);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ boolean accept(int length) {
return length >= minChars - 1 && length <= maxChars;
}

public Query getPrefixQuery(PrefixQuery prefixQuery) {
public Query getPrefixQuery(PrefixQuery prefixQuery, MultiTermQuery.RewriteMethod rewriteMethod) {
String textValue = prefixQuery.getPrefix();
if (textValue.length() >= minChars) {
return super.getTermQueryFromTextValue(textValue);
Expand All @@ -78,8 +78,8 @@ public Query getPrefixQuery(PrefixQuery prefixQuery) {
automata.add(Automata.makeAnyChar());
}
Automaton automaton = Operations.concatenate(automata);
AutomatonQuery query = new AutomatonQuery(new Term(getName(), textValue + "*"), automaton);

AutomatonQuery query =
new AutomatonQuery(new Term(getName(), textValue + "*"), automaton, false, rewriteMethod);
return new BooleanQuery.Builder()
.add(query, BooleanClause.Occur.SHOULD)
.add(new TermQuery(new Term(parentField, textValue)), BooleanClause.Occur.SHOULD)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,10 +126,11 @@ public void parseDocumentField(
}

@Override
public Query getPrefixQuery(PrefixQuery prefixQuery, MultiTermQuery.RewriteMethod rewriteMethod) {
public Query getPrefixQuery(
PrefixQuery prefixQuery, MultiTermQuery.RewriteMethod rewriteMethod, boolean spanQuery) {
verifySearchable("Prefix query");
if (hasPrefix() && prefixFieldDef.accept(prefixQuery.getPrefix().length())) {
Query query = prefixFieldDef.getPrefixQuery(prefixQuery);
if (hasPrefix() && prefixFieldDef.accept(prefixQuery.getPrefix().length()) && !spanQuery) {
Query query = prefixFieldDef.getPrefixQuery(prefixQuery, rewriteMethod);
if (rewriteMethod == null
|| rewriteMethod == MultiTermQuery.CONSTANT_SCORE_REWRITE
|| rewriteMethod == MultiTermQuery.CONSTANT_SCORE_BOOLEAN_REWRITE) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@ public interface PrefixQueryable {
*
* @param prefixQuery prefix query configuration
* @param rewriteMethod method to use for rewriting the prefix query
* @param spanQuery boolean to check if the query is a span query or not
* @return lucene prefix query
*/
Query getPrefixQuery(PrefixQuery prefixQuery, MultiTermQuery.RewriteMethod rewriteMethod);
Query getPrefixQuery(
PrefixQuery prefixQuery, MultiTermQuery.RewriteMethod rewriteMethod, boolean spanQuery);
}
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ private Query getQueryNode(
MultiFunctionScoreQuery.build(query.getMultiFunctionScoreQuery(), state);
case MATCHPHRASEPREFIXQUERY ->
MatchPhrasePrefixQuery.build(query.getMatchPhrasePrefixQuery(), state);
case PREFIXQUERY -> getPrefixQuery(query.getPrefixQuery(), state);
case PREFIXQUERY -> getPrefixQuery(query.getPrefixQuery(), state, false);
case CONSTANTSCOREQUERY ->
getConstantScoreQuery(query.getConstantScoreQuery(), state, docLookup);
case SPANQUERY -> getSpanQuery(query.getSpanQuery(), state);
Expand Down Expand Up @@ -563,7 +563,8 @@ private Query getExistsQuery(ExistsQuery existsQuery, IndexState state) {
return new ConstantScoreQuery(new TermQuery(new Term(IndexState.FIELD_NAMES, fieldName)));
}

private static Query getPrefixQuery(PrefixQuery prefixQuery, IndexState state) {
private static Query getPrefixQuery(
PrefixQuery prefixQuery, IndexState state, boolean spanQuery) {
FieldDef fieldDef = state.getFieldOrThrow(prefixQuery.getField());

if (!(fieldDef instanceof PrefixQueryable)) {
Expand All @@ -574,7 +575,7 @@ private static Query getPrefixQuery(PrefixQuery prefixQuery, IndexState state) {
MultiTermQuery.RewriteMethod rewriteMethod =
getRewriteMethod(prefixQuery.getRewrite(), prefixQuery.getRewriteTopTermsSize());

return ((PrefixQueryable) fieldDef).getPrefixQuery(prefixQuery, rewriteMethod);
return ((PrefixQueryable) fieldDef).getPrefixQuery(prefixQuery, rewriteMethod, spanQuery);
}

private static MultiTermQuery.RewriteMethod getRewriteMethod(
Expand Down Expand Up @@ -661,7 +662,7 @@ private SpanMultiTermQueryWrapper<?> getSpanMultiTermQueryWrapper(
FuzzyQuery fuzzyQuery = getFuzzyQuery(protoSpanMultiTermQuery);
return new SpanMultiTermQueryWrapper<>(fuzzyQuery);
case PREFIXQUERY:
Query prefixQuery = getPrefixQuery(protoSpanMultiTermQuery.getPrefixQuery(), state);
Query prefixQuery = getPrefixQuery(protoSpanMultiTermQuery.getPrefixQuery(), state, true);
return new SpanMultiTermQueryWrapper<>((MultiTermQuery) prefixQuery);
case REGEXPQUERY:
RegexpQuery regexpQuery = getRegexpQuery(protoSpanMultiTermQuery);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,8 @@ public void testPrefixQueryConstantScoreQuery() {
TextFieldDef fieldDef = createFieldDef(field);
PrefixQuery prefixQuery =
PrefixQuery.newBuilder().setField("test_field").setPrefix("test").build();
Query query = fieldDef.getPrefixQuery(prefixQuery, null);
Query query =
fieldDef.getPrefixQuery(prefixQuery, MultiTermQuery.CONSTANT_SCORE_REWRITE, false);
assertNotNull(query);
assertTrue(query instanceof ConstantScoreQuery);
}
Expand All @@ -167,7 +168,7 @@ public void testPrefixQueryBooleanQuery() {
PrefixFieldDef prefixFieldDef = FieldDef.getPrefixFieldDef();
PrefixQuery prefixQuery =
PrefixQuery.newBuilder().setField("test_field").setPrefix("te").build();
Query query = prefixFieldDef.getPrefixQuery(prefixQuery);
Query query = prefixFieldDef.getPrefixQuery(prefixQuery, MultiTermQuery.CONSTANT_SCORE_REWRITE);
assertTrue(query instanceof BooleanQuery);
}

Expand All @@ -181,7 +182,8 @@ public void testPrefixQueryLessThanMin() {
TextFieldDef textFieldDef = createFieldDef(field);
PrefixQuery prefixQuery =
PrefixQuery.newBuilder().setField("test_field").setPrefix("ab").build();
Query query = textFieldDef.getPrefixQuery(prefixQuery, null);
Query query =
textFieldDef.getPrefixQuery(prefixQuery, MultiTermQuery.CONSTANT_SCORE_REWRITE, false);
assertTrue(query instanceof ConstantScoreQuery);
Query innerQuery = ((ConstantScoreQuery) query).getQuery();
assertTrue(innerQuery instanceof BooleanQuery);
Expand All @@ -199,7 +201,8 @@ public void testPrefixQueryEqualToMin() {
TextFieldDef textFieldDef = createFieldDef(field);
PrefixQuery prefixQuery =
PrefixQuery.newBuilder().setField("text_field").setPrefix("abc").build();
Query query = textFieldDef.getPrefixQuery(prefixQuery, null);
Query query =
textFieldDef.getPrefixQuery(prefixQuery, MultiTermQuery.CONSTANT_SCORE_REWRITE, false);
assertTrue(query instanceof ConstantScoreQuery);
Query innerQuery = ((ConstantScoreQuery) query).getQuery();
assertTrue(innerQuery instanceof TermQuery);
Expand All @@ -214,7 +217,8 @@ public void testPrefixQuery_BetweenMinAndMax() {
.build();
TextFieldDef textFieldDef = createFieldDef(field);
PrefixQuery query = PrefixQuery.newBuilder().setField("text_field").setPrefix("abcd").build();
Query prefixQuery = textFieldDef.getPrefixQuery(query, null);
Query prefixQuery =
textFieldDef.getPrefixQuery(query, MultiTermQuery.CONSTANT_SCORE_REWRITE, false);
assertTrue(prefixQuery instanceof ConstantScoreQuery);
Query innerQuery = ((ConstantScoreQuery) prefixQuery).getQuery();
assertTrue(innerQuery instanceof TermQuery);
Expand All @@ -230,7 +234,8 @@ public void testPrefixQueryGreaterThanMax() {
.setIndexPrefixes(IndexPrefixes.newBuilder().setMinChars(3).setMaxChars(6).build())
.build();
TextFieldDef textFieldDef = createFieldDef(field);
Query query = textFieldDef.getPrefixQuery(prefixQuery, MultiTermQuery.CONSTANT_SCORE_REWRITE);
Query query =
textFieldDef.getPrefixQuery(prefixQuery, MultiTermQuery.CONSTANT_SCORE_REWRITE, false);
assertFalse(query instanceof ConstantScoreQuery);
assertTrue(query instanceof org.apache.lucene.search.PrefixQuery);
}
Expand All @@ -245,7 +250,8 @@ public void testPrefixQuery_CustomRewriteMethod() {
.setIndexPrefixes(IndexPrefixes.newBuilder().setMinChars(3).setMaxChars(6).build())
.build();
TextFieldDef textFieldDef = createFieldDef(field);
Query query = textFieldDef.getPrefixQuery(prefixQuery, MultiTermQuery.SCORING_BOOLEAN_REWRITE);
Query query =
textFieldDef.getPrefixQuery(prefixQuery, MultiTermQuery.SCORING_BOOLEAN_REWRITE, false);
assertFalse(query instanceof ConstantScoreQuery);
assertTrue(query instanceof TermQuery);
}
Expand All @@ -257,7 +263,7 @@ public void testPrefixQuery_NoPrefixField() {
PrefixQuery prefixQuery =
PrefixQuery.newBuilder().setField("text_field").setPrefix("abc").build();
Query query =
noPrefixFieldDef.getPrefixQuery(prefixQuery, MultiTermQuery.CONSTANT_SCORE_REWRITE);
noPrefixFieldDef.getPrefixQuery(prefixQuery, MultiTermQuery.CONSTANT_SCORE_REWRITE, false);
assertTrue(query instanceof org.apache.lucene.search.PrefixQuery);
}
}

0 comments on commit 06d1822

Please sign in to comment.