Skip to content

Commit 87601ef

Browse files
Fix Semantic Query Rewrite Interception Drops Boosts (#129282) (#131472)
* fix boosting for knn * Fixing for match query * fixing for match subquery * fix for sparse vector query boost * fix linting issues * Update docs/changelog/129282.yaml * update changelog * Copy constructor with match query * util function to create sparseVectorBuilder for sparse query * util function for knn query to support boost * adding unit tests for all intercepted query terms * Adding yaml test for match,sparse, and knn * Adding queryname support for nested query * fix code styles * Fix failed yaml tests * Update docs/changelog/129282.yaml * update yaml tests to expand test scenarios * Updating knn to copy constructor * adding yaml tests for multiple indices * refactoring match query to adjust boost and queryname and move to copy constructor * refactoring sparse query to adjust boost and queryname and move to copy constructor * [CI] Auto commit changes from spotless * Refactor sparse vector to adjust boost and queryname in the top level * Refactor knn vector to adjust boost and queryname in the top level * fix knn combined query * fix unit tests * fix lint issues * remove unused code * Update inference feature name * Remove double boosting issue from match * Fix double boosting in match test yaml file * move to bool level for match semantic boost * fix double boosting for sparse vector * fix double boosting for sparse vector in yaml test * fix knn combined query * fix knn combined query * fix sparse combined query * fix knn yaml test for combined query * refactoring unit tests * linting * fix match query unit test * adding copy constructor for match query * refactor copy match builder to intercepter * [CI] Auto commit changes from spotless * fix unit tests * update yaml tests * fix match yaml test * fix yaml tests with 4 digits error margin * unit tests are now more randomized --------- Co-authored-by: Elastic Machine <[email protected]> Co-authored-by: elasticsearchmachine <[email protected]> (cherry picked from commit e2bb47c) # Conflicts: # x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/InferenceFeatures.java
1 parent 59b114c commit 87601ef

File tree

11 files changed

+492
-34
lines changed

11 files changed

+492
-34
lines changed

docs/changelog/129282.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 129282
2+
summary: "Fix query rewrite logic to preserve `boosts` and `queryName` for `match`,\
3+
\ `knn`, and `sparse_vector` queries on semantic_text fields"
4+
area: Search
5+
type: bug
6+
issues: []

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/InferenceFeatures.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ public Set<NodeFeature> getFeatures() {
4545
private static final NodeFeature TEST_RERANKING_SERVICE_PARSE_TEXT_AS_SCORE = new NodeFeature(
4646
"test_reranking_service.parse_text_as_score"
4747
);
48+
private static final NodeFeature SEMANTIC_QUERY_REWRITE_INTERCEPTORS_PROPAGATE_BOOST_AND_QUERY_NAME_FIX = new NodeFeature(
49+
"semantic_query_rewrite_interceptors.propagate_boost_and_query_name_fix"
50+
);
4851
private static final NodeFeature SEMANTIC_TEXT_MATCH_ALL_HIGHLIGHTER = new NodeFeature("semantic_text.match_all_highlighter");
4952
private static final NodeFeature COHERE_V2_API = new NodeFeature("inference.cohere.v2");
5053

@@ -74,7 +77,8 @@ public Set<NodeFeature> getTestFeatures() {
7477
SEMANTIC_TEXT_MATCH_ALL_HIGHLIGHTER,
7578
SEMANTIC_TEXT_EXCLUDE_SUB_FIELDS_FROM_FIELD_CAPS,
7679
SEMANTIC_TEXT_INDEX_OPTIONS,
77-
COHERE_V2_API
80+
COHERE_V2_API,
81+
SEMANTIC_QUERY_REWRITE_INTERCEPTORS_PROPAGATE_BOOST_AND_QUERY_NAME_FIX
7882
);
7983
}
8084
}

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticKnnVectorQueryRewriteInterceptor.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,20 @@ protected QueryBuilder buildInferenceQuery(QueryBuilder queryBuilder, InferenceI
5252
assert (queryBuilder instanceof KnnVectorQueryBuilder);
5353
KnnVectorQueryBuilder knnVectorQueryBuilder = (KnnVectorQueryBuilder) queryBuilder;
5454
Map<String, List<String>> inferenceIdsIndices = indexInformation.getInferenceIdsIndices();
55+
QueryBuilder finalQueryBuilder;
5556
if (inferenceIdsIndices.size() == 1) {
5657
// Simple case, everything uses the same inference ID
5758
Map.Entry<String, List<String>> inferenceIdIndex = inferenceIdsIndices.entrySet().iterator().next();
5859
String searchInferenceId = inferenceIdIndex.getKey();
5960
List<String> indices = inferenceIdIndex.getValue();
60-
return buildNestedQueryFromKnnVectorQuery(knnVectorQueryBuilder, indices, searchInferenceId);
61+
finalQueryBuilder = buildNestedQueryFromKnnVectorQuery(knnVectorQueryBuilder, indices, searchInferenceId);
6162
} else {
6263
// Multiple inference IDs, construct a boolean query
63-
return buildInferenceQueryWithMultipleInferenceIds(knnVectorQueryBuilder, inferenceIdsIndices);
64+
finalQueryBuilder = buildInferenceQueryWithMultipleInferenceIds(knnVectorQueryBuilder, inferenceIdsIndices);
6465
}
66+
finalQueryBuilder.boost(queryBuilder.boost());
67+
finalQueryBuilder.queryName(queryBuilder.queryName());
68+
return finalQueryBuilder;
6569
}
6670

