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

svn commit: r1673216 - in /lucene/dev/trunk/solr: CHANGES.txt core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java core/src/test/org/apache/solr/highlight/HighlighterTest.java

Author: dsmiley
Date: Mon Apr 13 14:53:56 2015
New Revision: 1673216

URL: http://svn.apache.org/r1673216
Log:
SOLR-6692: When using hl.maxMultiValuedToMatch with hl.preserveMulti, only count matched snippets.

Modified:
    lucene/dev/trunk/solr/CHANGES.txt
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/highlight/HighlighterTest.java

Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1673216&r1=1673215&r2=1673216&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Mon Apr 13 14:53:56 2015
@@ -131,7 +131,9 @@ Other Changes
 * SOLR-6692: Default highlighter changes:
   - hl.maxAnalyzedChars now applies cumulatively on a multi-valied field.
   - fragment ranking on a multi-valued field should be more relevant.
-  - Much more extensible.
+  - hl.usePhraseHighlighter is now toggleable on a per-field basis.
+  - Much more extensible (get values from another source; return snippet scores and offsets).
+  - When using hl.maxMultiValuedToMatch with hl.preserveMulti, only count matched snippets.
   (David Smiley)
 
 ==================  5.1.0 ==================

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java?rev=1673216&r1=1673215&r2=1673216&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java Mon Apr 13 14:53:56 2015
@@ -321,7 +321,7 @@ public class DefaultSolrHighlighter exte
 
   protected SolrFragmentsBuilder getSolrFragmentsBuilder( String fieldName, SolrParams params ){
     String fb = params.getFieldParam( fieldName, HighlightParams.FRAGMENTS_BUILDER );
-    SolrFragmentsBuilder solrFb = fragmentsBuilders.get( fb );
+    SolrFragmentsBuilder solrFb = fragmentsBuilders.get(fb);
     if( solrFb == null ){
       throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "Unknown fragmentsBuilder: " + fb );
     }
@@ -549,7 +549,8 @@ public class DefaultSolrHighlighter exte
           // normally we want a score (must be highlighted), but if preserveMulti then we return a snippet regardless.
           if (bestTextFragment.getScore() > 0 || preserveMulti) {
             frags.add(bestTextFragment);
-            --mvToMatch; // note: limits fragments (for multi-valued fields), not quite the number of values
+            if (bestTextFragment.getScore() > 0)
+              --mvToMatch; // note: limits fragments (for multi-valued fields), not quite the number of values
           }
         }
       } catch (InvalidTokenOffsetsException e) {

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/highlight/HighlighterTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/highlight/HighlighterTest.java?rev=1673216&r1=1673215&r2=1673216&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/highlight/HighlighterTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/highlight/HighlighterTest.java Mon Apr 13 14:53:56 2015
@@ -929,11 +929,11 @@ public class HighlighterTest extends Sol
         "lower", "gap7 nothing",
         "lower", "gap8 nothing",
         "lower", "gap9 target",
-        "lower", "gap10 target" ));
+        "lower", "gap10 target"));
 
     assertU(commit());
 
-    // First insure we can count all six
+    // First ensure we can count all six
     assertQ("Counting all MV pairs failed",
         req(
             "q", "id:1000",
@@ -946,6 +946,7 @@ public class HighlighterTest extends Sol
     );
 
     // NOTE: These tests seem repeated, but we're testing for off-by-one errors
+
     // Now we should see exactly 2 by limiting the number of values searched to 4
     assertQ("Off by one by going too far",
         req(
@@ -959,7 +960,6 @@ public class HighlighterTest extends Sol
         "//lst[@name='highlighting']/lst[@name='1000']/arr[@name='lower' and count(*)=2]"
     );
 
-
     // Does 0 work?
     assertQ("Off by one by going too far",
         req(
@@ -973,7 +973,6 @@ public class HighlighterTest extends Sol
         "//lst[@name='highlighting']/lst[@name='1000' and count(child::*) = 0]"
     );
 
-
     // Now we should see exactly 2 by limiting the number of values searched to 2
     assertQ("Off by one by not going far enough",
         req(
@@ -987,7 +986,6 @@ public class HighlighterTest extends Sol
         "//lst[@name='highlighting']/lst[@name='1000']/arr[@name='lower' and count(*)=2]"
     );
 
-
     // Now we should see exactly 1 by limiting the number of values searched to 1
     assertQ("Not counting exactly 1",
         req(
@@ -1001,7 +999,6 @@ public class HighlighterTest extends Sol
         "//lst[@name='highlighting']/lst[@name='1000']/arr[@name='lower' and count(*)=1]"
     );
 
-
     // Now we should see exactly 4 by limiting the number of values found to 4
     assertQ("Matching 4 should exactly match 4",
         req(
@@ -1015,6 +1012,19 @@ public class HighlighterTest extends Sol
         "//lst[@name='highlighting']/lst[@name='1000']/arr[@name='lower' and count(*)=4]"
     );
 
+    // But if hl.preserveMulti=true then we should see 6 snippets even though 2 didn't match
+    assertQ("hl.preserveMulti",
+        req(
+            "q", "id:1000",
+            HighlightParams.HIGHLIGHT, "true",
+            HighlightParams.FIELDS, "lower",
+            HighlightParams.Q, "target",
+            HighlightParams.SNIPPETS, "100",
+            HighlightParams.MAX_MULTIVALUED_TO_MATCH, "4",
+            HighlightParams.PRESERVE_MULTI, "true"
+        ),
+        "//lst[@name='highlighting']/lst[@name='1000']/arr[@name='lower' and count(*)=6]"
+    );
 
     // Now we should see exactly 2 by limiting the number of values found to 2
     assertQ("Matching 6 should exactly search them all",
@@ -1029,7 +1039,6 @@ public class HighlighterTest extends Sol
         "//lst[@name='highlighting']/lst[@name='1000']/arr[@name='lower' and count(*)=6]"
     );
 
-
     // Now we should see exactly 1 by limiting the number of values found to 1
     assertQ("Matching 6 should exactly match them all",
         req(
@@ -1057,7 +1066,6 @@ public class HighlighterTest extends Sol
     );
 
 
-
     // Should bail at the first parameter matched.
     assertQ("Matching 6 should exactly match them all",
         req(