From 40f3361338053b857f331d3338f2f6c1badbf037 Mon Sep 17 00:00:00 2001 From: Areek Zillur Date: Thu, 28 May 2015 17:46:55 +0000 Subject: [PATCH] LUCENE-6510: take path boosts into account when polling TopNSearcher queue git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1682290 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/lucene/util/fst/Util.java | 9 +- .../suggest/document/TestContextQuery.java | 89 +++++++++---------- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/lucene/core/src/java/org/apache/lucene/util/fst/Util.java b/lucene/core/src/java/org/apache/lucene/util/fst/Util.java index 4c914e8a8e4..5dc8c9bdc62 100644 --- a/lucene/core/src/java/org/apache/lucene/util/fst/Util.java +++ b/lucene/core/src/java/org/apache/lucene/util/fst/Util.java @@ -273,7 +273,7 @@ public final class Util { @Override public String toString() { - return "input=" + input + " cost=" + cost + "context=" + context + "boost=" + boost; + return "input=" + input.get() + " cost=" + cost + "context=" + context + "boost=" + boost; } } @@ -307,7 +307,8 @@ public final class Util { private final FST.Arc scratchArc = new FST.Arc<>(); - final Comparator comparator; + private final Comparator comparator; + private final Comparator> pathComparator; TreeSet> queue = null; @@ -329,7 +330,7 @@ public final class Util { this.topN = topN; this.maxQueueDepth = maxQueueDepth; this.comparator = comparator; - + this.pathComparator = pathComparator; queue = new TreeSet<>(pathComparator); } @@ -343,7 +344,7 @@ public final class Util { if (queue.size() == maxQueueDepth) { FSTPath bottom = queue.last(); - int comp = comparator.compare(cost, bottom.cost); + int comp = pathComparator.compare(path, bottom); if (comp > 0) { // Doesn't compete return; diff --git a/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestContextQuery.java b/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestContextQuery.java index 9995ef57029..4e97cf45839 100644 --- a/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestContextQuery.java +++ b/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestContextQuery.java @@ -478,56 +478,55 @@ public class TestContextQuery extends LuceneTestCase { @Test public void testRandomContextQueryScoring() throws Exception { Analyzer analyzer = new MockAnalyzer(random()); - RandomIndexWriter iw = new RandomIndexWriter(random(), dir, iwcWithSuggestField(analyzer, "suggest_field")); - int numSuggestions = atLeast(20); - int numContexts = atLeast(5); + try(RandomIndexWriter iw = new RandomIndexWriter(random(), dir, iwcWithSuggestField(analyzer, "suggest_field"))) { + int numSuggestions = atLeast(20); + int numContexts = atLeast(5); - Set seenWeights = new HashSet<>(); - List expectedEntries = new ArrayList<>(); - List contexts = new ArrayList<>(); - for (int i = 1; i <= numContexts; i++) { - CharSequence context = TestUtil.randomSimpleString(random(), 10) + i; - contexts.add(context); - for (int j = 1; j <= numSuggestions; j++) { - String suggestion = "sugg_" + TestUtil.randomSimpleString(random(), 10) + j; - int weight = TestUtil.nextInt(random(), 1, 1000 * numContexts * numSuggestions); - while (seenWeights.contains(weight)) { - weight = TestUtil.nextInt(random(), 1, 1000 * numContexts * numSuggestions); + Set seenWeights = new HashSet<>(); + List expectedEntries = new ArrayList<>(); + List contexts = new ArrayList<>(); + for (int i = 1; i <= numContexts; i++) { + CharSequence context = TestUtil.randomSimpleString(random(), 10) + i; + contexts.add(context); + for (int j = 1; j <= numSuggestions; j++) { + String suggestion = "sugg_" + TestUtil.randomSimpleString(random(), 10) + j; + int weight = TestUtil.nextInt(random(), 1, 1000 * numContexts * numSuggestions); + while (seenWeights.contains(weight)) { + weight = TestUtil.nextInt(random(), 1, 1000 * numContexts * numSuggestions); + } + seenWeights.add(weight); + Document document = new Document(); + document.add(new ContextSuggestField("suggest_field", Collections.singletonList(context), suggestion, weight)); + iw.addDocument(document); + expectedEntries.add(new Entry(suggestion, context.toString(), i * weight)); } - seenWeights.add(weight); - Document document = new Document(); - document.add(new ContextSuggestField("suggest_field", Collections.singletonList(context), suggestion, weight)); - iw.addDocument(document); - expectedEntries.add(new Entry(suggestion, context.toString(), i * weight)); - } - if (rarely()) { - iw.commit(); - } - } - Entry[] expectedResults = expectedEntries.toArray(new Entry[expectedEntries.size()]); - - ArrayUtil.introSort(expectedResults, new Comparator() { - @Override - public int compare(Entry o1, Entry o2) { - int cmp = Float.compare(o2.value, o1.value); - if (cmp != 0) { - return cmp; - } else { - return o1.output.compareTo(o2.output); + if (rarely()) { + iw.commit(); } } - }); + Entry[] expectedResults = expectedEntries.toArray(new Entry[expectedEntries.size()]); - DirectoryReader reader = iw.getReader(); - SuggestIndexSearcher suggestIndexSearcher = new SuggestIndexSearcher(reader); - ContextQuery query = new ContextQuery(new PrefixCompletionQuery(analyzer, new Term("suggest_field", "sugg"))); - for (int i = 0; i < contexts.size(); i++) { - query.addContext(contexts.get(i), i + 1); + ArrayUtil.introSort(expectedResults, new Comparator() { + @Override + public int compare(Entry o1, Entry o2) { + int cmp = Float.compare(o2.value, o1.value); + if (cmp != 0) { + return cmp; + } else { + return o1.output.compareTo(o2.output); + } + } + }); + + try(DirectoryReader reader = iw.getReader()) { + SuggestIndexSearcher suggestIndexSearcher = new SuggestIndexSearcher(reader); + ContextQuery query = new ContextQuery(new PrefixCompletionQuery(analyzer, new Term("suggest_field", "sugg"))); + for (int i = 0; i < contexts.size(); i++) { + query.addContext(contexts.get(i), i + 1); + } + TopSuggestDocs suggest = suggestIndexSearcher.suggest(query, 4); + assertSuggestions(suggest, Arrays.copyOfRange(expectedResults, 0, 4)); + } } - TopSuggestDocs suggest = suggestIndexSearcher.suggest(query, 4); - assertSuggestions(suggest, Arrays.copyOfRange(expectedResults, 0, 4)); - - reader.close(); - iw.close(); } }