6771
private QueryBuilder buildInferenceQueryWithMultipleInferenceIds(
@@ -102,6 +106,8 @@ protected QueryBuilder buildCombinedInferenceAndNonInferenceQuery(
102106
)
103107
);
104108
}
109+
boolQueryBuilder.boost(queryBuilder.boost());
110+
boolQueryBuilder.queryName(queryBuilder.queryName());
105111
return boolQueryBuilder;
106112
}
107113

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticMatchQueryRewriteInterceptor.java

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ protected String getQuery(QueryBuilder queryBuilder) {
3636

3737
@Override
3838
protected QueryBuilder buildInferenceQuery(QueryBuilder queryBuilder, InferenceIndexInformationForField indexInformation) {
39-
return new SemanticQueryBuilder(indexInformation.fieldName(), getQuery(queryBuilder), false);
39+
SemanticQueryBuilder semanticQueryBuilder = new SemanticQueryBuilder(indexInformation.fieldName(), getQuery(queryBuilder), false);
40+
semanticQueryBuilder.boost(queryBuilder.boost());
41+
semanticQueryBuilder.queryName(queryBuilder.queryName());
42+
return semanticQueryBuilder;
4043
}
4144

4245
@Override
@@ -45,7 +48,10 @@ protected QueryBuilder buildCombinedInferenceAndNonInferenceQuery(
4548
InferenceIndexInformationForField indexInformation
4649
) {
4750
assert (queryBuilder instanceof MatchQueryBuilder);
48-
MatchQueryBuilder matchQueryBuilder = (MatchQueryBuilder) queryBuilder;
51+
MatchQueryBuilder originalMatchQueryBuilder = (MatchQueryBuilder) queryBuilder;
52+
// Create a copy for non-inference fields without boost and _name
53+
MatchQueryBuilder matchQueryBuilder = copyMatchQueryBuilder(originalMatchQueryBuilder);
54+
4955
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
5056
boolQueryBuilder.should(
5157
createSemanticSubQuery(
@@ -55,11 +61,33 @@ protected QueryBuilder buildCombinedInferenceAndNonInferenceQuery(
5561
)
5662
);
5763
boolQueryBuilder.should(createSubQueryForIndices(indexInformation.nonInferenceIndices(), matchQueryBuilder));
64+
boolQueryBuilder.boost(queryBuilder.boost());
65+
boolQueryBuilder.queryName(queryBuilder.queryName());
5866
return boolQueryBuilder;
5967
}
6068

6169
@Override
6270
public String getQueryName() {
6371
return MatchQueryBuilder.NAME;
6472
}
73+
74+
private MatchQueryBuilder copyMatchQueryBuilder(MatchQueryBuilder queryBuilder) {
75+
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder(queryBuilder.fieldName(), queryBuilder.value());
76+
matchQueryBuilder.operator(queryBuilder.operator());
77+
matchQueryBuilder.prefixLength(queryBuilder.prefixLength());
78+
matchQueryBuilder.maxExpansions(queryBuilder.maxExpansions());
79+
matchQueryBuilder.fuzzyTranspositions(queryBuilder.fuzzyTranspositions());
80+
matchQueryBuilder.lenient(queryBuilder.lenient());
81+
matchQueryBuilder.zeroTermsQuery(queryBuilder.zeroTermsQuery());
82+
matchQueryBuilder.analyzer(queryBuilder.analyzer());
83+
matchQueryBuilder.minimumShouldMatch(queryBuilder.minimumShouldMatch());
84+
matchQueryBuilder.fuzzyRewrite(queryBuilder.fuzzyRewrite());
85+
86+
if (queryBuilder.fuzziness() != null) {
87+
matchQueryBuilder.fuzziness(queryBuilder.fuzziness());
88+
}
89+
90+
matchQueryBuilder.autoGenerateSynonymsPhraseQuery(queryBuilder.autoGenerateSynonymsPhraseQuery());
91+
return matchQueryBuilder;
92+
}
6593
}

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticSparseVectorQueryRewriteInterceptor.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,18 @@ protected String getQuery(QueryBuilder queryBuilder) {
4343
@Override
4444
protected QueryBuilder buildInferenceQuery(QueryBuilder queryBuilder, InferenceIndexInformationForField indexInformation) {
4545
Map<String, List<String>> inferenceIdsIndices = indexInformation.getInferenceIdsIndices();
46+
QueryBuilder finalQueryBuilder;
4647
if (inferenceIdsIndices.size() == 1) {
4748
// Simple case, everything uses the same inference ID
4849
String searchInferenceId = inferenceIdsIndices.keySet().iterator().next();
49-
return buildNestedQueryFromSparseVectorQuery(queryBuilder, searchInferenceId);
50+
finalQueryBuilder = buildNestedQueryFromSparseVectorQuery(queryBuilder, searchInferenceId);
5051
} else {
5152
// Multiple inference IDs, construct a boolean query
52-
return buildInferenceQueryWithMultipleInferenceIds(queryBuilder, inferenceIdsIndices);
53+
finalQueryBuilder = buildInferenceQueryWithMultipleInferenceIds(queryBuilder, inferenceIdsIndices);
5354
}
55+
finalQueryBuilder.queryName(queryBuilder.queryName());
56+
finalQueryBuilder.boost(queryBuilder.boost());
57+
return finalQueryBuilder;
5458
}
5559

5660
private QueryBuilder buildInferenceQueryWithMultipleInferenceIds(
@@ -79,7 +83,19 @@ protected QueryBuilder buildCombinedInferenceAndNonInferenceQuery(
7983
Map<String, List<String>> inferenceIdsIndices = indexInformation.getInferenceIdsIndices();
8084

8185
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
82-
boolQueryBuilder.should(createSubQueryForIndices(indexInformation.nonInferenceIndices(), sparseVectorQueryBuilder));
86+
boolQueryBuilder.should(
87+
createSubQueryForIndices(
88+
indexInformation.nonInferenceIndices(),
89+
new SparseVectorQueryBuilder(
90+
sparseVectorQueryBuilder.getFieldName(),
91+
sparseVectorQueryBuilder.getQueryVectors(),
92+
sparseVectorQueryBuilder.getInferenceId(),
93+
sparseVectorQueryBuilder.getQuery(),
94+
sparseVectorQueryBuilder.shouldPruneTokens(),
95+
sparseVectorQueryBuilder.getTokenPruningConfig()
96+
)
97+
)
98+
);
8399
// We always perform nested subqueries on semantic_text fields, to support
84100
// sparse_vector queries using query vectors.
85101
for (String inferenceId : inferenceIdsIndices.keySet()) {
@@ -90,6 +106,8 @@ protected QueryBuilder buildCombinedInferenceAndNonInferenceQuery(
90106
)
91107
);
92108
}
109+
boolQueryBuilder.boost(queryBuilder.boost());
110+
boolQueryBuilder.queryName(queryBuilder.queryName());
93111
return boolQueryBuilder;
94112
}
95113

x-pack/plugin/inference/src/test/java/org/elasticsearch/index/query/SemanticKnnVectorQueryRewriteInterceptorTests.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ public void testKnnQueryWithVectorBuilderIsInterceptedAndRewritten() throws IOEx
6161
QueryRewriteContext context = createQueryRewriteContext(inferenceFields);
6262
QueryVectorBuilder queryVectorBuilder = new TextEmbeddingQueryVectorBuilder(INFERENCE_ID, QUERY);
6363
KnnVectorQueryBuilder original = new KnnVectorQueryBuilder(FIELD_NAME, queryVectorBuilder, 10, 100, null);
64+
if (randomBoolean()) {
65+
float boost = randomFloatBetween(1, 10, randomBoolean());
66+
original.boost(boost);
67+
}
68+
if (randomBoolean()) {
69+
String queryName = randomAlphaOfLength(5);
70+
original.queryName(queryName);
71+
}
6472
testRewrittenInferenceQuery(context, original);
6573
}
6674

@@ -72,6 +80,14 @@ public void testKnnWithQueryBuilderWithoutInferenceIdIsInterceptedAndRewritten()
7280
QueryRewriteContext context = createQueryRewriteContext(inferenceFields);
7381
QueryVectorBuilder queryVectorBuilder = new TextEmbeddingQueryVectorBuilder(null, QUERY);
7482
KnnVectorQueryBuilder original = new KnnVectorQueryBuilder(FIELD_NAME, queryVectorBuilder, 10, 100, null);
83+
if (randomBoolean()) {
84+
float boost = randomFloatBetween(1, 10, randomBoolean());
85+
original.boost(boost);
86+
}
87+
if (randomBoolean()) {
88+
String queryName = randomAlphaOfLength(5);
89+
original.queryName(queryName);
90+
}
7591
testRewrittenInferenceQuery(context, original);
7692
}
7793

