Fix propagation of enablePositionIncrements in QueryStringQueryBuilder (#43578)

This change fixes the propagation of the enablePositionIncrements option
to the underlying QueryBuilder.

Closes #43574
This commit is contained in:
Jim Ferenczi 2019-06-27 17:00:21 +02:00 committed by jimczi
parent 329d05f61e
commit df4b30fd8b
4 changed files with 30 additions and 27 deletions

View File

@ -251,7 +251,7 @@ public class MatchQuery {
Analyzer analyzer = getAnalyzer(fieldType, type == Type.PHRASE || type == Type.PHRASE_PREFIX);
assert analyzer != null;
MatchQueryBuilder builder = new MatchQueryBuilder(analyzer, fieldType);
MatchQueryBuilder builder = new MatchQueryBuilder(analyzer, fieldType, enablePositionIncrements, autoGenerateSynonymsPhraseQuery);
/*
* If a keyword analyzer is used, we know that further analysis isn't
@ -357,15 +357,16 @@ public class MatchQuery {
/**
* Creates a new QueryBuilder using the given analyzer.
*/
MatchQueryBuilder(Analyzer analyzer, MappedFieldType fieldType) {
MatchQueryBuilder(Analyzer analyzer, MappedFieldType fieldType,
boolean enablePositionIncrements, boolean autoGenerateSynonymsPhraseQuery) {
super(analyzer);
this.fieldType = fieldType;
setEnablePositionIncrements(enablePositionIncrements);
if (hasPositions(fieldType)) {
setAutoGenerateMultiTermSynonymsPhraseQuery(autoGenerateSynonymsPhraseQuery);
} else {
setAutoGenerateMultiTermSynonymsPhraseQuery(false);
}
setEnablePositionIncrements(enablePositionIncrements);
}
@Override

View File

@ -138,9 +138,11 @@ public class MultiMatchQuery extends MatchQuery {
for (Map.Entry<Analyzer, List<FieldAndBoost>> group : groups.entrySet()) {
final MatchQueryBuilder builder;
if (group.getValue().size() == 1) {
builder = new MatchQueryBuilder(group.getKey(), group.getValue().get(0).fieldType);
builder = new MatchQueryBuilder(group.getKey(), group.getValue().get(0).fieldType,
enablePositionIncrements, autoGenerateSynonymsPhraseQuery);
} else {
builder = new BlendedQueryBuilder(group.getKey(), group.getValue(), tieBreaker);
builder = new BlendedQueryBuilder(group.getKey(), group.getValue(), tieBreaker,
enablePositionIncrements, autoGenerateSynonymsPhraseQuery);
}
/*
@ -170,8 +172,9 @@ public class MultiMatchQuery extends MatchQuery {
private final List<FieldAndBoost> blendedFields;
private final float tieBreaker;
BlendedQueryBuilder(Analyzer analyzer, List<FieldAndBoost> blendedFields, float tieBreaker) {
super(analyzer, blendedFields.get(0).fieldType);
BlendedQueryBuilder(Analyzer analyzer, List<FieldAndBoost> blendedFields, float tieBreaker,
boolean enablePositionIncrements, boolean autoGenerateSynonymsPhraseQuery) {
super(analyzer, blendedFields.get(0).fieldType, enablePositionIncrements, autoGenerateSynonymsPhraseQuery);
this.blendedFields = blendedFields;
this.tieBreaker = tieBreaker;
}

View File

@ -153,6 +153,12 @@ public class QueryStringQueryParser extends XQueryParser {
this.lenient = lenient;
}
@Override
public void setEnablePositionIncrements(boolean enable) {
super.setEnablePositionIncrements(enable);
queryBuilder.setEnablePositionIncrements(enable);
}
@Override
public void setDefaultOperator(Operator op) {
super.setDefaultOperator(op);

View File

@ -766,26 +766,6 @@ public class QueryStringQueryBuilderTests extends AbstractQueryTestCase<QueryStr
assertThat(e.getMessage(), containsString("would result in more than 10 states"));
}
/**
* Validates that {@code max_determinized_states} can be parsed and lowers the allowed number of determinized states.
*/
public void testEnabledPositionIncrements() throws Exception {
XContentBuilder builder = JsonXContent.contentBuilder();
builder.startObject(); {
builder.startObject("query_string"); {
builder.field("query", "text");
builder.field("default_field", STRING_FIELD_NAME);
builder.field("enable_position_increments", false);
}
builder.endObject();
}
builder.endObject();
QueryStringQueryBuilder queryBuilder = (QueryStringQueryBuilder) parseInnerQueryBuilder(createParser(builder));
assertFalse(queryBuilder.enablePositionIncrements());
}
public void testToQueryFuzzyQueryAutoFuziness() throws Exception {
for (int i = 0; i < 3; i++) {
final int len;
@ -1441,6 +1421,19 @@ public class QueryStringQueryBuilderTests extends AbstractQueryTestCase<QueryStr
assertEquals(expected, query);
}
public void testEnablePositionIncrement() throws Exception {
Query query = new QueryStringQueryBuilder("\"quick the fox\"")
.field(STRING_FIELD_NAME)
.analyzer("stop")
.enablePositionIncrements(false)
.toQuery(createShardContext());
PhraseQuery expected = new PhraseQuery.Builder()
.add(new Term(STRING_FIELD_NAME, "quick"))
.add(new Term(STRING_FIELD_NAME, "fox"))
.build();
assertEquals(expected, query);
}
public void testWithPrefixStopWords() throws Exception {
Query query = new QueryStringQueryBuilder("the* quick fox")
.field(STRING_FIELD_NAME)