You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ji...@apache.org on 2018/11/28 17:00:09 UTC

lucene-solr:branch_7x: LUCENE-8529: TopSuggestDocsCollector will now use the completion key to tiebreak completion suggestions with identical scores.

Repository: lucene-solr
Updated Branches:
  refs/heads/branch_7x e466b0076 -> 5e2db9eca


LUCENE-8529: TopSuggestDocsCollector will now use the completion key to tiebreak completion
suggestions with identical scores.


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/5e2db9ec
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/5e2db9ec
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/5e2db9ec

Branch: refs/heads/branch_7x
Commit: 5e2db9eca3bcb897673855ef9392735ab6c64186
Parents: e466b00
Author: Jim Ferenczi <ji...@apache.org>
Authored: Wed Nov 28 17:32:13 2018 +0100
Committer: Jim Ferenczi <ji...@apache.org>
Committed: Wed Nov 28 17:59:57 2018 +0100

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |  3 +++
 .../document/SuggestScoreDocPriorityQueue.java  |  5 +++-
 .../document/TopSuggestDocsCollector.java       | 27 ++++++++++----------
 .../document/TestFuzzyCompletionQuery.java      |  2 +-
 .../suggest/document/TestSuggestField.java      | 27 ++++++++++----------
 5 files changed, 36 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5e2db9ec/lucene/CHANGES.txt
----------------------------------------------------------------------
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index 760cd54..4331f02 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -27,6 +27,9 @@ Improvements
 * LUCENE-8562: Speed up merging segments of points with data dimensions by only sorting on the indexed
   dimensions. (Ignacio Vera)
 
+* LUCENE-8529: TopSuggestDocsCollector will now use the completion key to tiebreak completion
+  suggestion with identical scores. (Jim Ferenczi)
+
 Optimizations
 
 * LUCENE-8552: FieldInfos.getMergedFieldInfos no longer does any merging if there is <= 1 segment.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5e2db9ec/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/SuggestScoreDocPriorityQueue.java
----------------------------------------------------------------------
diff --git a/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/SuggestScoreDocPriorityQueue.java b/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/SuggestScoreDocPriorityQueue.java
index b395a3f..9927cdd 100644
--- a/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/SuggestScoreDocPriorityQueue.java
+++ b/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/SuggestScoreDocPriorityQueue.java
@@ -16,6 +16,7 @@
  */
 package org.apache.lucene.search.suggest.document;
 
+import org.apache.lucene.search.suggest.Lookup;
 import org.apache.lucene.search.suggest.document.TopSuggestDocs.SuggestScoreDoc;
 import org.apache.lucene.util.PriorityQueue;
 
