Skip to content

Commit 96d2987

Browse files
committed
Remove forbidden API
1 parent bbc7081 commit 96d2987

File tree

2 files changed

+71
-65
lines changed

2 files changed

+71
-65
lines changed

lucene/core/src/java/org/apache/lucene/search/TwoPhaseKnnVectorQuery.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.apache.lucene.index.FieldInfo;
2323
import org.apache.lucene.index.FloatVectorValues;
2424
import org.apache.lucene.index.LeafReaderContext;
25+
import org.apache.lucene.util.ArrayUtil;
2526

2627
public class TwoPhaseKnnVectorQuery extends KnnFloatVectorQuery {
2728

@@ -75,7 +76,9 @@ protected TopDocs getLeafResults(
7576
Arrays.sort(results.scoreDocs, (a, b) -> Float.compare(b.score, a.score));
7677

7778
// Select the top-k ScoreDocs after re-ranking
78-
ScoreDoc[] topKDocs = Arrays.copyOfRange(results.scoreDocs, 0, originalK);
79+
ScoreDoc[] topKDocs = ArrayUtil.copyOfSubArray(results.scoreDocs, 0, originalK);
80+
81+
assert topKDocs.length == originalK;
7982

8083
return new TopDocs(results.totalHits, topKDocs);
8184
}
Lines changed: 67 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package org.apache.lucene.search;
22

3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import java.util.Random;
36
import org.apache.lucene.codecs.FilterCodec;
47
import org.apache.lucene.codecs.KnnVectorsFormat;
58
import org.apache.lucene.codecs.lucene100.Lucene100Codec;
@@ -19,84 +22,84 @@
1922
import org.junit.Before;
2023
import org.junit.Test;
2124

22-
import java.util.HashMap;
23-
import java.util.Map;
24-
import java.util.Random;
25-
2625
public class TestTwoPhaseKnnVectorQuery {
2726

28-
private static final String FIELD = "vector";
29-
public static final VectorSimilarityFunction VECTOR_SIMILARITY_FUNCTION = VectorSimilarityFunction.COSINE;
30-
private Directory directory;
31-
private IndexWriterConfig config;
32-
private static final int NUM_VECTORS = 1000;
33-
private static final int VECTOR_DIMENSION = 128;
27+
private static final String FIELD = "vector";
28+
public static final VectorSimilarityFunction VECTOR_SIMILARITY_FUNCTION =
29+
VectorSimilarityFunction.COSINE;
30+
private Directory directory;
31+
private IndexWriterConfig config;
32+
private static final int NUM_VECTORS = 1000;
33+
private static final int VECTOR_DIMENSION = 128;
3434

35-
@Before
36-
public void setUp() throws Exception {
37-
directory = new ByteBuffersDirectory();
35+
@Before
36+
public void setUp() throws Exception {
37+
directory = new ByteBuffersDirectory();
3838

39-
// Set up the IndexWriterConfig to use quantized vector storage
40-
config = new IndexWriterConfig();
41-
config.setCodec(new QuantizedCodec());
42-
}
39+
// Set up the IndexWriterConfig to use quantized vector storage
40+
config = new IndexWriterConfig();
41+
config.setCodec(new QuantizedCodec());
42+
}
4343

44-
@Test
45-
public void testTwoPhaseKnnVectorQuery() throws Exception {
46-
Map<Integer, float[]> vectors = new HashMap<>();
44+
@Test
45+
public void testTwoPhaseKnnVectorQuery() throws Exception {
46+
Map<Integer, float[]> vectors = new HashMap<>();
4747

48-
// Step 1: Index random vectors in quantized format
49-
try (IndexWriter writer = new IndexWriter(directory, config)) {
50-
Random random = new Random();
51-
for (int i = 0; i < NUM_VECTORS; i++) {
52-
float[] vector = randomFloatVector(VECTOR_DIMENSION, random);
53-
Document doc = new Document();
54-
doc.add(new IntField("id", i, Field.Store.YES));
55-
doc.add(new KnnFloatVectorField(FIELD, vector, VECTOR_SIMILARITY_FUNCTION));
56-
writer.addDocument(doc);
57-
vectors.put(i, vector);
58-
}
59-
}
48+
// Step 1: Index random vectors in quantized format
49+
try (IndexWriter writer = new IndexWriter(directory, config)) {
50+
Random random = new Random();
51+
for (int i = 0; i < NUM_VECTORS; i++) {
52+
float[] vector = randomFloatVector(VECTOR_DIMENSION, random);
53+
Document doc = new Document();
54+
doc.add(new IntField("id", i, Field.Store.YES));
55+
doc.add(new KnnFloatVectorField(FIELD, vector, VECTOR_SIMILARITY_FUNCTION));
56+
writer.addDocument(doc);
57+
vectors.put(i, vector);
58+
}
59+
}
6060

61-
// Step 2: Run TwoPhaseKnnVectorQuery with a random target vector
62-
try (IndexReader reader = DirectoryReader.open(directory)) {
63-
IndexSearcher searcher = new IndexSearcher(reader);
64-
float[] targetVector = randomFloatVector(VECTOR_DIMENSION, new Random());
65-
int k = 10;
66-
double oversample = 1.0;
61+
// Step 2: Run TwoPhaseKnnVectorQuery with a random target vector
62+
try (IndexReader reader = DirectoryReader.open(directory)) {
63+
IndexSearcher searcher = new IndexSearcher(reader);
64+
float[] targetVector = randomFloatVector(VECTOR_DIMENSION, new Random());
65+
int k = 10;
66+
double oversample = 1.0;
6767

68-
TwoPhaseKnnVectorQuery query = new TwoPhaseKnnVectorQuery(FIELD, targetVector, k, oversample, null);
69-
TopDocs topDocs = searcher.search(query, k);
68+
TwoPhaseKnnVectorQuery query =
69+
new TwoPhaseKnnVectorQuery(FIELD, targetVector, k, oversample, null);
70+
TopDocs topDocs = searcher.search(query, k);
7071

71-
// Step 3: Verify that TopDocs scores match similarity with unquantized vectors
72-
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
73-
Document retrievedDoc = searcher.storedFields().document(scoreDoc.doc);
74-
float[] docVector = vectors.get(retrievedDoc.getField("id").numericValue().intValue());
75-
float expectedScore = VECTOR_SIMILARITY_FUNCTION.compare(targetVector, docVector);
76-
Assert.assertEquals(
77-
"Score does not match expected similarity for docId: " + scoreDoc.doc,
78-
expectedScore, scoreDoc.score, 1e-5);
79-
}
80-
}
72+
// Step 3: Verify that TopDocs scores match similarity with unquantized vectors
73+
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
74+
Document retrievedDoc = searcher.storedFields().document(scoreDoc.doc);
75+
float[] docVector = vectors.get(retrievedDoc.getField("id").numericValue().intValue());
76+
float expectedScore = VECTOR_SIMILARITY_FUNCTION.compare(targetVector, docVector);
77+
Assert.assertEquals(
78+
"Score does not match expected similarity for docId: " + scoreDoc.doc,
79+
expectedScore,
80+
scoreDoc.score,
81+
1e-5);
82+
}
8183
}
84+
}
8285

83-
private float[] randomFloatVector(int dimension, Random random) {
84-
float[] vector = new float[dimension];
85-
for (int i = 0; i < dimension; i++) {
86-
vector[i] = random.nextFloat();
87-
}
88-
return vector;
86+
private float[] randomFloatVector(int dimension, Random random) {
87+
float[] vector = new float[dimension];
88+
for (int i = 0; i < dimension; i++) {
89+
vector[i] = random.nextFloat();
8990
}
91+
return vector;
92+
}
9093

91-
public static class QuantizedCodec extends FilterCodec {
94+
public static class QuantizedCodec extends FilterCodec {
9295

93-
public QuantizedCodec() {
94-
super("QuantizedCodec", new Lucene100Codec());
95-
}
96+
public QuantizedCodec() {
97+
super("QuantizedCodec", new Lucene100Codec());
98+
}
9699

97-
@Override
98-
public KnnVectorsFormat knnVectorsFormat() {
99-
return new Lucene99HnswScalarQuantizedVectorsFormat();
100-
}
100+
@Override
101+
public KnnVectorsFormat knnVectorsFormat() {
102+
return new Lucene99HnswScalarQuantizedVectorsFormat();
101103
}
104+
}
102105
}

0 commit comments

Comments
 (0)