Skip to content

Commit df80e2e

Browse files
authored
Fix knn search error when dimensions are not set (#131081) (#131120)
* Unmute tests muted in #129550 as they were fixed in #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 2bbb699 commit df80e2e

File tree

4 files changed

+47
-1
lines changed

4 files changed

+47
-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
@@ -621,3 +621,36 @@ setup:
621621
properties:
622622
embedding:
623623
type: dense_vector
624+
625+
626+
---
627+
"Searching with no data dimensions specified":
628+
- requires:
629+
cluster_features: "search.vectors.no_dimensions_bugfix"
630+
reason: "Search with no dimensions bugfix"
631+
632+
- do:
633+
indices.create:
634+
index: empty-test
635+
body:
636+
mappings:
637+
properties:
638+
vector:
639+
type: dense_vector
640+
index: true
641+
642+
- do:
643+
search:
644+
index: empty-test
645+
body:
646+
fields: [ "name" ]
647+
knn:
648+
field: vector
649+
query_vector: [ -0.5, 90.0, -10, 14.8, -156.0 ]
650+
k: 3
651+
num_candidates: 3
652+
rescore_vector:
653+
oversample: 1.5
654+
similarity: 0.1
655+
656+
- 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
@@ -30,6 +30,7 @@
3030
import org.apache.lucene.index.VectorEncoding;
3131
import org.apache.lucene.index.VectorSimilarityFunction;
3232
import org.apache.lucene.search.FieldExistsQuery;
33+
import org.apache.lucene.search.MatchNoDocsQuery;
3334
import org.apache.lucene.search.Query;
3435
import org.apache.lucene.search.join.BitSetProducer;
3536
import org.apache.lucene.util.BitUtil;
@@ -2216,6 +2217,9 @@ public Query createKnnQuery(
22162217
"to perform knn search on field [" + name() + "], its mapping must have [index] set to [true]"
22172218
);
22182219
}
2220+
if (dims == null) {
2221+
return new MatchNoDocsQuery("No data has been indexed for field [" + name() + "]");
2222+
}
22192223
return switch (getElementType()) {
22202224
case BYTE -> createKnnByteQuery(queryVector.asByteVector(), k, numCands, filter, similarityThreshold, parentFilter);
22212225
case FLOAT -> createKnnFloatQuery(

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@ public Set<NodeFeature> getFeatures() {
2525
public static final NodeFeature COMPLETION_FIELD_SUPPORTS_DUPLICATE_SUGGESTIONS = new NodeFeature(
2626
"search.completion_field.duplicate.support"
2727
);
28+
public static final NodeFeature RESCORER_MISSING_FIELD_BAD_REQUEST = new NodeFeature("search.rescorer.missing.field.bad.request");
2829
public static final NodeFeature INT_SORT_FOR_INT_SHORT_BYTE_FIELDS = new NodeFeature("search.sort.int_sort_for_int_short_byte_fields");
2930
static final NodeFeature MULTI_MATCH_CHECKS_POSITIONS = new NodeFeature("search.multi.match.checks.positions");
3031
private static final NodeFeature KNN_QUERY_BUGFIX_130254 = new NodeFeature("search.knn.query.bugfix.130254", true);
32+
public static final NodeFeature SEARCH_WITH_NO_DIMENSIONS_BUGFIX = new NodeFeature("search.vectors.no_dimensions_bugfix");
3133

3234
@Override
3335
public Set<NodeFeature> getTestFeatures() {
@@ -36,7 +38,8 @@ public Set<NodeFeature> getTestFeatures() {
3638
COMPLETION_FIELD_SUPPORTS_DUPLICATE_SUGGESTIONS,
3739
INT_SORT_FOR_INT_SHORT_BYTE_FIELDS,
3840
MULTI_MATCH_CHECKS_POSITIONS,
39-
KNN_QUERY_BUGFIX_130254
41+
KNN_QUERY_BUGFIX_130254,
42+
SEARCH_WITH_NO_DIMENSIONS_BUGFIX
4043
);
4144
}
4245
}

0 commit comments

Comments
 (0)