You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2016/10/10 13:13:16 UTC

lucene-solr:branch_6x: LUCENE-7484: FastVectorHighlighter failed to highlight SynonymQuery

Repository: lucene-solr
Updated Branches:
  refs/heads/branch_6x 2b5fc01a5 -> 6f3eb1453


LUCENE-7484: FastVectorHighlighter failed to highlight SynonymQuery


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

Branch: refs/heads/branch_6x
Commit: 6f3eb145344520cfa5c3609f637583841211550d
Parents: 2b5fc01
Author: Mike McCandless <mi...@apache.org>
Authored: Mon Oct 10 09:12:31 2016 -0400
Committer: Mike McCandless <mi...@apache.org>
Committed: Mon Oct 10 09:12:52 2016 -0400

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |  3 ++
 .../search/vectorhighlight/FieldQuery.java      |  7 ++++
 .../FastVectorHighlighterTest.java              | 38 ++++++++++++++++++++
 3 files changed, 48 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6f3eb145/lucene/CHANGES.txt
----------------------------------------------------------------------
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index d6372b3..b3bcc85 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -26,6 +26,9 @@ Bug Fixes
 * LUCENE-7468: ASCIIFoldingFilter should not emit duplicated tokens when
   preserve original is on. (David Causse via Adrien Grand)
 
+* LUCENE-7484: FastVectorHighlighter failed to highlight SynonymQuery
+  (Jim Ferenczi via Mike McCandless)
+
 Improvements
 
 * LUCENE-7439: FuzzyQuery now matches all terms within the specified

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6f3eb145/lucene/highlighter/src/java/org/apache/lucene/search/vectorhighlight/FieldQuery.java
----------------------------------------------------------------------
diff --git a/lucene/highlighter/src/java/org/apache/lucene/search/vectorhighlight/FieldQuery.java b/lucene/highlighter/src/java/org/apache/lucene/search/vectorhighlight/FieldQuery.java
index 8abeaff..0fd336a 100644
--- a/lucene/highlighter/src/java/org/apache/lucene/search/vectorhighlight/FieldQuery.java
+++ b/lucene/highlighter/src/java/org/apache/lucene/search/vectorhighlight/FieldQuery.java
@@ -36,6 +36,7 @@ import org.apache.lucene.search.DisjunctionMaxQuery;
 import org.apache.lucene.search.MultiTermQuery;
 import org.apache.lucene.search.PhraseQuery;
 import org.apache.lucene.search.Query;
+import org.apache.lucene.search.SynonymQuery;
 import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.search.join.ToParentBlockJoinQuery;
 import org.apache.lucene.search.vectorhighlight.FieldTermStack.TermInfo;
@@ -120,6 +121,12 @@ public class FieldQuery {
       if( !flatQueries.contains( sourceQuery ) )
         flatQueries.add( sourceQuery );
     }
+    else if ( sourceQuery instanceof SynonymQuery ){
+      SynonymQuery synQuery = (SynonymQuery) sourceQuery;
+      for( Term term : synQuery.getTerms()) {
+        flatten( new TermQuery(term), reader, flatQueries, boost);
+      }
+    }
     else if( sourceQuery instanceof PhraseQuery ){
       PhraseQuery pq = (PhraseQuery)sourceQuery;
       if( pq.getTerms().length == 1 )

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6f3eb145/lucene/highlighter/src/test/org/apache/lucene/search/vectorhighlight/FastVectorHighlighterTest.java
----------------------------------------------------------------------
diff --git a/lucene/highlighter/src/test/org/apache/lucene/search/vectorhighlight/FastVectorHighlighterTest.java b/lucene/highlighter/src/test/org/apache/lucene/search/vectorhighlight/FastVectorHighlighterTest.java
index 5a2d5a0..89f46af 100644
--- a/lucene/highlighter/src/test/org/apache/lucene/search/vectorhighlight/FastVectorHighlighterTest.java
+++ b/lucene/highlighter/src/test/org/apache/lucene/search/vectorhighlight/FastVectorHighlighterTest.java
@@ -46,6 +46,7 @@ import org.apache.lucene.search.BoostQuery;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.PhraseQuery;
 import org.apache.lucene.search.Query;
+import org.apache.lucene.search.SynonymQuery;
 import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.search.TopDocs;
 import org.apache.lucene.search.highlight.DefaultEncoder;
@@ -521,6 +522,43 @@ public class FastVectorHighlighterTest extends LuceneTestCase {
     writer.close();
     dir.close();
   }
+
+  public void testWithSynonym() throws IOException {
+    Directory dir = newDirectory();
+    IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(new MockAnalyzer(random())));
+    FieldType type = new FieldType(TextField.TYPE_STORED);
+    type.setStoreTermVectorOffsets(true);
+    type.setStoreTermVectorPositions(true);
+    type.setStoreTermVectors(true);
+    type.freeze();
+
+    Document doc = new Document();
+    doc.add( new Field("field", "the quick brown fox", type ));
+    writer.addDocument(doc);
+    FastVectorHighlighter highlighter = new FastVectorHighlighter();
+
+    IndexReader reader = DirectoryReader.open(writer);
+    int docId = 0;
+
+    // query1: simple synonym query
+    SynonymQuery synQuery = new SynonymQuery(new Term("field", "quick"), new Term("field", "fast"));
+    FieldQuery fieldQuery  = highlighter.getFieldQuery(synQuery, reader);
+    String[] bestFragments = highlighter.getBestFragments(fieldQuery, reader, docId, "field", 54, 1);
+    assertEquals("the <b>quick</b> brown fox", bestFragments[0]);
+
+    // query2: boolean query with synonym query
+    BooleanQuery.Builder bq =
+        new BooleanQuery.Builder()
+            .add(new BooleanClause(synQuery, Occur.MUST))
+            .add(new BooleanClause(new TermQuery(new Term("field", "fox")), Occur.MUST));
+    fieldQuery  = highlighter.getFieldQuery(bq.build(), reader);
+    bestFragments = highlighter.getBestFragments(fieldQuery, reader, docId, "field", 54, 1);
+    assertEquals("the <b>quick</b> brown <b>fox</b>", bestFragments[0]);
+
+    reader.close();
+    writer.close();
+    dir.close();
+  }
   
   public void testBooleanPhraseWithSynonym() throws IOException {
     Directory dir = newDirectory();