Skip to content

Commit cc45de8

Browse files
committed
Fix knn search error when dimensions are not set (elastic#131081)
* Unmute tests muted in elastic#129550 as they were fixed in elastic#127322 * Return no match when no dimensions have been set * Add tests * Update docs/changelog/131081.yaml (cherry picked from commit bbc4cef) # Conflicts: # server/src/main/java/org/elasticsearch/index/mapper/vectors/DenseVectorFieldMapper.java # server/src/main/java/org/elasticsearch/search/SearchFeatures.java # x-pack/plugin/esql/qa/testFixtures/src/main/resources/knn-function.csv-spec
1 parent d6dfc2c commit cc45de8

File tree

4 files changed

+45
-1
lines changed

4 files changed

+45
-1
lines changed

docs/changelog/131081.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 131081
2+
summary: Fix knn search error when dimensions are not set
3+
area: Vector Search
4+
type: bug
5+
issues:
6+
- 129550

rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search.vectors/40_knn_search.yml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,3 +630,36 @@ setup:
630630
properties:
631631
embedding:
632632
type: dense_vector
633+
634+
635+
---
636+
"Searching with no data dimensions specified":
637+
- requires:
638+
cluster_features: "search.vectors.no_dimensions_bugfix"
639+
reason: "Search with no dimensions bugfix"
640+
641+
- do:
642+
indices.create:
643+
index: empty-test
644+
body:
645+
mappings:
646+
properties:
647+
vector:
648+
type: dense_vector
649+
index: true
650+
651+
- do:
652+
search:
653+
index: empty-test
654+
body:
655+
fields: [ "name" ]
656+
knn:
657+
field: vector
658+
query_vector: [ -0.5, 90.0, -10, 14.8, -156.0 ]
659+
k: 3
660+
num_candidates: 3
661+
rescore_vector:
662+
oversample: 1.5
663+
similarity: 0.1
664+
665+
- match: { hits.total.value: 0 }

server/src/main/java/org/elasticsearch/index/mapper/vectors/DenseVectorFieldMapper.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.apache.lucene.index.VectorEncoding;
3232
import org.apache.lucene.index.VectorSimilarityFunction;
3333
import org.apache.lucene.search.FieldExistsQuery;
34+
import org.apache.lucene.search.MatchNoDocsQuery;
3435
import org.apache.lucene.search.Query;
3536
import org.apache.lucene.search.join.BitSetProducer;
3637
import org.apache.lucene.util.BitUtil;
@@ -2026,6 +2027,9 @@ public Query createKnnQuery(
20262027
"to perform knn search on field [" + name() + "], its mapping must have [index] set to [true]"
20272028
);
20282029
}
2030+
if (dims == null) {
2031+
return new MatchNoDocsQuery("No data has been indexed for field [" + name() + "]");
2032+
}
20292033
return switch (getElementType()) {
20302034
case BYTE -> createKnnByteQuery(queryVector.asByteVector(), k, numCands, filter, similarityThreshold, parentFilter);
20312035
case FLOAT -> createKnnFloatQuery(

server/src/main/java/org/elasticsearch/search/SearchFeatures.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,10 @@ public Set<NodeFeature> getFeatures() {
2525
}
2626

2727
public static final NodeFeature RETRIEVER_RESCORER_ENABLED = new NodeFeature("search.retriever.rescorer.enabled");
28+
public static final NodeFeature SEARCH_WITH_NO_DIMENSIONS_BUGFIX = new NodeFeature("search.vectors.no_dimensions_bugfix");
2829

2930
@Override
3031
public Set<NodeFeature> getTestFeatures() {
31-
return Set.of(RETRIEVER_RESCORER_ENABLED);
32+
return Set.of(RETRIEVER_RESCORER_ENABLED, SEARCH_WITH_NO_DIMENSIONS_BUGFIX);
3233
}
3334
}

0 commit comments

Comments
 (0)