Skip to content

Commit 9e40cd4

Browse files
committed
Fixed BlockDocValuesReader to work with all dense_vector types
1 parent c7e48a0 commit 9e40cd4

File tree

3 files changed

+37
-14
lines changed

3 files changed

+37
-14
lines changed

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.apache.lucene.index.BinaryDocValues;
1313
import org.apache.lucene.index.DocValues;
1414
import org.apache.lucene.index.FloatVectorValues;
15+
import org.apache.lucene.index.KnnVectorValues;
1516
import org.apache.lucene.index.LeafReaderContext;
1617
import org.apache.lucene.index.NumericDocValues;
1718
import org.apache.lucene.index.SortedDocValues;
@@ -529,18 +530,19 @@ public AllReader reader(LeafReaderContext context) throws IOException {
529530

530531
private static class FloatVectorValuesBlockReader extends BlockDocValuesReader {
531532
private final FloatVectorValues floatVectorValues;
532-
private int docId = -1;
533+
private final KnnVectorValues.DocIndexIterator iterator;
533534

534535
FloatVectorValuesBlockReader(FloatVectorValues floatVectorValues) {
535536
this.floatVectorValues = floatVectorValues;
537+
iterator = floatVectorValues.iterator();
536538
}
537539

538540
@Override
539541
public BlockLoader.Block read(BlockFactory factory, Docs docs) throws IOException {
540542
try (BlockLoader.DoubleBuilder builder = factory.doubles(docs.count())) {
541543
for (int i = 0; i < docs.count(); i++) {
542544
int doc = docs.get(i);
543-
if (doc < docId) {
545+
if (doc < iterator.docID()) {
544546
throw new IllegalStateException("docs within same block must be in order");
545547
}
546548
read(doc, builder);
@@ -555,22 +557,21 @@ public void read(int docId, BlockLoader.StoredFields storedFields, Builder build
555557
}
556558

557559
private void read(int doc, DoubleBuilder builder) throws IOException {
558-
float[] floats = floatVectorValues.vectorValue(doc);
559-
if (floats != null) {
560+
if (iterator.advance(doc) == doc) {
560561
builder.beginPositionEntry();
562+
float[] floats = floatVectorValues.vectorValue(iterator.index());
561563
for (float aFloat : floats) {
562564
builder.appendDouble(aFloat);
563565
}
564566
builder.endPositionEntry();
565567
} else {
566568
builder.appendNull();
567569
}
568-
docId = doc;
569570
}
570571

571572
@Override
572573
public int docId() {
573-
return docId;
574+
return iterator.docID();
574575
}
575576

576577
@Override

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import org.apache.lucene.search.join.BitSetProducer;
3636
import org.apache.lucene.util.BitUtil;
3737
import org.apache.lucene.util.BytesRef;
38-
import org.apache.lucene.util.NumericUtils;
3938
import org.apache.lucene.util.VectorUtil;
4039
import org.elasticsearch.common.ParsingException;
4140
import org.elasticsearch.common.xcontent.support.XContentMapValues;
@@ -54,7 +53,6 @@
5453
import org.elasticsearch.index.mapper.ArraySourceValueFetcher;
5554
import org.elasticsearch.index.mapper.BlockDocValuesReader;
5655
import org.elasticsearch.index.mapper.BlockLoader;
57-
import org.elasticsearch.index.mapper.BlockSourceReader;
5856
import org.elasticsearch.index.mapper.DocumentParserContext;
5957
import org.elasticsearch.index.mapper.FieldMapper;
6058
import org.elasticsearch.index.mapper.MappedFieldType;
@@ -2313,8 +2311,6 @@ ElementType getElementType() {
23132311

23142312
@Override
23152313
public BlockLoader blockLoader(MappedFieldType.BlockLoaderContext blContext) {
2316-
// TODO Check synthetic source etc (see NumberFieldMapper)
2317-
23182314
return new BlockDocValuesReader.DenseVectorBlockLoader(name());
23192315
}
23202316
}

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

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,48 @@
77

88
package org.elasticsearch.xpack.esql;
99

10+
import com.carrotsearch.randomizedtesting.annotations.Name;
11+
import com.carrotsearch.randomizedtesting.annotations.ParametersFactory;
12+
1013
import org.elasticsearch.action.bulk.BulkRequestBuilder;
1114
import org.elasticsearch.action.index.IndexRequest;
1215
import org.elasticsearch.action.support.WriteRequest;
1316
import org.elasticsearch.common.settings.Settings;
1417
import org.elasticsearch.xpack.esql.action.AbstractEsqlIntegTestCase;
15-
import org.hamcrest.CoreMatchers;
1618
import org.junit.Before;
1719

1820
import java.util.HashMap;
1921
import java.util.List;
22+
import java.util.Locale;
2023
import java.util.Map;
24+
import java.util.Set;
2125

2226
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
2327

2428
public class DenseVectorFieldTypeIT extends AbstractEsqlIntegTestCase {
2529

30+
private static final Set<String> DENSE_VECTOR_INDEX_TYPES = Set.of(
31+
"int8_hnsw",
32+
"hnsw",
33+
"int4_hnsw",
34+
"bbq_hnsw",
35+
"int8_flat",
36+
"int4_flat",
37+
"bbq_flat",
38+
"flat"
39+
);
40+
41+
private final String indexType;
42+
43+
@ParametersFactory
44+
public static Iterable<Object[]> parameters() throws Exception {
45+
return DENSE_VECTOR_INDEX_TYPES.stream().map(type -> new Object[] { type }).toList();
46+
}
47+
48+
public DenseVectorFieldTypeIT(@Name("indexType") String indexType) {
49+
this.indexType = indexType;
50+
}
51+
2652
private static Map<Integer, List<Float>> DOC_VALUES = new HashMap<>();
2753
static {
2854
DOC_VALUES.put(1, List.of(1.0f, 2.0f, 3.0f));
@@ -80,15 +106,15 @@ public void testSorted() {
80106
public void setup() {
81107
var indexName = "test";
82108
var client = client().admin().indices();
83-
var mapping = """
109+
var mapping = String.format(Locale.ROOT, """
84110
"id": integer,
85111
"vector": {
86112
"type": "dense_vector",
87113
"index_options": {
88-
"type": "hnsw"
114+
"type": "%s"
89115
}
90116
}
91-
""";
117+
""", indexType);
92118
var CreateRequest = client.prepareCreate(indexName)
93119
.setSettings(Settings.builder().put("index.number_of_shards", 1))
94120
.setMapping(mapping);

0 commit comments

Comments
 (0)