Skip to content

Commit ad62101

Browse files
authored
Fix bug where intercepted semantic knn queries did not respect filters (#121410) (#121431)
1 parent 1ecbc79 commit ad62101

File tree

3 files changed

+51
-3
lines changed

3 files changed

+51
-3
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import java.util.Set;
1717

18+
import static org.elasticsearch.xpack.inference.queries.SemanticKnnVectorQueryRewriteInterceptor.SEMANTIC_KNN_FILTER_FIX;
1819
import static org.elasticsearch.xpack.inference.queries.SemanticKnnVectorQueryRewriteInterceptor.SEMANTIC_KNN_VECTOR_QUERY_REWRITE_INTERCEPTION_SUPPORTED;
1920
import static org.elasticsearch.xpack.inference.queries.SemanticMatchQueryRewriteInterceptor.SEMANTIC_MATCH_QUERY_REWRITE_INTERCEPTION_SUPPORTED;
2021
import static org.elasticsearch.xpack.inference.queries.SemanticSparseVectorQueryRewriteInterceptor.SEMANTIC_SPARSE_VECTOR_QUERY_REWRITE_INTERCEPTION_SUPPORTED;
@@ -42,7 +43,8 @@ public Set<NodeFeature> getTestFeatures() {
4243
SEMANTIC_KNN_VECTOR_QUERY_REWRITE_INTERCEPTION_SUPPORTED,
4344
TextSimilarityRankRetrieverBuilder.TEXT_SIMILARITY_RERANKER_ALIAS_HANDLING_FIX,
4445
SemanticInferenceMetadataFieldsMapper.INFERENCE_METADATA_FIELDS_ENABLED_BY_DEFAULT,
45-
SEMANTIC_TEXT_HIGHLIGHTER_DEFAULT
46+
SEMANTIC_TEXT_HIGHLIGHTER_DEFAULT,
47+
SEMANTIC_KNN_FILTER_FIX
4648
);
4749
}
4850
}

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
@@ -28,6 +28,7 @@ public class SemanticKnnVectorQueryRewriteInterceptor extends SemanticQueryRewri
2828
public static final NodeFeature SEMANTIC_KNN_VECTOR_QUERY_REWRITE_INTERCEPTION_SUPPORTED = new NodeFeature(
2929
"search.semantic_knn_vector_query_rewrite_interception_supported"
3030
);
31+
public static final NodeFeature SEMANTIC_KNN_FILTER_FIX = new NodeFeature("search.semantic_knn_filter_fix");
3132

3233
public SemanticKnnVectorQueryRewriteInterceptor() {}
3334

@@ -147,6 +148,7 @@ private KnnVectorQueryBuilder addIndexFilterToKnnVectorQuery(Collection<String>
147148
);
148149
}
149150

151+
copy.addFilterQueries(original.filterQueries());
150152
copy.addFilterQuery(new TermsQueryBuilder(IndexFieldMapper.NAME, indices));
151153
return copy;
152154
}
@@ -165,16 +167,17 @@ private KnnVectorQueryBuilder buildNewKnnVectorQuery(
165167
KnnVectorQueryBuilder original,
166168
QueryVectorBuilder queryVectorBuilder
167169
) {
170+
KnnVectorQueryBuilder newQueryBuilder;
168171
if (original.queryVectorBuilder() != null) {
169-
return new KnnVectorQueryBuilder(
172+
newQueryBuilder = new KnnVectorQueryBuilder(
170173
fieldName,
171174
queryVectorBuilder,
172175
original.k(),
173176
original.numCands(),
174177
original.getVectorSimilarity()
175178
);
176179
} else {
177-
return new KnnVectorQueryBuilder(
180+
newQueryBuilder = new KnnVectorQueryBuilder(
178181
fieldName,
179182
original.queryVector(),
180183
original.k(),
@@ -183,6 +186,9 @@ private KnnVectorQueryBuilder buildNewKnnVectorQuery(
183186
original.getVectorSimilarity()
184187
);
185188
}
189+
190+
newQueryBuilder.addFilterQueries(original.filterQueries());
191+
return newQueryBuilder;
186192
}
187193

188194
@Override

x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/47_semantic_text_knn.yml

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ setup:
4343
body:
4444
mappings:
4545
properties:
46+
keyword_field:
47+
type: keyword
4648
inference_field:
4749
type: semantic_text
4850
inference_id: dense-inference-id
@@ -53,6 +55,8 @@ setup:
5355
body:
5456
mappings:
5557
properties:
58+
keyword_field:
59+
type: keyword
5660
inference_field:
5761
type: semantic_text
5862
inference_id: dense-inference-id-2
@@ -63,6 +67,8 @@ setup:
6367
body:
6468
mappings:
6569
properties:
70+
keyword_field:
71+
type: keyword
6672
inference_field:
6773
type: dense_vector
6874
dims: 10
@@ -74,6 +80,8 @@ setup:
7480
body:
7581
mappings:
7682
properties:
83+
keyword_field:
84+
type: keyword
7785
inference_field:
7886
type: dense_vector
7987
dims: 3
@@ -84,6 +92,7 @@ setup:
8492
index: test-semantic-text-index
8593
id: doc_1
8694
body:
95+
keyword_field: "foo"
8796
inference_field: [ "inference test", "another inference test" ]
8897
refresh: true
8998

@@ -92,6 +101,7 @@ setup:
92101
index: test-semantic-text-index-2
93102
id: doc_2
94103
body:
104+
keyword_field: "bar"
95105
inference_field: [ "inference test", "another inference test" ]
96106
refresh: true
97107

@@ -100,6 +110,7 @@ setup:
100110
index: test-dense-vector-index
101111
id: doc_3
102112
body:
113+
keyword_field: "baz"
103114
inference_field: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
104115
refresh: true
105116

@@ -108,6 +119,7 @@ setup:
108119
index: test-incompatible-dense-vector-index
109120
id: doc_4
110121
body:
122+
keyword_field: "qux"
111123
inference_field: [ 1, 2, 3 ]
112124
refresh: true
113125

@@ -311,6 +323,34 @@ setup:
311323

312324
- match: { hits.total.value: 2 }
313325

326+
---
327+
"knn query respects filters":
328+
- requires:
329+
cluster_features: "search.semantic_knn_filter_fix"
330+
reason: filters fixed in 8.18.0
331+
332+
- do:
333+
search:
334+
index:
335+
- test-semantic-text-index
336+
- test-semantic-text-index-2
337+
body:
338+
query:
339+
knn:
340+
field: inference_field
341+
k: 10
342+
num_candidates: 100
343+
query_vector_builder:
344+
text_embedding:
345+
model_text: test
346+
filter:
347+
term:
348+
keyword_field: "foo"
349+
350+
- match: { hits.total.value: 1 }
351+
- match: { hits.hits.0._id: "doc_1" }
352+
353+
314354

315355
---
316356
"knn query against multiple semantic_text fields with multiple inference IDs specified in semantic_text fields with smaller k returns k for each index":

0 commit comments

Comments
 (0)