@@ -82,14 +98,23 @@ private void testRewrittenInferenceQuery(QueryRewriteContext context, KnnVectorQ
8298
rewritten instanceof InterceptedQueryBuilderWrapper
8399
);
84100
InterceptedQueryBuilderWrapper intercepted = (InterceptedQueryBuilderWrapper) rewritten;
101+
assertEquals(original.boost(), intercepted.boost(), 0.0f);
102+
assertEquals(original.queryName(), intercepted.queryName());
85103
assertTrue(intercepted.queryBuilder instanceof NestedQueryBuilder);
104+
86105
NestedQueryBuilder nestedQueryBuilder = (NestedQueryBuilder) intercepted.queryBuilder;
106+
assertEquals(original.boost(), nestedQueryBuilder.boost(), 0.0f);
107+
assertEquals(original.queryName(), nestedQueryBuilder.queryName());
87108
assertEquals(SemanticTextField.getChunksFieldName(FIELD_NAME), nestedQueryBuilder.path());
109+
88110
QueryBuilder innerQuery = nestedQueryBuilder.query();
89111
assertTrue(innerQuery instanceof KnnVectorQueryBuilder);
90112
KnnVectorQueryBuilder knnVectorQueryBuilder = (KnnVectorQueryBuilder) innerQuery;
113+
assertEquals(1.0f, knnVectorQueryBuilder.boost(), 0.0f);
114+
assertNull(knnVectorQueryBuilder.queryName());
91115
assertEquals(SemanticTextField.getEmbeddingsFieldName(FIELD_NAME), knnVectorQueryBuilder.getFieldName());
92116
assertTrue(knnVectorQueryBuilder.queryVectorBuilder() instanceof TextEmbeddingQueryVectorBuilder);
117+
93118
TextEmbeddingQueryVectorBuilder textEmbeddingQueryVectorBuilder = (TextEmbeddingQueryVectorBuilder) knnVectorQueryBuilder
94119
.queryVectorBuilder();
95120
assertEquals(QUERY, textEmbeddingQueryVectorBuilder.getModelText());

