Skip to content

Commit d0019c2

Browse files
committed
iter
1 parent ffc9a64 commit d0019c2

File tree

3 files changed

+15
-7
lines changed

3 files changed

+15
-7
lines changed

server/src/main/java/org/elasticsearch/index/codec/vectors/IVFVectorsReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ public final void search(String field, float[] target, KnnCollector knnCollector
236236
// not perfect, but a comparative heuristic.
237237
// TODO: we might want to consider the density of the centroids as experiments shows that for fewer vectors per centroid,
238238
// the least vectors we need to score to get a good recall.
239-
maxVectorVisited = (long) (2.0 * Math.round(Math.log10(numVectors) * Math.log10(numVectors)) * (knnCollector.k()));
239+
maxVectorVisited = Math.round(1.75f * Math.log10(knnCollector.k()) * Math.log10(knnCollector.k()) * (knnCollector.k()));
240240
// clip so we visit at least one vector
241241
maxVectorVisited = Math.max(maxVectorVisited, 1L);
242242
} else {

server/src/main/java/org/elasticsearch/search/vectors/AbstractIVFKnnVectorQuery.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ abstract class AbstractIVFKnnVectorQuery extends Query implements QueryProfilerP
5454
protected final int k;
5555
protected final int numCands;
5656
protected final Query filter;
57-
protected final KnnSearchStrategy searchStrategy;
57+
protected final IVFKnnSearchStrategy searchStrategy;
5858
protected int vectorOpsCount;
5959

6060
protected AbstractIVFKnnVectorQuery(String field, float visitRatio, int k, int numCands, Query filter) {

server/src/main/java/org/elasticsearch/search/vectors/IVFKnnFloatVectorQuery.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.apache.lucene.search.Query;
1616
import org.apache.lucene.search.TopDocs;
1717
import org.apache.lucene.search.knn.KnnCollectorManager;
18+
import org.apache.lucene.search.knn.KnnSearchStrategy;
1819
import org.apache.lucene.util.Bits;
1920

2021
import java.io.IOException;
@@ -79,17 +80,24 @@ protected TopDocs approximateSearch(
7980
int visitedLimit,
8081
KnnCollectorManager knnCollectorManager
8182
) throws IOException {
82-
KnnCollector knnCollector = knnCollectorManager.newCollector(visitedLimit, searchStrategy, context);
83-
if (knnCollector == null) {
84-
return NO_RESULTS;
85-
}
8683
LeafReader reader = context.reader();
8784
FloatVectorValues floatVectorValues = reader.getFloatVectorValues(field);
8885
if (floatVectorValues == null) {
8986
FloatVectorValues.checkField(reader, field);
9087
return NO_RESULTS;
9188
}
92-
if (Math.min(knnCollector.k(), floatVectorValues.size()) == 0) {
89+
if (floatVectorValues.size() == 0) {
90+
return NO_RESULTS;
91+
}
92+
KnnSearchStrategy strategy = searchStrategy;
93+
if (searchStrategy.getVisitRatio() == 0.0f) {
94+
// dynamically set the percentage
95+
float expected = (float) Math.round(1.75f * Math.log10(numCands) * Math.log10(numCands) * (numCands));
96+
float ratio = expected / floatVectorValues.size();
97+
strategy = new IVFKnnSearchStrategy(ratio);
98+
}
99+
KnnCollector knnCollector = knnCollectorManager.newCollector(visitedLimit, strategy, context);
100+
if (knnCollector == null) {
93101
return NO_RESULTS;
94102
}
95103
reader.searchNearestVectors(field, query, knnCollector, acceptDocs);

0 commit comments

Comments
 (0)