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 2014/07/30 18:27:14 UTC

svn commit: r1614702 - in /lucene/dev/trunk/solr: CHANGES.txt core/src/java/org/apache/solr/highlight/PostingsSolrHighlighter.java

Author: dsmiley
Date: Wed Jul 30 16:27:13 2014
New Revision: 1614702

URL: http://svn.apache.org/r1614702
Log:
SOLR-6281: Made PostingsSolrHighlighter more configurable

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

Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1614702&r1=1614701&r2=1614702&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Wed Jul 30 16:27:13 2014
@@ -314,6 +314,8 @@ Other Changes
 
 * SOLR-6290: Harden and speed up CollectionsAPIAsyncDistributedZkTest. (Mark Miller, shalin)
 
+* SOLR-6281: Made PostingsSolrHighlighter more configurable via subclass extension. (David Smiley)
+
 ==================  4.9.0 ==================
 
 Versions of Major Components

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/highlight/PostingsSolrHighlighter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/highlight/PostingsSolrHighlighter.java?rev=1614702&r1=1614701&r2=1614702&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/highlight/PostingsSolrHighlighter.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/highlight/PostingsSolrHighlighter.java Wed Jul 30 16:27:13 2014
@@ -17,13 +17,6 @@ package org.apache.solr.highlight;
  * limitations under the License.
  */
 
-import java.io.IOException;
-import java.text.BreakIterator;
-import java.util.Collections;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.index.StoredDocument;
 import org.apache.lucene.search.Query;
@@ -47,6 +40,13 @@ import org.apache.solr.search.DocList;
 import org.apache.solr.search.SolrIndexSearcher;
 import org.apache.solr.util.plugin.PluginInfoInitialized;
 