x-pack/plugin/inference/src/test/java/org/elasticsearch/index/query/SemanticMatchQueryRewriteInterceptorTests.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ public class SemanticMatchQueryRewriteInterceptorTests extends ESTestCase {
3636

3737
private static final String FIELD_NAME = "fieldName";
3838
private static final String VALUE = "value";
39+
private static final String QUERY_NAME = "match_query";
40+
private static final float BOOST = 5.0f;
3941

4042
@Before
4143
public void setup() {
@@ -79,6 +81,29 @@ public void testMatchQueryOnNonInferenceFieldRemainsMatchQuery() throws IOExcept
7981
assertEquals(original, rewritten);
8082
}
8183

84+
public void testBoostAndQueryNameInMatchQueryRewrite() throws IOException {
85+
Map<String, InferenceFieldMetadata> inferenceFields = Map.of(
86+
FIELD_NAME,
87+
new InferenceFieldMetadata(index.getName(), "inferenceId", new String[] { FIELD_NAME }, null)
88+
);
89+
QueryRewriteContext context = createQueryRewriteContext(inferenceFields);
90+
QueryBuilder original = createTestQueryBuilder();
91+
original.boost(BOOST);
92+
original.queryName(QUERY_NAME);
93+
QueryBuilder rewritten = original.rewrite(context);
94+
assertTrue(
95+
"Expected query to be intercepted, but was [" + rewritten.getClass().getName() + "]",
96+
rewritten instanceof InterceptedQueryBuilderWrapper
97+
);
98+
InterceptedQueryBuilderWrapper intercepted = (InterceptedQueryBuilderWrapper) rewritten;
99+
assertEquals(BOOST, intercepted.boost(), 0.0f);
100+
assertEquals(QUERY_NAME, intercepted.queryName());
101+
assertTrue(intercepted.queryBuilder instanceof SemanticQueryBuilder);
102+
SemanticQueryBuilder semanticQueryBuilder = (SemanticQueryBuilder) intercepted.queryBuilder;
103+
assertEquals(FIELD_NAME, semanticQueryBuilder.getFieldName());
104+
assertEquals(VALUE, semanticQueryBuilder.getQuery());
105+
}
106+
82107
private MatchQueryBuilder createTestQueryBuilder() {
83108
return new MatchQueryBuilder(FIELD_NAME, VALUE);
84109
}

x-pack/plugin/inference/src/test/java/org/elasticsearch/index/query/SemanticSparseVectorQueryRewriteInterceptorTests.java

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -58,21 +58,15 @@ public void testSparseVectorQueryOnInferenceFieldIsInterceptedAndRewritten() thr
5858
);
5959
QueryRewriteContext context = createQueryRewriteContext(inferenceFields);
6060
QueryBuilder original = new SparseVectorQueryBuilder(FIELD_NAME, INFERENCE_ID, QUERY);
61-
QueryBuilder rewritten = original.rewrite(context);
62-
assertTrue(
63-
"Expected query to be intercepted, but was [" + rewritten.getClass().getName() + "]",
64-
rewritten instanceof InterceptedQueryBuilderWrapper
65-
);
66-
InterceptedQueryBuilderWrapper intercepted = (InterceptedQueryBuilderWrapper) rewritten;
67-
assertTrue(intercepted.queryBuilder instanceof NestedQueryBuilder);
68-
NestedQueryBuilder nestedQueryBuilder = (NestedQueryBuilder) intercepted.queryBuilder;
69-
assertEquals(SemanticTextField.getChunksFieldName(FIELD_NAME), nestedQueryBuilder.path());
70-
QueryBuilder innerQuery = nestedQueryBuilder.query();
71-
assertTrue(innerQuery instanceof SparseVectorQueryBuilder);
72-
SparseVectorQueryBuilder sparseVectorQueryBuilder = (SparseVectorQueryBuilder) innerQuery;
73-
assertEquals(SemanticTextField.getEmbeddingsFieldName(FIELD_NAME), sparseVectorQueryBuilder.getFieldName());
74-
assertEquals(INFERENCE_ID, sparseVectorQueryBuilder.getInferenceId());
75-
assertEquals(QUERY, sparseVectorQueryBuilder.getQuery());
61+
if (randomBoolean()) {
62+
float boost = randomFloatBetween(1, 10, randomBoolean());
63+
original.boost(boost);
64+
}
65+
if (randomBoolean()) {
66+
String queryName = randomAlphaOfLength(5);
67+
original.queryName(queryName);
68+
}
69+
testRewrittenInferenceQuery(context, original);
7670
}
7771

