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/12/04 14:53:16 UTC

lucene-solr:branch_7_6: LUCENE-8589: Fix MultiPhraseQuery to not duplicate terms when building the phrase's weight

Repository: lucene-solr
Updated Branches:
  refs/heads/branch_7_6 14bc64d51 -> d764aa222


LUCENE-8589: Fix MultiPhraseQuery to not duplicate terms when building the phrase's weight


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

Branch: refs/heads/branch_7_6
Commit: d764aa2223b229f6522037b6997d642ba031c79c
Parents: 14bc64d
Author: Jim Ferenczi <ji...@apache.org>
Authored: Tue Dec 4 15:38:18 2018 +0100
Committer: Jim Ferenczi <ji...@apache.org>
Committed: Tue Dec 4 15:40:57 2018 +0100

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |  3 ++
 .../apache/lucene/search/MultiPhraseQuery.java  |  1 -
 .../lucene/search/TestMultiPhraseQuery.java     | 50 +++++++++++++++++++-
 3 files changed, 52 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d764aa22/lucene/CHANGES.txt
----------------------------------------------------------------------
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index d5b7f6f..2ceb0c6 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -49,6 +49,9 @@ Bug fixes
 * LUCENE-8586: Intervals.or() could get stuck in an infinite loop on certain indexes
   (Alan Woodward)
 
+* LUCENE-8589: Fix MultiPhraseQuery to not duplicate terms when building the phrase's weight.
+  (Jim Ferenczi)
+
 New Features
 
 * LUCENE-8496: Selective indexing - modify BKDReader/BKDWriter to allow users

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d764aa22/lucene/core/src/java/org/apache/lucene/search/MultiPhraseQuery.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/MultiPhraseQuery.java b/lucene/core/src/java/org/apache/lucene/search/MultiPhraseQuery.java
index fa48a2d..0a88358 100644
--- a/lucene/core/src/java/org/apache/lucene/search/MultiPhraseQuery.java
+++ b/lucene/core/src/java/org/apache/lucene/search/MultiPhraseQuery.java
@@ -226,7 +226,6 @@ public class MultiPhraseQuery extends Query {
                 allTermStats.add(termStatistics);
               }
             }
-            allTermStats.add(searcher.termStatistics(term, ts));
           }
         }
         if (allTermStats.isEmpty()) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d764aa22/lucene/core/src/test/org/apache/lucene/search/TestMultiPhraseQuery.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestMultiPhraseQuery.java b/lucene/core/src/test/org/apache/lucene/search/TestMultiPhraseQuery.java
index 409299f..38181ac 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestMultiPhraseQuery.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestMultiPhraseQuery.java
@@ -18,7 +18,10 @@ package org.apache.lucene.search;
 
 
 import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashSet;
 import java.util.LinkedList;
+import java.util.Set;
 
 import org.apache.lucene.analysis.CannedTokenStream;
 import org.apache.lucene.analysis.Token;
@@ -26,13 +29,16 @@ import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
 import org.apache.lucene.document.TextField;
 import org.apache.lucene.index.DirectoryReader;
+import org.apache.lucene.index.FieldInvertState;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.MultiFields;
 import org.apache.lucene.index.RandomIndexWriter;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.index.TermsEnum;
+import org.apache.lucene.search.similarities.Similarity;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.RAMDirectory;
 import org.apache.lucene.util.BytesRef;
@@ -101,7 +107,7 @@ public class TestMultiPhraseQuery extends LuceneTestCase {
     termsWithPrefix.clear();
     prefix = "blue";
     te.seekCeil(new BytesRef(prefix));
-    
+
     do {
       if (te.term().utf8ToString().startsWith(prefix)) {
         termsWithPrefix.add(new Term("body", te.term().utf8ToString()));
@@ -139,6 +145,48 @@ public class TestMultiPhraseQuery extends LuceneTestCase {
     indexStore.close();
   }
 
+  public void testStats() throws IOException {
+      Directory indexStore = newDirectory();
+      RandomIndexWriter writer = new RandomIndexWriter(random(), indexStore);
+      add("quick brown fox", writer);
+      add("quick pink fox", writer);
+      add("quick red fox", writer);
+      IndexReader reader = writer.getReader();
+      IndexSearcher searcher = newSearcher(reader);
+      final Similarity delegate = searcher.getSimilarity(true);
+      final Set<String> termSet = new HashSet<>();
+      termSet.addAll(Arrays.asList("quick", "brown", "black", "red", "fox"));
+      searcher.setSimilarity(new Similarity() {
+        @Override
+        public long computeNorm(FieldInvertState state) {
+          return delegate.computeNorm(state);
+        }
+
+        @Override
+        public SimWeight computeWeight(float boost, CollectionStatistics collectionStats, TermStatistics... termStats) {
+          for (TermStatistics term : termStats) {
+            assertTrue(termSet.remove(term.term().utf8ToString()));
+          }
+          return delegate.computeWeight(boost, collectionStats, termStats);
+        }
+
+        @Override
+        public SimScorer simScorer(SimWeight weight, LeafReaderContext context) throws IOException {
+          return delegate.simScorer(weight, context);
+        }
+      });
+      MultiPhraseQuery.Builder builder = new MultiPhraseQuery.Builder();
+      builder.add(new Term("body", "quick"));
+      builder.add(new Term[] {new Term("body", "brown"), new Term("body", "red"), new Term("body", "black") });
+      builder.add(new Term("body", "fox"));
+      TopDocs topDocs = searcher.search(searcher.rewrite(builder.build()), 10);
+      assertTrue(termSet.isEmpty());
+      assertEquals(topDocs.totalHits, 2);
+      writer.close();
+      reader.close();
+      indexStore.close();
+  }
+
   // LUCENE-2580
   public void testTall() throws IOException {
     Directory indexStore = newDirectory();