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 2016/12/27 20:35:31 UTC
lucene-solr:branch_6x: SOLR-9897: re-indent
UnifiedSolrHighlighter.java
Repository: lucene-solr
Updated Branches:
refs/heads/branch_6x 9dde8a303 -> aceaafc15
SOLR-9897: re-indent UnifiedSolrHighlighter.java
(cherry picked from commit 9bd1528)
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/aceaafc1
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/aceaafc1
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/aceaafc1
Branch: refs/heads/branch_6x
Commit: aceaafc15c4e61c3a378cdce6f95979be5d05531
Parents: 9dde8a3
Author: David Smiley <ds...@apache.org>
Authored: Tue Dec 27 15:34:33 2016 -0500
Committer: David Smiley <ds...@apache.org>
Committed: Tue Dec 27 15:35:25 2016 -0500
----------------------------------------------------------------------
.../solr/highlight/UnifiedSolrHighlighter.java | 448 +++++++++----------
1 file changed, 224 insertions(+), 224 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/aceaafc1/solr/core/src/java/org/apache/solr/highlight/UnifiedSolrHighlighter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/highlight/UnifiedSolrHighlighter.java b/solr/core/src/java/org/apache/solr/highlight/UnifiedSolrHighlighter.java
index 6f81241..c38546e 100644
--- a/solr/core/src/java/org/apache/solr/highlight/UnifiedSolrHighlighter.java
+++ b/solr/core/src/java/org/apache/solr/highlight/UnifiedSolrHighlighter.java
@@ -110,256 +110,256 @@ import org.apache.solr.util.plugin.PluginInfoInitialized;
*/
public class UnifiedSolrHighlighter extends SolrHighlighter implements PluginInfoInitialized {
- protected static final String SNIPPET_SEPARATOR = "\u0000";
- private static final String[] ZERO_LEN_STR_ARRAY = new String[0];
+ protected static final String SNIPPET_SEPARATOR = "\u0000";
+ private static final String[] ZERO_LEN_STR_ARRAY = new String[0];
- @Override
- public void init(PluginInfo info) {
- }
+ @Override
+ public void init(PluginInfo info) {
+ }
- @Override
- public NamedList<Object> doHighlighting(DocList docs, Query query, SolrQueryRequest req, String[] defaultFields) throws IOException {
- final SolrParams params = req.getParams();
+ @Override
+ public NamedList<Object> doHighlighting(DocList docs, Query query, SolrQueryRequest req, String[] defaultFields) throws IOException {
+ final SolrParams params = req.getParams();
- // if highlighting isn't enabled, then why call doHighlighting?
- if (!isHighlightingEnabled(params))
- return null;
+ // if highlighting isn't enabled, then why call doHighlighting?
+ if (!isHighlightingEnabled(params))
+ return null;
- int[] docIDs = toDocIDs(docs);
+ int[] docIDs = toDocIDs(docs);
- // fetch the unique keys
- String[] keys = getUniqueKeys(req.getSearcher(), docIDs);
+ // fetch the unique keys
+ String[] keys = getUniqueKeys(req.getSearcher(), docIDs);
- // query-time parameters
- String[] fieldNames = getHighlightFields(query, req, defaultFields);
+ // query-time parameters
+ 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);
+ int maxPassages[] = new int[fieldNames.length];
+ for (int i = 0; i < fieldNames.length; i++) {
+ maxPassages[i] = params.getFieldInt(fieldNames[i], HighlightParams.SNIPPETS, 1);
+ }
+
+ UnifiedHighlighter highlighter = getHighlighter(req);
+ Map<String, String[]> snippets = highlighter.highlightFields(fieldNames, query, docIDs, maxPassages);
+ return encodeSnippets(keys, fieldNames, snippets);
+ }
+
+ /**
+ * Creates an instance of the Lucene {@link UnifiedHighlighter}. Provided for subclass extension so that
+ * a subclass can return a subclass of {@link SolrExtendedUnifiedHighlighter}.
+ */
+ protected UnifiedHighlighter getHighlighter(SolrQueryRequest req) {
+ return new SolrExtendedUnifiedHighlighter(req);
+ }
+
+ /**
+ * Encodes the resulting snippets into a namedlist
+ *
+ * @param keys the document unique keys
+ * @param fieldNames field names to highlight in the order
+ * @param snippets map from field name to snippet array for the docs
+ * @return encoded namedlist of summaries
+ */
+ protected NamedList<Object> encodeSnippets(String[] keys, String[] fieldNames, Map<String, String[]> snippets) {
+ NamedList<Object> list = new SimpleOrderedMap<>();
+ for (int i = 0; i < keys.length; i++) {
+ NamedList<Object> summary = new SimpleOrderedMap<>();
+ for (String field : fieldNames) {
+ String snippet = snippets.get(field)[i];
+ if (snippet == null) {
+ //TODO reuse logic of DefaultSolrHighlighter.alternateField
+ summary.add(field, ZERO_LEN_STR_ARRAY);
+ } else {
+ // we used a special snippet separator char and we can now split on it.
+ summary.add(field, snippet.split(SNIPPET_SEPARATOR));
}
+ }
+ list.add(keys[i], summary);
+ }
+ return list;
+ }
+
+ /**
+ * Converts solr's DocList to the int[] docIDs
+ */
+ protected int[] toDocIDs(DocList docs) {
+ int[] docIDs = new int[docs.size()];
+ DocIterator iterator = docs.iterator();
+ for (int i = 0; i < docIDs.length; i++) {
+ if (!iterator.hasNext()) {
+ throw new AssertionError();
+ }
+ docIDs[i] = iterator.nextDoc();
+ }
+ if (iterator.hasNext()) {
+ throw new AssertionError();
+ }
+ return docIDs;
+ }
+
+ /**
+ * Retrieves the unique keys for the topdocs to key the results
+ */
+ protected String[] getUniqueKeys(SolrIndexSearcher searcher, int[] docIDs) throws IOException {
+ IndexSchema schema = searcher.getSchema();
+ SchemaField keyField = schema.getUniqueKeyField();
+ if (keyField != null) {
+ Set<String> selector = Collections.singleton(keyField.getName());
+ String[] uniqueKeys = new String[docIDs.length];
+ for (int i = 0; i < docIDs.length; i++) {
+ int docid = docIDs[i];
+ Document doc = searcher.doc(docid, selector);
+ String id = schema.printableUniqueKey(doc);
+ uniqueKeys[i] = id;
+ }
+ return uniqueKeys;
+ } else {
+ return new String[docIDs.length];
+ }
+ }
+
+ /**
+ * From {@link #getHighlighter(org.apache.solr.request.SolrQueryRequest)}.
+ */
+ protected static class SolrExtendedUnifiedHighlighter extends UnifiedHighlighter {
+ protected final SolrParams params;
+ protected final IndexSchema schema;
+
+ protected final RTimerTree loadFieldValuesTimer;
+
+ public SolrExtendedUnifiedHighlighter(SolrQueryRequest req) {
+ super(req.getSearcher(), req.getSchema().getIndexAnalyzer());
+ this.params = req.getParams();
+ this.schema = req.getSchema();
+ this.setMaxLength(
+ params.getInt(HighlightParams.MAX_CHARS, UnifiedHighlighter.DEFAULT_MAX_LENGTH));
+ this.setCacheFieldValCharsThreshold(
+ params.getInt(HighlightParams.CACHE_FIELD_VAL_CHARS_THRESHOLD, DEFAULT_CACHE_CHARS_THRESHOLD));
+
+ // SolrRequestInfo is a thread-local singleton providing access to the ResponseBuilder to code that
+ // otherwise can't get it in a nicer way.
+ SolrQueryRequest request = SolrRequestInfo.getRequestInfo().getReq();
+ final RTimerTree timerTree;
+ if (request.getRequestTimer() != null) { //It may be null if not used in a search context.
+ timerTree = request.getRequestTimer();
+ } else {
+ timerTree = new RTimerTree(); // since null checks are annoying
+ }
+ loadFieldValuesTimer = timerTree.sub("loadFieldValues"); // we assume a new timer, state of STARTED
+ loadFieldValuesTimer.pause(); // state of PAUSED now with about zero time. Will fail if state isn't STARTED.
+ }
- UnifiedHighlighter highlighter = getHighlighter(req);
- Map<String, String[]> snippets = highlighter.highlightFields(fieldNames, query, docIDs, maxPassages);
- return encodeSnippets(keys, fieldNames, snippets);
+ @Override
+ protected OffsetSource getOffsetSource(String field) {
+ String sourceStr = params.getFieldParam(field, HighlightParams.OFFSET_SOURCE);
+ if (sourceStr != null) {
+ return OffsetSource.valueOf(sourceStr.toUpperCase(Locale.ROOT));
+ } else {
+ return super.getOffsetSource(field);
+ }
}
- /**
- * Creates an instance of the Lucene {@link UnifiedHighlighter}. Provided for subclass extension so that
- * a subclass can return a subclass of {@link SolrExtendedUnifiedHighlighter}.
- */
- protected UnifiedHighlighter getHighlighter(SolrQueryRequest req) {
- return new SolrExtendedUnifiedHighlighter(req);
+ @Override
+ public int getMaxNoHighlightPassages(String field) {
+ boolean defaultSummary = params.getFieldBool(field, HighlightParams.DEFAULT_SUMMARY, false);
+ if (defaultSummary) {
+ return -1;// signifies return first hl.snippets passages worth of the content
+ } else {
+ return 0;// will return null
+ }
}
- /**
- * Encodes the resulting snippets into a namedlist
- *
- * @param keys the document unique keys
- * @param fieldNames field names to highlight in the order
- * @param snippets map from field name to snippet array for the docs
- * @return encoded namedlist of summaries
- */
- protected NamedList<Object> encodeSnippets(String[] keys, String[] fieldNames, Map<String, String[]> snippets) {
- NamedList<Object> list = new SimpleOrderedMap<>();
- for (int i = 0; i < keys.length; i++) {
- NamedList<Object> summary = new SimpleOrderedMap<>();
- for (String field : fieldNames) {
- String snippet = snippets.get(field)[i];
- if (snippet == null) {
- //TODO reuse logic of DefaultSolrHighlighter.alternateField
- summary.add(field, ZERO_LEN_STR_ARRAY);
- } else {
- // we used a special snippet separator char and we can now split on it.
- summary.add(field, snippet.split(SNIPPET_SEPARATOR));
- }
- }
- list.add(keys[i], summary);
- }
- return list;
+ @Override
+ protected PassageFormatter getFormatter(String fieldName) {
+ String preTag = params.getFieldParam(fieldName, HighlightParams.TAG_PRE,
+ params.getFieldParam(fieldName, HighlightParams.SIMPLE_PRE, "<em>")
+ );
+
+ String postTag = params.getFieldParam(fieldName, HighlightParams.TAG_POST,
+ params.getFieldParam(fieldName, HighlightParams.SIMPLE_POST, "</em>")
+ );
+ String ellipsis = params.getFieldParam(fieldName, HighlightParams.TAG_ELLIPSIS, SNIPPET_SEPARATOR);
+ String encoder = params.getFieldParam(fieldName, HighlightParams.ENCODER, "simple");
+ return new DefaultPassageFormatter(preTag, postTag, ellipsis, "html".equals(encoder));
}
- /**
- * Converts solr's DocList to the int[] docIDs
- */
- protected int[] toDocIDs(DocList docs) {
- int[] docIDs = new int[docs.size()];
- DocIterator iterator = docs.iterator();
- for (int i = 0; i < docIDs.length; i++) {
- if (!iterator.hasNext()) {
- throw new AssertionError();
- }
- docIDs[i] = iterator.nextDoc();
- }
- if (iterator.hasNext()) {
- throw new AssertionError();
- }
- return docIDs;
+ @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);
}
/**
- * Retrieves the unique keys for the topdocs to key the results
+ * parse a break iterator type for the specified locale
*/
- protected String[] getUniqueKeys(SolrIndexSearcher searcher, int[] docIDs) throws IOException {
- IndexSchema schema = searcher.getSchema();
- SchemaField keyField = schema.getUniqueKeyField();
- if (keyField != null) {
- Set<String> selector = Collections.singleton(keyField.getName());
- String[] uniqueKeys = new String[docIDs.length];
- for (int i = 0; i < docIDs.length; i++) {
- int docid = docIDs[i];
- Document doc = searcher.doc(docid, selector);
- String id = schema.printableUniqueKey(doc);
- uniqueKeys[i] = id;
- }
- return uniqueKeys;
- } else {
- return new String[docIDs.length];
- }
+ protected BreakIterator parseBreakIterator(String type, Locale locale) {
+ if (type == null || "SENTENCE".equals(type)) {
+ return BreakIterator.getSentenceInstance(locale);
+ } else if ("LINE".equals(type)) {
+ return BreakIterator.getLineInstance(locale);
+ } else if ("WORD".equals(type)) {
+ return BreakIterator.getWordInstance(locale);
+ } else if ("CHARACTER".equals(type)) {
+ return BreakIterator.getCharacterInstance(locale);
+ } else if ("WHOLE".equals(type)) {
+ return new WholeBreakIterator();
+ } else {
+ throw new IllegalArgumentException("Unknown " + HighlightParams.BS_TYPE + ": " + type);
+ }
}
/**
- * From {@link #getHighlighter(org.apache.solr.request.SolrQueryRequest)}.
+ * parse a locale from a language+country+variant spec
*/
- protected static class SolrExtendedUnifiedHighlighter extends UnifiedHighlighter {
- protected final SolrParams params;
- protected final IndexSchema schema;
-
- protected final RTimerTree loadFieldValuesTimer;
-
- public SolrExtendedUnifiedHighlighter(SolrQueryRequest req) {
- super(req.getSearcher(), req.getSchema().getIndexAnalyzer());
- this.params = req.getParams();
- this.schema = req.getSchema();
- this.setMaxLength(
- params.getInt(HighlightParams.MAX_CHARS, UnifiedHighlighter.DEFAULT_MAX_LENGTH));
- this.setCacheFieldValCharsThreshold(
- params.getInt(HighlightParams.CACHE_FIELD_VAL_CHARS_THRESHOLD, DEFAULT_CACHE_CHARS_THRESHOLD));
-
- // SolrRequestInfo is a thread-local singleton providing access to the ResponseBuilder to code that
- // otherwise can't get it in a nicer way.
- SolrQueryRequest request = SolrRequestInfo.getRequestInfo().getReq();
- final RTimerTree timerTree;
- if (request.getRequestTimer() != null) { //It may be null if not used in a search context.
- timerTree = request.getRequestTimer();
- } else {
- timerTree = new RTimerTree(); // since null checks are annoying
- }
- loadFieldValuesTimer = timerTree.sub("loadFieldValues"); // we assume a new timer, state of STARTED
- loadFieldValuesTimer.pause(); // state of PAUSED now with about zero time. Will fail if state isn't STARTED.
- }
-
- @Override
- protected OffsetSource getOffsetSource(String field) {
- String sourceStr = params.getFieldParam(field, HighlightParams.OFFSET_SOURCE);
- if (sourceStr != null) {
- return OffsetSource.valueOf(sourceStr.toUpperCase(Locale.ROOT));
- } else {
- return super.getOffsetSource(field);
- }
- }
-
- @Override
- public int getMaxNoHighlightPassages(String field) {
- boolean defaultSummary = params.getFieldBool(field, HighlightParams.DEFAULT_SUMMARY, false);
- if (defaultSummary) {
- return -1;// signifies return first hl.snippets passages worth of the content
- } else {
- return 0;// will return null
- }
- }
-
- @Override
- protected PassageFormatter getFormatter(String fieldName) {
- String preTag = params.getFieldParam(fieldName, HighlightParams.TAG_PRE,
- params.getFieldParam(fieldName, HighlightParams.SIMPLE_PRE, "<em>")
- );
-
- String postTag = params.getFieldParam(fieldName, HighlightParams.TAG_POST,
- params.getFieldParam(fieldName, HighlightParams.SIMPLE_POST, "</em>")
- );
- String ellipsis = params.getFieldParam(fieldName, HighlightParams.TAG_ELLIPSIS, SNIPPET_SEPARATOR);
- 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);
- }
-
- /**
- * parse a break iterator type for the specified locale
- */
- protected BreakIterator parseBreakIterator(String type, Locale locale) {
- if (type == null || "SENTENCE".equals(type)) {
- return BreakIterator.getSentenceInstance(locale);
- } else if ("LINE".equals(type)) {
- return BreakIterator.getLineInstance(locale);
- } else if ("WORD".equals(type)) {
- return BreakIterator.getWordInstance(locale);
- } else if ("CHARACTER".equals(type)) {
- return BreakIterator.getCharacterInstance(locale);
- } else if ("WHOLE".equals(type)) {
- return new WholeBreakIterator();
- } else {
- throw new IllegalArgumentException("Unknown " + HighlightParams.BS_TYPE + ": " + type);
- }
- }
-
- /**
- * parse a locale from a language+country+variant spec
- */
- protected Locale parseLocale(String language, String country, String variant) {
- if (language == null && country == null && variant == null) {
- return Locale.ROOT;
- } else if (language == null) {
- throw new IllegalArgumentException("language is required if country or variant is specified");
- } else if (country == null && variant != null) {
- throw new IllegalArgumentException("To specify variant, country is required");
- } else if (country != null && variant != null) {
- return new Locale(language, country, variant);
- } else if (country != null) {
- return new Locale(language, country);
- } else {
- return new Locale(language);
- }
- }
-
- @Override
- protected List<CharSequence[]> loadFieldValues(String[] fields, DocIdSetIterator docIter, int
- cacheCharsThreshold) throws IOException {
- // Time loading field values. It can be an expensive part of highlighting.
- loadFieldValuesTimer.resume();
- try {
- return super.loadFieldValues(fields, docIter, cacheCharsThreshold);
- } finally {
- loadFieldValuesTimer.pause(); // note: doesn't need to be "stopped"; pause is fine.
- }
- }
+ protected Locale parseLocale(String language, String country, String variant) {
+ if (language == null && country == null && variant == null) {
+ return Locale.ROOT;
+ } else if (language == null) {
+ throw new IllegalArgumentException("language is required if country or variant is specified");
+ } else if (country == null && variant != null) {
+ throw new IllegalArgumentException("To specify variant, country is required");
+ } else if (country != null && variant != null) {
+ return new Locale(language, country, variant);
+ } else if (country != null) {
+ return new Locale(language, country);
+ } else {
+ return new Locale(language);
+ }
+ }
- @Override
- protected boolean shouldHandleMultiTermQuery(String field) {
- return params.getFieldBool(field, HighlightParams.HIGHLIGHT_MULTI_TERM, true);
- }
+ @Override
+ protected List<CharSequence[]> loadFieldValues(String[] fields, DocIdSetIterator docIter, int
+ cacheCharsThreshold) throws IOException {
+ // Time loading field values. It can be an expensive part of highlighting.
+ loadFieldValuesTimer.resume();
+ try {
+ return super.loadFieldValues(fields, docIter, cacheCharsThreshold);
+ } finally {
+ loadFieldValuesTimer.pause(); // note: doesn't need to be "stopped"; pause is fine.
+ }
+ }
- @Override
- protected boolean shouldHighlightPhrasesStrictly(String field) {
- return params.getFieldBool(field, HighlightParams.USE_PHRASE_HIGHLIGHTER, true);
- }
+ @Override
+ protected boolean shouldHandleMultiTermQuery(String field) {
+ return params.getFieldBool(field, HighlightParams.HIGHLIGHT_MULTI_TERM, true);
+ }
+ @Override
+ protected boolean shouldHighlightPhrasesStrictly(String field) {
+ return params.getFieldBool(field, HighlightParams.USE_PHRASE_HIGHLIGHTER, true);
}
+ }
+
}
\ No newline at end of file