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/14 03:37:35 UTC
svn commit: r1673332 - in /lucene/dev/branches/branch_5x: ./ solr/ solr/core/
solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java
solr/core/src/java/org/apache/solr/highlight/SolrHighlighter.java
Author: dsmiley
Date: Tue Apr 14 01:37:35 2015
New Revision: 1673332
URL: http://svn.apache.org/r1673332
Log:
SOLR-6692: highlighter refactorings...
* extract method getDocPrefetchFieldNames
* trim field names in getHighlightFields instead of later on
* lazy-create FVH (could be expensive for wildcard queries)
Modified:
lucene/dev/branches/branch_5x/ (props changed)
lucene/dev/branches/branch_5x/solr/ (props changed)
lucene/dev/branches/branch_5x/solr/core/ (props changed)
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/highlight/SolrHighlighter.java
Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java?rev=1673332&r1=1673331&r2=1673332&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java Tue Apr 14 01:37:35 2015
@@ -353,53 +353,67 @@ public class DefaultSolrHighlighter exte
@SuppressWarnings("unchecked")
public NamedList<Object> doHighlighting(DocList docs, Query query, SolrQueryRequest req, String[] defaultFields) throws IOException {
SolrParams params = req.getParams();
- if (!isHighlightingEnabled(params))
+ if (!isHighlightingEnabled(params)) // also returns early if no unique key field
return null;
SolrIndexSearcher searcher = req.getSearcher();
IndexSchema schema = searcher.getSchema();
- NamedList fragments = new SimpleOrderedMap();
+
+ // fetch unique key if one exists.
+ SchemaField keyField = schema.getUniqueKeyField();
+ if (keyField == null) {
+ return null;//exit early; we need a unique key field to populate the response
+ }
+
String[] fieldNames = getHighlightFields(query, req, defaultFields);
- Set<String> fset = new HashSet<>();
- {
- // pre-fetch documents using the Searcher's doc cache
- for(String f : fieldNames) { fset.add(f); }
- // fetch unique key if one exists.
- SchemaField keyField = schema.getUniqueKeyField();
- if(null != keyField)
- fset.add(keyField.getName());
+ Set<String> preFetchFieldNames = getDocPrefetchFieldNames(fieldNames, req);
+ if (preFetchFieldNames != null) {
+ preFetchFieldNames.add(keyField.getName());
}
- // get FastVectorHighlighter instance out of the processing loop
- FastVectorHighlighter fvh = new FastVectorHighlighter(
- // FVH cannot process hl.usePhraseHighlighter parameter per-field basis
- params.getBool( HighlightParams.USE_PHRASE_HIGHLIGHTER, true ),
- // FVH cannot process hl.requireFieldMatch parameter per-field basis
- params.getBool( HighlightParams.FIELD_MATCH, false ) );
- fvh.setPhraseLimit(params.getInt(HighlightParams.PHRASE_LIMIT, SolrHighlighter.DEFAULT_PHRASE_LIMIT));
- FieldQuery fieldQuery = fvh.getFieldQuery( query, searcher.getIndexReader() );
+ FastVectorHighlighter fvh = null; // lazy
+ FieldQuery fvhFieldQuery = null; // lazy
// Highlight each document
+ NamedList fragments = new SimpleOrderedMap();
DocIterator iterator = docs.iterator();
for (int i = 0; i < docs.size(); i++) {
int docId = iterator.nextDoc();
- Document doc = searcher.doc(docId, fset);
+ Document doc = searcher.doc(docId, preFetchFieldNames);
+
NamedList docSummaries = new SimpleOrderedMap();
for (String fieldName : fieldNames) {
- fieldName = fieldName.trim();
- if( useFastVectorHighlighter( params, schema, fieldName ) )
- doHighlightingByFastVectorHighlighter( fvh, fieldQuery, req, docSummaries, docId, doc, fieldName );
- else
- doHighlightingByHighlighter( query, req, docSummaries, docId, doc, fieldName );
- }
- String printId = schema.printableUniqueKey(doc);
- fragments.add(printId == null ? null : printId, docSummaries);
- }
+ if (useFastVectorHighlighter(params, schema, fieldName)) {
+ if (fvhFieldQuery == null) {
+ fvh = new FastVectorHighlighter(
+ // FVH cannot process hl.usePhraseHighlighter parameter per-field basis
+ params.getBool(HighlightParams.USE_PHRASE_HIGHLIGHTER, true),
+ // FVH cannot process hl.requireFieldMatch parameter per-field basis
+ params.getBool(HighlightParams.FIELD_MATCH, false));
+ fvh.setPhraseLimit(params.getInt(HighlightParams.PHRASE_LIMIT, SolrHighlighter.DEFAULT_PHRASE_LIMIT));
+ fvhFieldQuery = fvh.getFieldQuery(query, searcher.getIndexReader());
+ }
+ doHighlightingByFastVectorHighlighter(fvh, fvhFieldQuery, req, docSummaries, docId, doc, fieldName);
+ } else {
+ doHighlightingByHighlighter(query, req, docSummaries, docId, doc, fieldName);
+ }
+ } // for each field
+ fragments.add(schema.printableUniqueKey(doc), docSummaries);
+ } // for each doc
return fragments;
}
- /*
+ /** Returns the field names to be passed to {@link SolrIndexSearcher#doc(int, Set)}.
+ * Subclasses might over-ride to include fields in search-results and other stored field values needed so as to avoid
+ * the possibility of extra trips to disk. The uniqueKey will be added after if the result isn't null. */
+ protected Set<String> getDocPrefetchFieldNames(String[] hlFieldNames, SolrQueryRequest req) {
+ Set<String> preFetchFieldNames = new HashSet<>(hlFieldNames.length + 1);//+1 for uniqueyKey added after
+ Collections.addAll(preFetchFieldNames, hlFieldNames);
+ return preFetchFieldNames;
+ }
+
+ /**
* If fieldName is undefined, this method returns false, then
* doHighlightingByHighlighter() will do nothing for the field.
*/
Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/highlight/SolrHighlighter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/highlight/SolrHighlighter.java?rev=1673332&r1=1673331&r2=1673332&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/highlight/SolrHighlighter.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/highlight/SolrHighlighter.java Tue Apr 14 01:37:35 2015
@@ -75,17 +75,21 @@ public abstract class SolrHighlighter
Collection<String> storedHighlightFieldNames = request.getSearcher().getStoredHighlightFieldNames();
List<String> storedFieldsToHighlight = new ArrayList<>();
for (String storedFieldName: storedHighlightFieldNames) {
- if (storedFieldName.matches(fieldRegex)) {
- storedFieldsToHighlight.add(storedFieldName);
- }
+ if (storedFieldName.matches(fieldRegex)) {
+ storedFieldsToHighlight.add(storedFieldName);
+ }
}
- fields = storedFieldsToHighlight.toArray(new String[] {});
+ fields = storedFieldsToHighlight.toArray(new String[storedFieldsToHighlight.size()]);
} else {
// if there's a single request/handler value, it may be a space/comma separated list
fields = SolrPluginUtils.split(fields[0]);
}
}
+ // Trim them now in case they haven't been yet. Not needed for all code-paths above but do it here.
+ for (int i = 0; i < fields.length; i++) {
+ fields[i] = fields[i].trim();
+ }
return fields;
}