@@ -35,8 +36,10 @@ final class SuggestScoreDocPriorityQueue extends PriorityQueue<SuggestScoreDoc>
   @Override
   protected boolean lessThan(SuggestScoreDoc a, SuggestScoreDoc b) {
     if (a.score == b.score) {
+      // tie break by completion key
+      int cmp = Lookup.CHARSEQUENCE_COMPARATOR.compare(a.key, b.key);
       // prefer smaller doc id, in case of a tie
-      return a.doc > b.doc;
+      return cmp != 0 ? cmp > 0 : a.doc > b.doc;
     }
     return a.score < b.score;
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5e2db9ec/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/TopSuggestDocsCollector.java
----------------------------------------------------------------------
diff --git a/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/TopSuggestDocsCollector.java b/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/TopSuggestDocsCollector.java
index 3336896..e6b8391 100644
--- a/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/TopSuggestDocsCollector.java
+++ b/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/TopSuggestDocsCollector.java
@@ -19,13 +19,13 @@ package org.apache.lucene.search.suggest.document;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
 
 import org.apache.lucene.analysis.CharArraySet;
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.search.CollectionTerminatedException;
 import org.apache.lucene.search.SimpleCollector;
+import org.apache.lucene.search.suggest.Lookup;
 
 import static org.apache.lucene.search.suggest.document.TopSuggestDocs.SuggestScoreDoc;
 
@@ -146,18 +146,19 @@ public class TopSuggestDocsCollector extends SimpleCollector {
       // numSegments), but typically numSegments is smallish and num is smallish so this won't matter much in practice:
 
       Collections.sort(pendingResults,
-                       new Comparator<SuggestScoreDoc>() {
-                         @Override
-                         public int compare(SuggestScoreDoc a, SuggestScoreDoc b) {
-                           // sort by higher score
-                           int cmp = Float.compare(b.score, a.score);
-                           if (cmp == 0) {
-                             // tie break by lower docID:
-                             cmp = Integer.compare(a.doc, b.doc);
-                           }
-                           return cmp;
-                         }
-                       });
+          (a, b) -> {
+            // sort by higher score
+            int cmp = Float.compare(b.score, a.score);
+            if (cmp == 0) {
+              // tie break by completion key
+              cmp = Lookup.CHARSEQUENCE_COMPARATOR.compare(a.key, b.key);
+              if (cmp == 0) {
+                // prefer smaller doc id, in case of a tie
+                cmp = Integer.compare(a.doc, b.doc);
+              }
+            }
+            return cmp;
+          });
 
       List<SuggestScoreDoc> hits = new ArrayList<>();
       

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5e2db9ec/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestFuzzyCompletionQuery.java
----------------------------------------------------------------------
diff --git a/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestFuzzyCompletionQuery.java b/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestFuzzyCompletionQuery.java
index 40c3f88..ae93de4 100644
--- a/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestFuzzyCompletionQuery.java
+++ b/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestFuzzyCompletionQuery.java
@@ -103,8 +103,8 @@ public class TestFuzzyCompletionQuery extends LuceneTestCase {
     CompletionQuery query =  new ContextQuery(new FuzzyCompletionQuery(analyzer, new Term("suggest_field", "sugge")));
     TopSuggestDocs suggest = suggestIndexSearcher.suggest(query, 5, false);
     assertSuggestions(suggest,
-        new Entry("suggestion", "type4", 4),
         new Entry("suggdestion", "type4", 4),
+        new Entry("suggestion", "type4", 4),
         new Entry("sugdgestion", "type3", 3),
         new Entry("sudggestion", "type2", 2),
         new Entry("sduggestion", "type1", 1)

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5e2db9ec/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestSuggestField.java
----------------------------------------------------------------------
diff --git a/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestSuggestField.java b/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestSuggestField.java
index e6d7062..2ea48e0 100644
--- a/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestSuggestField.java
+++ b/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestSuggestField.java
@@ -21,7 +21,6 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -53,6 +52,7 @@ import org.apache.lucene.index.Term;
 import org.apache.lucene.search.ScoreDoc;
 import org.apache.lucene.search.TopDocs;
 import org.apache.lucene.search.suggest.BitsProducer;
+import org.apache.lucene.search.suggest.Lookup;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.OutputStreamDataOutput;
 import org.apache.lucene.util.Bits;
@@ -342,18 +342,19 @@ public class TestSuggestField extends LuceneTestCase {
         }
       }
       Collections.sort(expected,
-                       new Comparator<Entry>() {
-                         @Override
-                         public int compare(Entry a, Entry b) {
-                           // sort by higher score:
-                           int cmp = Float.compare(b.value, a.value);
-                           if (cmp == 0) {
-                             // tie break by smaller docID:
-                             cmp = Integer.compare(a.id, b.id);
-                           }
-                           return cmp;
-                         }
-                       });
+          (a, b) -> {
+            // sort by higher score:
+            int cmp = Float.compare(b.value, a.value);
+            if (cmp == 0) {
+              // tie break by completion key
+              cmp = Lookup.CHARSEQUENCE_COMPARATOR.compare(a.output, b.output);
+              if (cmp == 0) {
+                // prefer smaller doc id, in case of a tie
+                cmp = Integer.compare(a.id, b.id);
+              }
+            }
+            return cmp;
+          });
 
       boolean dedup = random().nextBoolean();
       if (dedup) {