7872
public void testSparseVectorQueryOnInferenceFieldWithoutInferenceIdIsInterceptedAndRewritten() throws IOException {
@@ -82,32 +76,52 @@ public void testSparseVectorQueryOnInferenceFieldWithoutInferenceIdIsIntercepted
8276
);
8377
QueryRewriteContext context = createQueryRewriteContext(inferenceFields);
8478
QueryBuilder original = new SparseVectorQueryBuilder(FIELD_NAME, null, QUERY);
79+
if (randomBoolean()) {
80+
float boost = randomFloatBetween(1, 10, randomBoolean());
81+
original.boost(boost);
82+
}
83+
if (randomBoolean()) {
84+
String queryName = randomAlphaOfLength(5);
85+
original.queryName(queryName);
86+
}
87+
testRewrittenInferenceQuery(context, original);
88+
}
89+
90+
public void testSparseVectorQueryOnNonInferenceFieldRemainsUnchanged() throws IOException {
91+
QueryRewriteContext context = createQueryRewriteContext(Map.of()); // No inference fields
92+
QueryBuilder original = new SparseVectorQueryBuilder(FIELD_NAME, INFERENCE_ID, QUERY);
93+
QueryBuilder rewritten = original.rewrite(context);
94+
assertTrue(
95+
"Expected query to remain sparse_vector but was [" + rewritten.getClass().getName() + "]",
96+
rewritten instanceof SparseVectorQueryBuilder
97+
);
98+
assertEquals(original, rewritten);
99+
}
100+
101+
private void testRewrittenInferenceQuery(QueryRewriteContext context, QueryBuilder original) throws IOException {
85102
QueryBuilder rewritten = original.rewrite(context);
86103
assertTrue(
87104
"Expected query to be intercepted, but was [" + rewritten.getClass().getName() + "]",
88105
rewritten instanceof InterceptedQueryBuilderWrapper
89106
);
90107
InterceptedQueryBuilderWrapper intercepted = (InterceptedQueryBuilderWrapper) rewritten;
108+
assertEquals(original.boost(), intercepted.boost(), 0.0f);
109+
assertEquals(original.queryName(), intercepted.queryName());
110+
91111
assertTrue(intercepted.queryBuilder instanceof NestedQueryBuilder);
92112
NestedQueryBuilder nestedQueryBuilder = (NestedQueryBuilder) intercepted.queryBuilder;
93113
assertEquals(SemanticTextField.getChunksFieldName(FIELD_NAME), nestedQueryBuilder.path());
114+
assertEquals(original.boost(), nestedQueryBuilder.boost(), 0.0f);
115+
assertEquals(original.queryName(), nestedQueryBuilder.queryName());
116+
94117
QueryBuilder innerQuery = nestedQueryBuilder.query();
95118
assertTrue(innerQuery instanceof SparseVectorQueryBuilder);
96119
SparseVectorQueryBuilder sparseVectorQueryBuilder = (SparseVectorQueryBuilder) innerQuery;
97120
assertEquals(SemanticTextField.getEmbeddingsFieldName(FIELD_NAME), sparseVectorQueryBuilder.getFieldName());
98121
assertEquals(INFERENCE_ID, sparseVectorQueryBuilder.getInferenceId());
99122
assertEquals(QUERY, sparseVectorQueryBuilder.getQuery());
100-
}
101-
102-
public void testSparseVectorQueryOnNonInferenceFieldRemainsUnchanged() throws IOException {
103-
QueryRewriteContext context = createQueryRewriteContext(Map.of()); // No inference fields
104-
QueryBuilder original = new SparseVectorQueryBuilder(FIELD_NAME, INFERENCE_ID, QUERY);
105-
QueryBuilder rewritten = original.rewrite(context);
106-
assertTrue(
107-
"Expected query to remain sparse_vector but was [" + rewritten.getClass().getName() + "]",
108-
rewritten instanceof SparseVectorQueryBuilder
109-
);
110-
assertEquals(original, rewritten);
123+
assertEquals(1.0f, sparseVectorQueryBuilder.boost(), 0.0f);
124+
assertNull(sparseVectorQueryBuilder.queryName());
111125
}
112126

113127
private QueryRewriteContext createQueryRewriteContext(Map<String, InferenceFieldMetadata> inferenceFields) {

0 commit comments

Comments
 (0)