|
23 | 23 | import org.apache.lucene.codecs.FilterCodec; |
24 | 24 | import org.apache.lucene.codecs.KnnVectorsFormat; |
25 | 25 | import org.apache.lucene.codecs.KnnVectorsReader; |
| 26 | +import org.apache.lucene.codecs.lucene99.Lucene99FlatVectorsReader; |
26 | 27 | import org.apache.lucene.codecs.perfield.PerFieldKnnVectorsFormat; |
27 | 28 | import org.apache.lucene.document.Document; |
28 | 29 | import org.apache.lucene.document.Field; |
|
35 | 36 | import org.apache.lucene.index.IndexWriterConfig; |
36 | 37 | import org.apache.lucene.index.KnnVectorValues; |
37 | 38 | import org.apache.lucene.index.LeafReader; |
| 39 | +import org.apache.lucene.index.SegmentReader; |
38 | 40 | import org.apache.lucene.index.SoftDeletesRetentionMergePolicy; |
39 | 41 | import org.apache.lucene.index.Term; |
40 | 42 | import org.apache.lucene.index.VectorSimilarityFunction; |
|
83 | 85 | import static java.lang.String.format; |
84 | 86 | import static org.apache.lucene.index.VectorSimilarityFunction.DOT_PRODUCT; |
85 | 87 | import static org.apache.lucene.search.DocIdSetIterator.NO_MORE_DOCS; |
| 88 | +import static org.hamcrest.Matchers.instanceOf; |
86 | 89 | import static org.hamcrest.Matchers.is; |
87 | 90 | import static org.hamcrest.Matchers.oneOf; |
88 | 91 |
|
@@ -309,6 +312,43 @@ public void testSimpleOffHeapSizeImpl(Directory dir, IndexWriterConfig config, b |
309 | 312 | } |
310 | 313 | } |
311 | 314 |
|
| 315 | + public void testMergeInstance() throws IOException { |
| 316 | + checkDirectIOSupported(); |
| 317 | + float[] vector = randomVector(10); |
| 318 | + VectorSimilarityFunction similarityFunction = randomSimilarity(); |
| 319 | + KnnFloatVectorField knnField = new KnnFloatVectorField("field", vector, similarityFunction); |
| 320 | + try (Directory dir = newFSDirectory()) { |
| 321 | + try (IndexWriter w = new IndexWriter(dir, newIndexWriterConfig().setUseCompoundFile(false))) { |
| 322 | + Document doc = new Document(); |
| 323 | + knnField.setVectorValue(randomVector(10)); |
| 324 | + doc.add(knnField); |
| 325 | + w.addDocument(doc); |
| 326 | + w.commit(); |
| 327 | + |
| 328 | + try (IndexReader reader = DirectoryReader.open(w)) { |
| 329 | + SegmentReader r = (SegmentReader) getOnlyLeafReader(reader); |
| 330 | + assertThat(unwrapRawVectorReader("field", r.getVectorReader()), instanceOf(DirectIOLucene99FlatVectorsReader.class)); |
| 331 | + assertThat( |
| 332 | + unwrapRawVectorReader("field", r.getVectorReader().getMergeInstance()), |
| 333 | + instanceOf(Lucene99FlatVectorsReader.class) |
| 334 | + ); |
| 335 | + } |
| 336 | + } |
| 337 | + } |
| 338 | + } |
| 339 | + |
| 340 | + private static KnnVectorsReader unwrapRawVectorReader(String fieldName, KnnVectorsReader knnReader) { |
| 341 | + if (knnReader instanceof PerFieldKnnVectorsFormat.FieldsReader perField) { |
| 342 | + return unwrapRawVectorReader(fieldName, perField.getFieldReader(fieldName)); |
| 343 | + } else if (knnReader instanceof ES818BinaryQuantizedVectorsReader bbqReader) { |
| 344 | + return unwrapRawVectorReader(fieldName, bbqReader.getRawVectorsReader()); |
| 345 | + } else if (knnReader instanceof MergeReaderWrapper mergeReaderWrapper) { |
| 346 | + return unwrapRawVectorReader(fieldName, mergeReaderWrapper.getMainReader()); |
| 347 | + } else { |
| 348 | + return knnReader; |
| 349 | + } |
| 350 | + } |
| 351 | + |
312 | 352 | static Directory newMMapDirectory() throws IOException { |
313 | 353 | Directory dir = new MMapDirectory(createTempDir("ES818BinaryQuantizedVectorsFormatTests")); |
314 | 354 | if (random().nextBoolean()) { |
|
0 commit comments