+import java.io.IOException;
+import java.text.BreakIterator;
+import java.util.Collections;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
 /** 
  * Highlighter impl that uses {@link PostingsHighlighter}
  * <p>
@@ -119,88 +119,34 @@ public class PostingsSolrHighlighter ext
     final SolrParams params = req.getParams(); 
     
     // if highlighting isnt enabled, then why call doHighlighting?
-    if (isHighlightingEnabled(params)) {
-      SolrIndexSearcher searcher = req.getSearcher();
-      int[] docIDs = toDocIDs(docs);
-      
-      // fetch the unique keys
-      String[] keys = getUniqueKeys(searcher, docIDs);
-      
-      // query-time parameters
-      int maxLength = params.getInt(HighlightParams.MAX_CHARS, PostingsHighlighter.DEFAULT_MAX_LENGTH);
-      String[] fieldNames = getHighlightFields(query, req, defaultFields);
-      
-      int maxPassages[] = new int[fieldNames.length];
-      for (int i = 0; i < fieldNames.length; i++) {
-        maxPassages[i] = params.getFieldInt(fieldNames[i], HighlightParams.SNIPPETS, 1);
-      }
-      
-      final IndexSchema schema = req.getSchema();
-      
-      PostingsHighlighter highlighter = new PostingsHighlighter(maxLength) {
-        @Override
-        protected Passage[] getEmptyHighlight(String fieldName, BreakIterator bi, int maxPassages) {
-          boolean defaultSummary = params.getFieldBool(fieldName, HighlightParams.DEFAULT_SUMMARY, true);
-          if (defaultSummary) {
-            return super.getEmptyHighlight(fieldName, bi, maxPassages);
-          } else {
-            return new Passage[0];
-          }
-        }
+    if (!isHighlightingEnabled(params))
+      return null;
 
-        @Override
-        protected PassageFormatter getFormatter(String fieldName) {
-          String preTag = params.getFieldParam(fieldName, HighlightParams.TAG_PRE, "<em>");
-          String postTag = params.getFieldParam(fieldName, HighlightParams.TAG_POST, "</em>");
-          String ellipsis = params.getFieldParam(fieldName, HighlightParams.TAG_ELLIPSIS, "... ");
-          String encoder = params.getFieldParam(fieldName, HighlightParams.ENCODER, "simple");
-          return new DefaultPassageFormatter(preTag, postTag, ellipsis, "html".equals(encoder));
-        }
+    SolrIndexSearcher searcher = req.getSearcher();
+    int[] docIDs = toDocIDs(docs);
 
-        @Override
-        protected PassageScorer getScorer(String fieldName) {
-          float k1 = params.getFieldFloat(fieldName, HighlightParams.SCORE_K1, 1.2f);
-          float b = params.getFieldFloat(fieldName, HighlightParams.SCORE_B, 0.75f);
-          float pivot = params.getFieldFloat(fieldName, HighlightParams.SCORE_PIVOT, 87f);
-          return new PassageScorer(k1, b, pivot);
-        }
+    // fetch the unique keys
+    String[] keys = getUniqueKeys(searcher, docIDs);
 
-        @Override
-        protected BreakIterator getBreakIterator(String field) {
-          String language = params.getFieldParam(field, HighlightParams.BS_LANGUAGE);
-          String country = params.getFieldParam(field, HighlightParams.BS_COUNTRY);
-          String variant = params.getFieldParam(field, HighlightParams.BS_VARIANT);
-          Locale locale = parseLocale(language, country, variant);
-          String type = params.getFieldParam(field, HighlightParams.BS_TYPE);
-          return parseBreakIterator(type, locale);
-        }
+    // query-time parameters
+    String[] fieldNames = getHighlightFields(query, req, defaultFields);
 
-        @Override
-        protected char getMultiValuedSeparator(String field) {
-          String sep = params.getFieldParam(field, HighlightParams.MULTI_VALUED_SEPARATOR, " ");
-          if (sep.length() != 1) {
-            throw new IllegalArgumentException(HighlightParams.MULTI_VALUED_SEPARATOR + " must be exactly one character.");
-          }
-          return sep.charAt(0);
-        }
-
-        @Override
-        protected Analyzer getIndexAnalyzer(String field) {
-          if (params.getFieldBool(field, HighlightParams.HIGHLIGHT_MULTI_TERM, false)) {
-            return schema.getIndexAnalyzer();
-          } else {
-            return null;
-          }
-        }
-      };
-      
-      Map<String,String[]> snippets = highlighter.highlightFields(fieldNames, query, searcher, docIDs, maxPassages);
-      return encodeSnippets(keys, fieldNames, snippets);
-    } else {
-      return null;
+    int maxPassages[] = new int[fieldNames.length];
+    for (int i = 0; i < fieldNames.length; i++) {
+      maxPassages[i] = params.getFieldInt(fieldNames[i], HighlightParams.SNIPPETS, 1);
     }
+
+    PostingsHighlighter highlighter = getHighlighter(req);
+    Map<String,String[]> snippets = highlighter.highlightFields(fieldNames, query, searcher, docIDs, maxPassages);
+    return encodeSnippets(keys, fieldNames, snippets);
   }
-  
+
+  /** Creates an instance of the Lucene PostingsHighlighter. Provided for subclass extension so that
+   * a subclass can return a subclass of {@link PostingsSolrHighlighter.SolrExtendedPostingsHighlighter}. */
+  protected PostingsHighlighter getHighlighter(SolrQueryRequest req) {
+    return new SolrExtendedPostingsHighlighter(req);
+  }
+
   /** 
    * Encodes the resulting snippets into a namedlist
    * @param keys the document unique keys
@@ -261,7 +207,75 @@ public class PostingsSolrHighlighter ext
       return new String[docIDs.length];
     }
   }
-  
+
+  /** From {@link #getHighlighter(org.apache.solr.request.SolrQueryRequest)}. */
+  public class SolrExtendedPostingsHighlighter extends PostingsHighlighter {
+    protected final SolrParams params;
+    protected final IndexSchema schema;
+
+    public SolrExtendedPostingsHighlighter(SolrQueryRequest req) {
+      super(req.getParams().getInt(HighlightParams.MAX_CHARS, PostingsHighlighter.DEFAULT_MAX_LENGTH));
+      this.params = req.getParams();
+      this.schema = req.getSchema();
+    }
+
+    @Override
+    protected Passage[] getEmptyHighlight(String fieldName, BreakIterator bi, int maxPassages) {
+      boolean defaultSummary = params.getFieldBool(fieldName, HighlightParams.DEFAULT_SUMMARY, true);
+      if (defaultSummary) {
+        return super.getEmptyHighlight(fieldName, bi, maxPassages);
+      } else {
+        //TODO reuse logic of DefaultSolrHighlighter.alternateField
+        return new Passage[0];
+      }
+    }
+
+    @Override
+    protected PassageFormatter getFormatter(String fieldName) {
+      String preTag = params.getFieldParam(fieldName, HighlightParams.TAG_PRE, "<em>");
+      String postTag = params.getFieldParam(fieldName, HighlightParams.TAG_POST, "</em>");
+      String ellipsis = params.getFieldParam(fieldName, HighlightParams.TAG_ELLIPSIS, "... ");
+      String encoder = params.getFieldParam(fieldName, HighlightParams.ENCODER, "simple");
+      return new DefaultPassageFormatter(preTag, postTag, ellipsis, "html".equals(encoder));
+    }
+
+    @Override
+    protected PassageScorer getScorer(String fieldName) {
+      float k1 = params.getFieldFloat(fieldName, HighlightParams.SCORE_K1, 1.2f);
+      float b = params.getFieldFloat(fieldName, HighlightParams.SCORE_B, 0.75f);
+      float pivot = params.getFieldFloat(fieldName, HighlightParams.SCORE_PIVOT, 87f);
+      return new PassageScorer(k1, b, pivot);
+    }
+
+    @Override
+    protected BreakIterator getBreakIterator(String field) {
+      String language = params.getFieldParam(field, HighlightParams.BS_LANGUAGE);
+      String country = params.getFieldParam(field, HighlightParams.BS_COUNTRY);
+      String variant = params.getFieldParam(field, HighlightParams.BS_VARIANT);
+      Locale locale = parseLocale(language, country, variant);
+      String type = params.getFieldParam(field, HighlightParams.BS_TYPE);
+      return parseBreakIterator(type, locale);
+    }
+
+    @Override
+    protected char getMultiValuedSeparator(String field) {
+      String sep = params.getFieldParam(field, HighlightParams.MULTI_VALUED_SEPARATOR, " ");
+      if (sep.length() != 1) {
+        throw new IllegalArgumentException(HighlightParams.MULTI_VALUED_SEPARATOR + " must be exactly one character.");
+      }
+      return sep.charAt(0);
+    }
+
+    @Override
+    protected Analyzer getIndexAnalyzer(String field) {
+      if (params.getFieldBool(field, HighlightParams.HIGHLIGHT_MULTI_TERM, false)) {
+        return schema.getIndexAnalyzer();
+      } else {
+        return null;
+      }
+    }
+  }
+
   /** parse a break iterator type for the specified locale */
   protected BreakIterator parseBreakIterator(String type, Locale locale) {
     if (type == null || "SENTENCE".equals(type)) {