|
15 | 15 | import org.apache.lucene.search.Query; |
16 | 16 | import org.apache.lucene.search.TopDocs; |
17 | 17 | import org.apache.lucene.search.knn.KnnCollectorManager; |
| 18 | +import org.apache.lucene.search.knn.KnnSearchStrategy; |
18 | 19 | import org.apache.lucene.util.Bits; |
19 | 20 |
|
20 | 21 | import java.io.IOException; |
@@ -79,17 +80,24 @@ protected TopDocs approximateSearch( |
79 | 80 | int visitedLimit, |
80 | 81 | KnnCollectorManager knnCollectorManager |
81 | 82 | ) throws IOException { |
82 | | - KnnCollector knnCollector = knnCollectorManager.newCollector(visitedLimit, searchStrategy, context); |
83 | | - if (knnCollector == null) { |
84 | | - return NO_RESULTS; |
85 | | - } |
86 | 83 | LeafReader reader = context.reader(); |
87 | 84 | FloatVectorValues floatVectorValues = reader.getFloatVectorValues(field); |
88 | 85 | if (floatVectorValues == null) { |
89 | 86 | FloatVectorValues.checkField(reader, field); |
90 | 87 | return NO_RESULTS; |
91 | 88 | } |
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) { |
93 | 101 | return NO_RESULTS; |
94 | 102 | } |
95 | 103 | reader.searchNearestVectors(field, query, knnCollector, acceptDocs); |
|
0 commit comments