mirror of https://github.com/apache/lucene.git
LUCENE-7769: UnifiedHighlighter wasn't seeing inside BoostQuery or SpanBoostQuery
This commit is contained in:
parent
7d57d63375
commit
0ca7a7a028
|
@ -131,6 +131,9 @@ Bug Fixes
|
||||||
* LUCENE-7749: Made LRUQueryCache delegate the scoreSupplier method.
|
* LUCENE-7749: Made LRUQueryCache delegate the scoreSupplier method.
|
||||||
(Martin Amirault via Adrien Grand)
|
(Martin Amirault via Adrien Grand)
|
||||||
|
|
||||||
|
* LUCENE-7769: The UnifiedHighligter wasn't highlighting portions of the query
|
||||||
|
wrapped in BoostQuery or SpanBoostQuery. (David Smiley, Dmitry Malinin)
|
||||||
|
|
||||||
Other
|
Other
|
||||||
|
|
||||||
* LUCENE-7763: Remove outdated comment in IndexWriterConfig.setIndexSort javadocs.
|
* LUCENE-7763: Remove outdated comment in IndexWriterConfig.setIndexSort javadocs.
|
||||||
|
|
|
@ -28,12 +28,14 @@ import org.apache.lucene.index.Term;
|
||||||
import org.apache.lucene.search.AutomatonQuery;
|
import org.apache.lucene.search.AutomatonQuery;
|
||||||
import org.apache.lucene.search.BooleanClause;
|
import org.apache.lucene.search.BooleanClause;
|
||||||
import org.apache.lucene.search.BooleanQuery;
|
import org.apache.lucene.search.BooleanQuery;
|
||||||
|
import org.apache.lucene.search.BoostQuery;
|
||||||
import org.apache.lucene.search.ConstantScoreQuery;
|
import org.apache.lucene.search.ConstantScoreQuery;
|
||||||
import org.apache.lucene.search.DisjunctionMaxQuery;
|
import org.apache.lucene.search.DisjunctionMaxQuery;
|
||||||
import org.apache.lucene.search.FuzzyQuery;
|
import org.apache.lucene.search.FuzzyQuery;
|
||||||
import org.apache.lucene.search.PrefixQuery;
|
import org.apache.lucene.search.PrefixQuery;
|
||||||
import org.apache.lucene.search.Query;
|
import org.apache.lucene.search.Query;
|
||||||
import org.apache.lucene.search.TermRangeQuery;
|
import org.apache.lucene.search.TermRangeQuery;
|
||||||
|
import org.apache.lucene.search.spans.SpanBoostQuery;
|
||||||
import org.apache.lucene.search.spans.SpanMultiTermQueryWrapper;
|
import org.apache.lucene.search.spans.SpanMultiTermQueryWrapper;
|
||||||
import org.apache.lucene.search.spans.SpanNearQuery;
|
import org.apache.lucene.search.spans.SpanNearQuery;
|
||||||
import org.apache.lucene.search.spans.SpanNotQuery;
|
import org.apache.lucene.search.spans.SpanNotQuery;
|
||||||
|
@ -64,6 +66,8 @@ class MultiTermHighlighting {
|
||||||
Predicate<String> fieldMatcher,
|
Predicate<String> fieldMatcher,
|
||||||
boolean lookInSpan,
|
boolean lookInSpan,
|
||||||
Function<Query, Collection<Query>> preRewriteFunc) {
|
Function<Query, Collection<Query>> preRewriteFunc) {
|
||||||
|
// TODO Lucene needs a Query visitor API! LUCENE-3041
|
||||||
|
|
||||||
List<CharacterRunAutomaton> list = new ArrayList<>();
|
List<CharacterRunAutomaton> list = new ArrayList<>();
|
||||||
Collection<Query> customSubQueries = preRewriteFunc.apply(query);
|
Collection<Query> customSubQueries = preRewriteFunc.apply(query);
|
||||||
if (customSubQueries != null) {
|
if (customSubQueries != null) {
|
||||||
|
@ -79,6 +83,9 @@ class MultiTermHighlighting {
|
||||||
} else if (query instanceof ConstantScoreQuery) {
|
} else if (query instanceof ConstantScoreQuery) {
|
||||||
list.addAll(Arrays.asList(extractAutomata(((ConstantScoreQuery) query).getQuery(), fieldMatcher, lookInSpan,
|
list.addAll(Arrays.asList(extractAutomata(((ConstantScoreQuery) query).getQuery(), fieldMatcher, lookInSpan,
|
||||||
preRewriteFunc)));
|
preRewriteFunc)));
|
||||||
|
} else if (query instanceof BoostQuery) {
|
||||||
|
list.addAll(Arrays.asList(extractAutomata(((BoostQuery)query).getQuery(), fieldMatcher, lookInSpan,
|
||||||
|
preRewriteFunc)));
|
||||||
} else if (query instanceof DisjunctionMaxQuery) {
|
} else if (query instanceof DisjunctionMaxQuery) {
|
||||||
for (Query sub : ((DisjunctionMaxQuery) query).getDisjuncts()) {
|
for (Query sub : ((DisjunctionMaxQuery) query).getDisjuncts()) {
|
||||||
list.addAll(Arrays.asList(extractAutomata(sub, fieldMatcher, lookInSpan, preRewriteFunc)));
|
list.addAll(Arrays.asList(extractAutomata(sub, fieldMatcher, lookInSpan, preRewriteFunc)));
|
||||||
|
@ -97,6 +104,9 @@ class MultiTermHighlighting {
|
||||||
} else if (lookInSpan && query instanceof SpanPositionCheckQuery) {
|
} else if (lookInSpan && query instanceof SpanPositionCheckQuery) {
|
||||||
list.addAll(Arrays.asList(extractAutomata(((SpanPositionCheckQuery) query).getMatch(), fieldMatcher, lookInSpan,
|
list.addAll(Arrays.asList(extractAutomata(((SpanPositionCheckQuery) query).getMatch(), fieldMatcher, lookInSpan,
|
||||||
preRewriteFunc)));
|
preRewriteFunc)));
|
||||||
|
} else if (lookInSpan && query instanceof SpanBoostQuery) {
|
||||||
|
list.addAll(Arrays.asList(extractAutomata(((SpanBoostQuery) query).getQuery(), fieldMatcher, lookInSpan,
|
||||||
|
preRewriteFunc)));
|
||||||
} else if (lookInSpan && query instanceof SpanMultiTermQueryWrapper) {
|
} else if (lookInSpan && query instanceof SpanMultiTermQueryWrapper) {
|
||||||
list.addAll(Arrays.asList(extractAutomata(((SpanMultiTermQueryWrapper<?>) query).getWrappedQuery(),
|
list.addAll(Arrays.asList(extractAutomata(((SpanMultiTermQueryWrapper<?>) query).getWrappedQuery(),
|
||||||
fieldMatcher, lookInSpan, preRewriteFunc)));
|
fieldMatcher, lookInSpan, preRewriteFunc)));
|
||||||
|
|
|
@ -38,6 +38,7 @@ import org.apache.lucene.index.RandomIndexWriter;
|
||||||
import org.apache.lucene.index.Term;
|
import org.apache.lucene.index.Term;
|
||||||
import org.apache.lucene.search.BooleanClause;
|
import org.apache.lucene.search.BooleanClause;
|
||||||
import org.apache.lucene.search.BooleanQuery;
|
import org.apache.lucene.search.BooleanQuery;
|
||||||
|
import org.apache.lucene.search.BoostQuery;
|
||||||
import org.apache.lucene.search.ConstantScoreQuery;
|
import org.apache.lucene.search.ConstantScoreQuery;
|
||||||
import org.apache.lucene.search.DisjunctionMaxQuery;
|
import org.apache.lucene.search.DisjunctionMaxQuery;
|
||||||
import org.apache.lucene.search.FuzzyQuery;
|
import org.apache.lucene.search.FuzzyQuery;
|
||||||
|
@ -52,6 +53,7 @@ import org.apache.lucene.search.TermQuery;
|
||||||
import org.apache.lucene.search.TermRangeQuery;
|
import org.apache.lucene.search.TermRangeQuery;
|
||||||
import org.apache.lucene.search.TopDocs;
|
import org.apache.lucene.search.TopDocs;
|
||||||
import org.apache.lucene.search.WildcardQuery;
|
import org.apache.lucene.search.WildcardQuery;
|
||||||
|
import org.apache.lucene.search.spans.SpanBoostQuery;
|
||||||
import org.apache.lucene.search.spans.SpanFirstQuery;
|
import org.apache.lucene.search.spans.SpanFirstQuery;
|
||||||
import org.apache.lucene.search.spans.SpanMultiTermQueryWrapper;
|
import org.apache.lucene.search.spans.SpanMultiTermQueryWrapper;
|
||||||
import org.apache.lucene.search.spans.SpanNearQuery;
|
import org.apache.lucene.search.spans.SpanNearQuery;
|
||||||
|
@ -163,7 +165,8 @@ public class TestUnifiedHighlighterMTQ extends LuceneTestCase {
|
||||||
|
|
||||||
IndexSearcher searcher = newSearcher(ir);
|
IndexSearcher searcher = newSearcher(ir);
|
||||||
UnifiedHighlighter highlighter = new UnifiedHighlighter(searcher, indexAnalyzer);
|
UnifiedHighlighter highlighter = new UnifiedHighlighter(searcher, indexAnalyzer);
|
||||||
Query query = new PrefixQuery(new Term("body", "te"));
|
// wrap in a BoostQuery to also show we see inside it
|
||||||
|
Query query = new BoostQuery(new PrefixQuery(new Term("body", "te")), 2.0f);
|
||||||
TopDocs topDocs = searcher.search(query, 10, Sort.INDEXORDER);
|
TopDocs topDocs = searcher.search(query, 10, Sort.INDEXORDER);
|
||||||
assertEquals(2, topDocs.totalHits);
|
assertEquals(2, topDocs.totalHits);
|
||||||
String snippets[] = highlighter.highlight("body", query, topDocs);
|
String snippets[] = highlighter.highlight("body", query, topDocs);
|
||||||
|
@ -522,7 +525,9 @@ public class TestUnifiedHighlighterMTQ extends LuceneTestCase {
|
||||||
|
|
||||||
IndexSearcher searcher = newSearcher(ir);
|
IndexSearcher searcher = newSearcher(ir);
|
||||||
UnifiedHighlighter highlighter = new UnifiedHighlighter(searcher, indexAnalyzer);
|
UnifiedHighlighter highlighter = new UnifiedHighlighter(searcher, indexAnalyzer);
|
||||||
Query query = new SpanMultiTermQueryWrapper<>(new WildcardQuery(new Term("body", "te*")));
|
// wrap in a SpanBoostQuery to also show we see inside it
|
||||||
|
Query query = new SpanBoostQuery(
|
||||||
|
new SpanMultiTermQueryWrapper<>(new WildcardQuery(new Term("body", "te*"))), 2.0f);
|
||||||
TopDocs topDocs = searcher.search(query, 10, Sort.INDEXORDER);
|
TopDocs topDocs = searcher.search(query, 10, Sort.INDEXORDER);
|
||||||
assertEquals(2, topDocs.totalHits);
|
assertEquals(2, topDocs.totalHits);
|
||||||
String snippets[] = highlighter.highlight("body", query, topDocs);
|
String snippets[] = highlighter.highlight("body", query, topDocs);
|
||||||
|
|
Loading…
Reference in New Issue