diff options
author | Lester Solbakken <lesters@oath.com> | 2019-02-25 10:26:45 +0100 |
---|---|---|
committer | Lester Solbakken <lesters@oath.com> | 2019-02-25 10:26:45 +0100 |
commit | 516e052217bdd71fcb30ed954fbe47094ccf6e91 (patch) | |
tree | 73631dd167c0eb13da5d0b868da696a6cea75bf0 /container-search | |
parent | 8293ceced71481ba16579410937691aef932e795 (diff) |
Refactoring of relevance metric tracking
Diffstat (limited to 'container-search')
-rw-r--r-- | container-search/src/main/java/com/yahoo/prelude/statistics/StatisticsSearcher.java | 46 |
1 files changed, 22 insertions, 24 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/statistics/StatisticsSearcher.java b/container-search/src/main/java/com/yahoo/prelude/statistics/StatisticsSearcher.java index dcd5721de68..1092b8d8df8 100644 --- a/container-search/src/main/java/com/yahoo/prelude/statistics/StatisticsSearcher.java +++ b/container-search/src/main/java/com/yahoo/prelude/statistics/StatisticsSearcher.java @@ -26,6 +26,7 @@ import java.util.Iterator; import java.util.Map; import java.util.Optional; import java.util.PriorityQueue; +import java.util.Queue; import java.util.logging.Level; import static com.yahoo.container.protect.Error.*; @@ -365,8 +366,18 @@ public class StatisticsSearcher extends Searcher { * Effectively flattens the hits, and measures relevance @ 1, 5, and 10 */ private void addRelevanceMetrics(Query query, Execution execution, Result result) { - final int heapCapacity = 10; - PriorityQueue<Double> heap = new PriorityQueue<>(heapCapacity); + Queue<Double> topScores = findTopRelevanceScores(10, result); + if (topScores.isEmpty()) { + return; + } + var metricContext = getRelevanceMetricContext(execution, query); + setRelevanceMetric(10, topScores, metricContext); // min-queue: lowest values are polled first + setRelevanceMetric( 5, topScores, metricContext); + setRelevanceMetric( 1, topScores, metricContext); + } + + private Queue<Double> findTopRelevanceScores(int n, Result result) { + PriorityQueue<Double> heap = new PriorityQueue<>(n); for (Iterator<Hit> it = result.hits().unorderedDeepIterator(); it.hasNext(); ) { Hit hit = it.next(); if (hit instanceof ErrorHit || hit.getRelevance() == null) { @@ -376,36 +387,23 @@ public class StatisticsSearcher extends Searcher { if (Double.isNaN(score)) { continue; } - if (heap.size() < heapCapacity) { + if (heap.size() < n) { heap.add(score); } else if (score > heap.peek()) { heap.remove(); heap.add(score); } } - if (heap.isEmpty()) { - return; - } - - Metric.Context metricContext = getRelevanceMetricContext(execution, query); + return heap; + } - while (heap.size() > 10) { - heap.remove(); - } - if (heap.size() == 10) { - metric.set("relevance_at_10", heap.poll(), metricContext); - } - while (heap.size() > 5) { - heap.remove(); - } - if (heap.size() == 5) { - metric.set("relevance_at_5", heap.poll(), metricContext); - } - while (heap.size() > 1) { - heap.remove(); + private void setRelevanceMetric(int pos, Queue<Double> minQueue, Metric.Context context) { + String name = "relevance_at_" + pos; + while (minQueue.size() > pos) { + minQueue.remove(); } - if (heap.size() == 1) { - metric.set("relevance_at_1", heap.poll(), metricContext); + if (minQueue.size() == pos) { + metric.set(name, minQueue.poll(), context); } } |