Skip to content

Commit f3afcd6

Browse files
committed
calculating affinities accounting for some of the wide variance seen
1 parent ff4916d commit f3afcd6

File tree

1 file changed

+10
-13
lines changed

1 file changed

+10
-13
lines changed

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

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -173,13 +173,13 @@ public Query rewrite(IndexSearcher indexSearcher) throws IOException {
173173
.mapToDouble(Double::doubleValue)
174174
.toArray();
175175

176-
177-
double[] filteredAffinityScores = Arrays.stream(affinityScores).filter(x -> Double.isNaN(x) == false &&
178-
Double.isInfinite(x) == false).toArray();
176+
double[] filteredAffinityScores = Arrays.stream(affinityScores)
177+
.filter(x -> Double.isNaN(x) == false && Double.isInfinite(x) == false)
178+
.toArray();
179179

180180
final double averageAffinity = Arrays.stream(filteredAffinityScores).average().orElse(0.0);
181-
double variance = Arrays.stream(filteredAffinityScores).map(x -> (x-averageAffinity) * (x-averageAffinity)).sum() /
182-
filteredAffinityScores.length;
181+
double variance = Arrays.stream(filteredAffinityScores).map(x -> (x - averageAffinity) * (x - averageAffinity)).sum()
182+
/ filteredAffinityScores.length;
183183
double stdDev = Math.sqrt(variance);
184184

185185
double maxAffinity = averageAffinity + 50 * stdDev;
@@ -195,14 +195,11 @@ public Query rewrite(IndexSearcher indexSearcher) throws IOException {
195195
}
196196
} else {
197197
tasks = new ArrayList<>(segmentAffinities.size());
198-
double scoreVectorsSum = segmentAffinities.stream()
199-
.map(segmentAffinity -> {
200-
double affinity = Double.isNaN(segmentAffinity.affinityScore) ? maxAffinity : segmentAffinity.affinityScore;
201-
affinity = Math.clamp(affinity, 0.0, maxAffinity);
202-
return affinity * segmentAffinity.context.reader().numDocs();
203-
})
204-
.mapToDouble(Double::doubleValue)
205-
.sum();
198+
double scoreVectorsSum = segmentAffinities.stream().map(segmentAffinity -> {
199+
double affinity = Double.isNaN(segmentAffinity.affinityScore) ? maxAffinity : segmentAffinity.affinityScore;
200+
affinity = Math.clamp(affinity, 0.0, maxAffinity);
201+
return affinity * segmentAffinity.context.reader().numDocs();
202+
}).mapToDouble(Double::doubleValue).sum();
206203

207204
for (SegmentAffinity segmentAffinity : segmentAffinities) {
208205
double score = segmentAffinity.affinityScore();

0 commit comments

Comments
 (0)