You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by cp...@apache.org on 2017/04/20 16:29:39 UTC
[06/13] lucene-solr:jira/solr-8668: SOLR-5127: Multiple highlight
fields and wildcards are now supported e.g. hl.fl=title, text_* (Sven-S. Porst,
Daniel Debray, Simon Endele, Christine Poerschke)
SOLR-5127: Multiple highlight fields and wildcards are now supported e.g. hl.fl=title,text_*
(Sven-S. Porst, Daniel Debray, Simon Endele, Christine Poerschke)
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/f9ca49a8
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/f9ca49a8
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/f9ca49a8
Branch: refs/heads/jira/solr-8668
Commit: f9ca49a8d59a89e30ce670e2eedcf6560e7ed91d
Parents: e62a3ff
Author: Christine Poerschke <cp...@apache.org>
Authored: Wed Apr 19 11:45:59 2017 +0100
Committer: Christine Poerschke <cp...@apache.org>
Committed: Wed Apr 19 12:28:14 2017 +0100
----------------------------------------------------------------------
solr/CHANGES.txt | 3 ++
.../apache/solr/highlight/SolrHighlighter.java | 51 ++++++++++++--------
.../apache/solr/highlight/HighlighterTest.java | 20 ++++++++
.../highlight/TestPostingsSolrHighlighter.java | 13 +++++
.../highlight/TestUnifiedSolrHighlighter.java | 13 +++++
5 files changed, 80 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f9ca49a8/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index e865311..2b82024 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -215,6 +215,9 @@ Bug Fixes
* SOLR-10472: Fixed uninversion (aka: FieldCache) bugs with the numeric PointField classes, and CurrencyField (hossman)
+* SOLR-5127: Multiple highlight fields and wildcards are now supported e.g. hl.fl=title,text_*
+ (Sven-S. Porst, Daniel Debray, Simon Endele, Christine Poerschke)
+
Other Changes
----------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f9ca49a8/solr/core/src/java/org/apache/solr/highlight/SolrHighlighter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/highlight/SolrHighlighter.java b/solr/core/src/java/org/apache/solr/highlight/SolrHighlighter.java
index e526c57..ade4c6b 100644
--- a/solr/core/src/java/org/apache/solr/highlight/SolrHighlighter.java
+++ b/solr/core/src/java/org/apache/solr/highlight/SolrHighlighter.java
@@ -24,9 +24,9 @@ import org.apache.solr.search.DocList;
import org.apache.solr.util.SolrPluginUtils;
import java.io.IOException;
-import java.util.ArrayList;
import java.util.Collection;
-import java.util.List;
+import java.util.LinkedHashSet;
+import java.util.Set;
public abstract class SolrHighlighter
{
@@ -60,27 +60,19 @@ public abstract class SolrHighlighter
if (emptyArray(defaultFields)) {
String defaultSearchField = request.getSchema().getDefaultSearchFieldName();
fields = null == defaultSearchField ? new String[]{} : new String[]{defaultSearchField};
- }
- else {
+ } else {
fields = defaultFields;
}
- }
- else if (fields.length == 1) {
- if (fields[0].contains("*")) {
- // create a Java regular expression from the wildcard string
- String fieldRegex = fields[0].replaceAll("\\*", ".*");
- Collection<String> storedHighlightFieldNames = request.getSearcher().getDocFetcher().getStoredHighlightFieldNames();
- List<String> storedFieldsToHighlight = new ArrayList<>();
- for (String storedFieldName: storedHighlightFieldNames) {
- if (storedFieldName.matches(fieldRegex)) {
- storedFieldsToHighlight.add(storedFieldName);
- }
- }
- 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]);
+ } else {
+ Set<String> expandedFields = new LinkedHashSet<String>();
+ Collection<String> storedHighlightFieldNames = request.getSearcher().getDocFetcher().getStoredHighlightFieldNames();
+ for (String field : fields) {
+ expandWildcardsInHighlightFields(
+ expandedFields,
+ storedHighlightFieldNames,
+ SolrPluginUtils.split(field));
}
+ fields = expandedFields.toArray(new String[]{});
}
// Trim them now in case they haven't been yet. Not needed for all code-paths above but do it here.
@@ -94,6 +86,25 @@ public abstract class SolrHighlighter
return (arr == null || arr.length == 0 || arr[0] == null || arr[0].trim().length() == 0);
}
+ static private void expandWildcardsInHighlightFields (
+ Set<String> expandedFields,
+ Collection<String> storedHighlightFieldNames,
+ String... fields) {
+ for (String field : fields) {
+ if (field.contains("*")) {
+ // create a Java regular expression from the wildcard string
+ String fieldRegex = field.replaceAll("\\*", ".*");
+ for (String storedFieldName : storedHighlightFieldNames) {
+ if (storedFieldName.matches(fieldRegex)) {
+ expandedFields.add(storedFieldName);
+ }
+ }
+ } else {
+ expandedFields.add(field);
+ }
+ }
+ }
+
/**
* Generates a list of Highlighted query fragments for each item in a list
* of documents, or returns null if highlighting is disabled.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f9ca49a8/solr/core/src/test/org/apache/solr/highlight/HighlighterTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/highlight/HighlighterTest.java b/solr/core/src/test/org/apache/solr/highlight/HighlighterTest.java
index 6506f98..f0b58cd 100644
--- a/solr/core/src/test/org/apache/solr/highlight/HighlighterTest.java
+++ b/solr/core/src/test/org/apache/solr/highlight/HighlighterTest.java
@@ -20,7 +20,9 @@ import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
@@ -35,6 +37,7 @@ import org.apache.solr.common.params.HighlightParams;
import org.apache.solr.handler.component.HighlightComponent;
import org.apache.solr.handler.component.ResponseBuilder;
import org.apache.solr.handler.component.SearchComponent;
+import org.apache.solr.request.LocalSolrQueryRequest;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.response.SolrQueryResponse;
import org.apache.solr.search.DocSet;
@@ -868,6 +871,8 @@ public class HighlighterTest extends SolrTestCaseJ4 {
"text", "test", // static not stored
"foo_s", "test", // dynamic stored
"foo_sI", "test", // dynamic not stored
+ "bar_s", "test", // dynamic stored
+ "bar_sI", "test", // dynamic not stored
"weight", "1.0")); // stored but not text
assertU(commit());
assertU(optimize());
@@ -898,6 +903,21 @@ public class HighlighterTest extends SolrTestCaseJ4 {
assertEquals("Expected to highlight on field \"foo_s\"", "foo_s",
highlightFieldNames.get(0));
request.close();
+
+ // SOLR-5127
+ args.put("hl.fl", (random().nextBoolean() ? "foo_*,bar_*" : "bar_*,foo_*"));
+ lrf = h.getRequestFactory("standard", 0, 10, args);
+ // hl.fl ordering need not be preserved in output
+ final Set<String> highlightedSetExpected = new HashSet<String>();
+ highlightedSetExpected.add("foo_s");
+ highlightedSetExpected.add("bar_s");
+ try (LocalSolrQueryRequest localRequest = lrf.makeRequest("test")) {
+ highlighter = HighlightComponent.getHighlighter(h.getCore());
+ final Set<String> highlightedSetActual = new HashSet<String>(
+ Arrays.asList(highlighter.getHighlightFields(null,
+ localRequest, new String[] {})));
+ assertEquals(highlightedSetExpected, highlightedSetActual);
+ }
}
@Test
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f9ca49a8/solr/core/src/test/org/apache/solr/highlight/TestPostingsSolrHighlighter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/highlight/TestPostingsSolrHighlighter.java b/solr/core/src/test/org/apache/solr/highlight/TestPostingsSolrHighlighter.java
index 3f25464..3862fa6 100644
--- a/solr/core/src/test/org/apache/solr/highlight/TestPostingsSolrHighlighter.java
+++ b/solr/core/src/test/org/apache/solr/highlight/TestPostingsSolrHighlighter.java
@@ -99,6 +99,19 @@ public class TestPostingsSolrHighlighter extends SolrTestCaseJ4 {
"//lst[@name='highlighting']/lst[@name='102']/arr[@name='text3']/str='crappier <em>document</em>'");
}
+ // SOLR-5127
+ public void testMultipleFieldsViaWildcard() {
+ assertQ("highlighting text and text3*",
+ req("q", (random().nextBoolean() ? "text:document text3:document" : "text3:document text:document"),
+ "sort", "id asc", "hl", "true",
+ "hl.fl", (random().nextBoolean() ? "text,text3*" : "text3*,text")),
+ "count(//lst[@name='highlighting']/*)=2",
+ "//lst[@name='highlighting']/lst[@name='101']/arr[@name='text']/str='<em>document</em> one'",
+ "//lst[@name='highlighting']/lst[@name='101']/arr[@name='text3']/str='crappy <em>document</em>'",
+ "//lst[@name='highlighting']/lst[@name='102']/arr[@name='text']/str='second <em>document</em>'",
+ "//lst[@name='highlighting']/lst[@name='102']/arr[@name='text3']/str='crappier <em>document</em>'");
+ }
+
public void testMisconfiguredField() {
ignoreException("was indexed without offsets");
try {
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f9ca49a8/solr/core/src/test/org/apache/solr/highlight/TestUnifiedSolrHighlighter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/highlight/TestUnifiedSolrHighlighter.java b/solr/core/src/test/org/apache/solr/highlight/TestUnifiedSolrHighlighter.java
index 2f7a003..ad1ca03 100644
--- a/solr/core/src/test/org/apache/solr/highlight/TestUnifiedSolrHighlighter.java
+++ b/solr/core/src/test/org/apache/solr/highlight/TestUnifiedSolrHighlighter.java
@@ -179,6 +179,19 @@ public class TestUnifiedSolrHighlighter extends SolrTestCaseJ4 {
"//lst[@name='highlighting']/lst[@name='102']/arr[@name='text3']/str='crappier <em>document</em>'");
}
+ // SOLR-5127
+ public void testMultipleFieldsViaWildcard() {
+ assertQ("highlighting text and text3*",
+ req("q", (random().nextBoolean() ? "text:document text3:document" : "text3:document text:document"),
+ "sort", "id asc", "hl", "true",
+ "hl.fl", (random().nextBoolean() ? "text,text3*" : "text3*,text")),
+ "count(//lst[@name='highlighting']/*)=2",
+ "//lst[@name='highlighting']/lst[@name='101']/arr[@name='text']/str='<em>document</em> one'",
+ "//lst[@name='highlighting']/lst[@name='101']/arr[@name='text3']/str='crappy <em>document</em>'",
+ "//lst[@name='highlighting']/lst[@name='102']/arr[@name='text']/str='second <em>document</em>'",
+ "//lst[@name='highlighting']/lst[@name='102']/arr[@name='text3']/str='crappier <em>document</em>'");
+ }
+
public void testTags() {
assertQ("different pre/post tags",
req("q", "text:document", "sort", "id asc", "hl", "true", "hl.tag.pre", "[", "hl.tag.post", "]"),