Skip to content

Commit 0dc22eb

Browse files
committed
minor tweaks
1 parent 34cf456 commit 0dc22eb

File tree

1 file changed

+9
-14
lines changed

1 file changed

+9
-14
lines changed

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

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -136,41 +136,36 @@ public Query rewrite(IndexSearcher indexSearcher) throws IOException {
136136
List<SegmentAffinity> segmentAffinities = calculateSegmentAffinities(leafReaderContexts, getQueryVector());
137137

138138
// TODO: sort segments by affinity score in descending order, and cut the long tail ?
139-
140-
List<LeafReaderContext> selectedSegments = new ArrayList<>();
141-
142139
double[] affinityScores = segmentAffinities.stream().map(SegmentAffinity::affinityScore).mapToDouble(Double::doubleValue).toArray();
143140

144141
// max affinity for decreasing nProbe
145-
double average = Arrays.stream(affinityScores).average().orElseThrow();
146-
double maxAffinity = Arrays.stream(affinityScores).max().orElseThrow();
142+
double average = Arrays.stream(affinityScores).average().orElse(0.0);
143+
double maxAffinity = Arrays.stream(affinityScores).max().orElse(0.0);
147144
double lowerAffinity = (maxAffinity + average) * 0.5;
148145
double cutoffAffinity = lowerAffinity * 0.5; // minimum affinity score for a segment to be considered
149146
double affinityTreshold = (maxAffinity + lowerAffinity) * 0.66; // min affinity for increasing nProbe
150147
int maxAdjustments = (int) (nProbe * 1.5);
151148

152149
Map<LeafReaderContext, Integer> segmentNProbeMap = new HashMap<>();
153-
// Process segments based on their affinity scores
150+
// process segments based on their affinity scores
154151
for (SegmentAffinity affinity : segmentAffinities) {
155152
double score = affinity.affinityScore();
156153

157-
// Skip segments with very low affinity
154+
// skip segments with very low affinity
158155
if (score < cutoffAffinity) {
159156
continue;
160157
}
161158

162-
// Adjust nProbe based on affinity score
163-
// with larger affinity we increase nprobe (and viceversa)
159+
// sdjust nProbe based on affinity score, with larger affinity we increase nprobe (and viceversa)
164160
int adjustedNProbe = adjustNProbeForSegment(score, affinityTreshold, maxAdjustments);
165161

166-
// Store the adjusted nProbe value for this segment
162+
// store the adjusted nProbe value for this segment
167163
segmentNProbeMap.put(affinity.context(), adjustedNProbe);
168-
selectedSegments.add(affinity.context());
169164
}
170165

171-
List<Callable<TopDocs>> tasks = new ArrayList<>(selectedSegments.size());
172-
for (LeafReaderContext context : selectedSegments) {
173-
tasks.add(() -> searchLeaf(context, filterWeight, knnCollectorManager, segmentNProbeMap.getOrDefault(context, nProbe)));
166+
List<Callable<TopDocs>> tasks = new ArrayList<>(segmentNProbeMap.size());
167+
for (Map.Entry<LeafReaderContext, Integer> entry : segmentNProbeMap.entrySet()) {
168+
tasks.add(() -> searchLeaf(entry.getKey(), filterWeight, knnCollectorManager, entry.getValue()));
174169
}
175170
TopDocs[] perLeafResults = taskExecutor.invokeAll(tasks).toArray(TopDocs[]::new);
176171

0 commit comments

Comments
 (0)