Skip to content

Commit f54f17a

Browse files
authored
Fix null values handling for dense vectors (#131808)
1 parent 75ca874 commit f54f17a

File tree

2 files changed

+32
-19
lines changed

2 files changed

+32
-19
lines changed

server/src/main/java/org/elasticsearch/index/mapper/BlockDocValuesReader.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -548,11 +548,7 @@ public BlockLoader.Block read(BlockFactory factory, Docs docs, int offset) throw
548548
// Doubles from doc values ensures that the values are in order
549549
try (BlockLoader.FloatBuilder builder = factory.denseVectors(docs.count() - offset, dimensions)) {
550550
for (int i = offset; i < docs.count(); i++) {
551-
int doc = docs.get(i);
552-
if (doc < iterator.docID()) {
553-
throw new IllegalStateException("docs within same block must be in order");
554-
}
555-
read(doc, builder);
551+
read(docs.get(i), builder);
556552
}
557553
return builder.build();
558554
}
@@ -564,7 +560,9 @@ public void read(int docId, BlockLoader.StoredFields storedFields, Builder build
564560
}
565561

566562
private void read(int doc, BlockLoader.FloatBuilder builder) throws IOException {
567-
if (iterator.advance(doc) == doc) {
563+
if (iterator.docID() > doc) {
564+
builder.appendNull();
565+
} else if (iterator.docID() == doc || iterator.advance(doc) == doc) {
568566
builder.beginPositionEntry();
569567
float[] floats = floatVectorValues.vectorValue(iterator.index());
570568
assert floats.length == dimensions

x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/DenseVectorFieldTypeIT.java

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,14 @@ public void testRetrieveTopNDenseVectorFieldData() {
9494
var values = valuesList.get(id);
9595
assertEquals(id, values.get(0));
9696
List<Float> vectors = (List<Float>) values.get(1);
97-
assertNotNull(vectors);
98-
assertEquals(vector.size(), vectors.size());
99-
for (int i = 0; i < vector.size(); i++) {
100-
assertEquals(vector.get(i), vectors.get(i), 0F);
97+
if (vector == null) {
98+
assertNull(vectors);
99+
} else {
100+
assertNotNull(vectors);
101+
assertEquals(vector.size(), vectors.size());
102+
for (int i = 0; i < vector.size(); i++) {
103+
assertEquals(vector.get(i), vectors.get(i), 0F);
104+
}
101105
}
102106
});
103107
}
@@ -117,12 +121,18 @@ public void testRetrieveDenseVectorFieldData() {
117121
;
118122
assertEquals(2, value.size());
119123
Integer id = (Integer) value.get(0);
120-
List<Float> vector = (List<Float>) value.get(1);
121-
assertNotNull(vector);
122124
List<Float> expectedVector = indexedVectors.get(id);
123-
assertNotNull(expectedVector);
124-
for (int i = 0; i < vector.size(); i++) {
125-
assertEquals(expectedVector.get(i), vector.get(i), 0F);
125+
List<Float> vector = (List<Float>) value.get(1);
126+
if (expectedVector == null) {
127+
assertNull(vector);
128+
} else {
129+
assertNotNull(vector);
130+
assertEquals(expectedVector.size(), vector.size());
131+
assertNotNull(vector);
132+
assertNotNull(expectedVector);
133+
for (int i = 0; i < vector.size(); i++) {
134+
assertEquals(expectedVector.get(i), vector.get(i), 0F);
135+
}
126136
}
127137
});
128138
}
@@ -168,11 +178,16 @@ public void setup() throws IOException {
168178
IndexRequestBuilder[] docs = new IndexRequestBuilder[numDocs];
169179
for (int i = 0; i < numDocs; i++) {
170180
List<Float> vector = new ArrayList<>(numDims);
171-
for (int j = 0; j < numDims; j++) {
172-
vector.add(randomFloat());
181+
if (rarely()) {
182+
docs[i] = prepareIndex("test").setId("" + i).setSource("id", String.valueOf(i));
183+
indexedVectors.put(i, null);
184+
} else {
185+
for (int j = 0; j < numDims; j++) {
186+
vector.add(randomFloat());
187+
}
188+
docs[i] = prepareIndex("test").setId("" + i).setSource("id", String.valueOf(i), "vector", vector);
189+
indexedVectors.put(i, vector);
173190
}
174-
docs[i] = prepareIndex("test").setId("" + i).setSource("id", String.valueOf(i), "vector", vector);
175-
indexedVectors.put(i, vector);
176191
}
177192

178193
indexRandom(true, docs);

0 commit comments

Comments
 (0)