Highlighting broken with custom_filters_score query, closes #1425.
This commit is contained in:
parent
2778a6756c
commit
b652c655d2
|
@ -26,6 +26,7 @@ import org.apache.lucene.search.spans.SpanTermQuery;
|
|||
import org.elasticsearch.common.lucene.search.MultiPhrasePrefixQuery;
|
||||
import org.elasticsearch.common.lucene.search.TermFilter;
|
||||
import org.elasticsearch.common.lucene.search.XBooleanFilter;
|
||||
import org.elasticsearch.common.lucene.search.function.FiltersFunctionScoreQuery;
|
||||
import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery;
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -110,6 +111,10 @@ public class CustomFieldQuery extends FieldQuery {
|
|||
} catch (IOException e) {
|
||||
// ignore
|
||||
}
|
||||
} else if (sourceQuery instanceof FiltersFunctionScoreQuery) {
|
||||
flatten(((FiltersFunctionScoreQuery) sourceQuery).getSubQuery(), flatQueries);
|
||||
} else if (sourceQuery instanceof FunctionScoreQuery) {
|
||||
flatten(((FunctionScoreQuery) sourceQuery).getSubQuery(), flatQueries);
|
||||
} else {
|
||||
super.flatten(sourceQuery, flatQueries);
|
||||
}
|
||||
|
|
|
@ -25,6 +25,7 @@ import org.apache.lucene.document.Document;
|
|||
import org.apache.lucene.document.Field;
|
||||
import org.apache.lucene.document.Fieldable;
|
||||
import org.apache.lucene.index.IndexReader;
|
||||
import org.apache.lucene.search.ConstantScoreQuery;
|
||||
import org.apache.lucene.search.Query;
|
||||
import org.apache.lucene.search.highlight.*;
|
||||
import org.apache.lucene.search.vectorhighlight.*;
|
||||
|
@ -32,6 +33,8 @@ import org.elasticsearch.ElasticSearchException;
|
|||
import org.elasticsearch.common.collect.ImmutableMap;
|
||||
import org.elasticsearch.common.io.FastStringReader;
|
||||
import org.elasticsearch.common.lucene.document.SingleFieldSelector;
|
||||
import org.elasticsearch.common.lucene.search.function.FiltersFunctionScoreQuery;
|
||||
import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery;
|
||||
import org.elasticsearch.index.mapper.DocumentMapper;
|
||||
import org.elasticsearch.index.mapper.FieldMapper;
|
||||
import org.elasticsearch.index.mapper.MapperService;
|
||||
|
@ -101,16 +104,23 @@ public class HighlightPhase implements SearchHitPhase {
|
|||
// if we can do highlighting using Term Vectors, use FastVectorHighlighter, otherwise, use the
|
||||
// slower plain highlighter
|
||||
if (mapper.termVector() != Field.TermVector.WITH_POSITIONS_OFFSETS) {
|
||||
if (!context.queryRewritten()) {
|
||||
try {
|
||||
context.updateRewriteQuery(context.searcher().rewrite(context.query()));
|
||||
} catch (IOException e) {
|
||||
throw new FetchPhaseExecutionException(context, "Failed to highlight field [" + field.field() + "]", e);
|
||||
}
|
||||
}
|
||||
// Don't use the context.query() since it might be rewritten, and we need to pass the non rewritten queries to
|
||||
// let the highlighter handle MultiTerm ones
|
||||
QueryScorer queryScorer = new QueryScorer(context.parsedQuery().query(), null);
|
||||
|
||||
// QueryScorer uses WeightedSpanTermExtractor to extract terms, but we can't really plug into
|
||||
// it, so, we hack here (and really only support top level queries)
|
||||
Query query = context.parsedQuery().query();
|
||||
if (query instanceof FunctionScoreQuery) {
|
||||
query = ((FunctionScoreQuery) query).getSubQuery();
|
||||
} else if (query instanceof FiltersFunctionScoreQuery) {
|
||||
query = ((FiltersFunctionScoreQuery) query).getSubQuery();
|
||||
} else if (query instanceof ConstantScoreQuery) {
|
||||
ConstantScoreQuery q = (ConstantScoreQuery) query;
|
||||
if (q.getQuery() != null) {
|
||||
query = q.getQuery();
|
||||
}
|
||||
}
|
||||
QueryScorer queryScorer = new QueryScorer(query, null);
|
||||
queryScorer.setExpandMultiTermQuery(true);
|
||||
Fragmenter fragmenter;
|
||||
if (field.numberOfFragments() == 0) {
|
||||
|
|
Loading…
Reference in New Issue