mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-03-31 12:28:51 +00:00
improve query handling (rewrite) when searching, try and minize the number of rewrites. Also, better highlighting when wrapping in filtered query
This commit is contained in:
parent
5f98942911
commit
cb8faaa13f
@ -23,6 +23,7 @@ import org.apache.lucene.index.IndexReader;
|
|||||||
import org.apache.lucene.index.Term;
|
import org.apache.lucene.index.Term;
|
||||||
import org.apache.lucene.search.*;
|
import org.apache.lucene.search.*;
|
||||||
import org.apache.lucene.search.spans.SpanTermQuery;
|
import org.apache.lucene.search.spans.SpanTermQuery;
|
||||||
|
import org.elasticsearch.util.lucene.search.CustomBoostFactorQuery;
|
||||||
import org.elasticsearch.util.lucene.search.TermFilter;
|
import org.elasticsearch.util.lucene.search.TermFilter;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -73,10 +74,9 @@ public class CustomFieldQuery extends FieldQuery {
|
|||||||
flatQueries.add(termQuery);
|
flatQueries.add(termQuery);
|
||||||
}
|
}
|
||||||
} else if (sourceQuery instanceof ConstantScoreQuery) {
|
} else if (sourceQuery instanceof ConstantScoreQuery) {
|
||||||
Boolean highlight = highlightFilters.get();
|
flatten(((ConstantScoreQuery) sourceQuery).getFilter(), flatQueries);
|
||||||
if (highlight != null && highlight.equals(Boolean.TRUE)) {
|
} else if (sourceQuery instanceof CustomBoostFactorQuery) {
|
||||||
flatten(((ConstantScoreQuery) sourceQuery).getFilter(), flatQueries);
|
flatten(((CustomBoostFactorQuery) sourceQuery).getSubQuery(), flatQueries);
|
||||||
}
|
|
||||||
} else if (sourceQuery instanceof MultiTermQuery) {
|
} else if (sourceQuery instanceof MultiTermQuery) {
|
||||||
MultiTermQuery multiTermQuery = (MultiTermQuery) sourceQuery;
|
MultiTermQuery multiTermQuery = (MultiTermQuery) sourceQuery;
|
||||||
MultiTermQuery.RewriteMethod rewriteMethod = multiTermQuery.getRewriteMethod();
|
MultiTermQuery.RewriteMethod rewriteMethod = multiTermQuery.getRewriteMethod();
|
||||||
@ -87,16 +87,25 @@ public class CustomFieldQuery extends FieldQuery {
|
|||||||
flatten(multiTermQuery.rewrite(reader.get()), flatQueries);
|
flatten(multiTermQuery.rewrite(reader.get()), flatQueries);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
// ignore
|
// ignore
|
||||||
|
} catch (BooleanQuery.TooManyClauses e) {
|
||||||
|
// ignore
|
||||||
} finally {
|
} finally {
|
||||||
multiTermQuery.setRewriteMethod(rewriteMethod);
|
multiTermQuery.setRewriteMethod(rewriteMethod);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if (sourceQuery instanceof FilteredQuery) {
|
||||||
|
flatten(((FilteredQuery) sourceQuery).getQuery(), flatQueries);
|
||||||
|
flatten(((FilteredQuery) sourceQuery).getFilter(), flatQueries);
|
||||||
} else {
|
} else {
|
||||||
super.flatten(sourceQuery, flatQueries);
|
super.flatten(sourceQuery, flatQueries);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void flatten(Filter sourceFilter, Collection<Query> flatQueries) {
|
void flatten(Filter sourceFilter, Collection<Query> flatQueries) {
|
||||||
|
Boolean highlight = highlightFilters.get();
|
||||||
|
if (highlight == null || highlight.equals(Boolean.FALSE)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (sourceFilter instanceof TermFilter) {
|
if (sourceFilter instanceof TermFilter) {
|
||||||
flatten(new TermQuery(((TermFilter) sourceFilter).getTerm()), flatQueries);
|
flatten(new TermQuery(((TermFilter) sourceFilter).getTerm()), flatQueries);
|
||||||
} else if (sourceFilter instanceof PublicTermsFilter) {
|
} else if (sourceFilter instanceof PublicTermsFilter) {
|
||||||
|
@ -37,7 +37,7 @@ public class SearchContextException extends SearchException {
|
|||||||
private static String buildMessage(SearchContext context, String msg) {
|
private static String buildMessage(SearchContext context, String msg) {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
sb.append('[').append(context.shardTarget().index()).append("][").append(context.shardTarget().shardId()).append("]: ");
|
sb.append('[').append(context.shardTarget().index()).append("][").append(context.shardTarget().shardId()).append("]: ");
|
||||||
sb.append("query[").append(context.query()).append("],from[").append(context.from()).append("],size[").append(context.size()).append("]");
|
sb.append("query[").append(context.originalQuery()).append("],from[").append(context.from()).append("],size[").append(context.size()).append("]");
|
||||||
if (context.sort() != null) {
|
if (context.sort() != null) {
|
||||||
sb.append(",sort[").append(context.sort()).append("]");
|
sb.append(",sort[").append(context.sort()).append("]");
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,9 @@ public class DfsPhase implements SearchPhase {
|
|||||||
|
|
||||||
public void execute(SearchContext context) {
|
public void execute(SearchContext context) {
|
||||||
try {
|
try {
|
||||||
context.rewriteQuery();
|
if (!context.queryRewritten()) {
|
||||||
|
context.updateRewriteQuery(context.searcher().rewrite(context.query()));
|
||||||
|
}
|
||||||
|
|
||||||
THashSet<Term> termsSet = new THashSet<Term>();
|
THashSet<Term> termsSet = new THashSet<Term>();
|
||||||
context.query().extractTerms(termsSet);
|
context.query().extractTerms(termsSet);
|
||||||
|
@ -106,9 +106,9 @@ public class HighlighterParseElement implements SearchParseElement {
|
|||||||
if ("highlight_filter".equals(topLevelFieldName) || "highlightFilter".equals(topLevelFieldName)) {
|
if ("highlight_filter".equals(topLevelFieldName) || "highlightFilter".equals(topLevelFieldName)) {
|
||||||
highlightFilter = jp.getIntValue() != 0;
|
highlightFilter = jp.getIntValue() != 0;
|
||||||
}
|
}
|
||||||
} else if (token == JsonToken.VALUE_FALSE) {
|
} else if (token == JsonToken.VALUE_FALSE || token == JsonToken.VALUE_TRUE) {
|
||||||
if ("highlight_filter".equals(topLevelFieldName) || "highlightFilter".equals(topLevelFieldName)) {
|
if ("highlight_filter".equals(topLevelFieldName) || "highlightFilter".equals(topLevelFieldName)) {
|
||||||
highlightFilter = false;
|
highlightFilter = token == JsonToken.VALUE_TRUE;
|
||||||
}
|
}
|
||||||
} else if (token == JsonToken.START_OBJECT) {
|
} else if (token == JsonToken.START_OBJECT) {
|
||||||
if ("fields".equals(topLevelFieldName)) {
|
if ("fields".equals(topLevelFieldName)) {
|
||||||
|
@ -28,7 +28,7 @@ import org.elasticsearch.util.lucene.docidset.DocIdSetCollector;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author kimchy (Shay Banon)
|
* @author kimchy (shay.banon)
|
||||||
*/
|
*/
|
||||||
public class ContextIndexSearcher extends IndexSearcher {
|
public class ContextIndexSearcher extends IndexSearcher {
|
||||||
|
|
||||||
@ -57,6 +57,20 @@ public class ContextIndexSearcher extends IndexSearcher {
|
|||||||
return docIdSet;
|
return docIdSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override public Query rewrite(Query original) throws IOException {
|
||||||
|
if (original == searchContext.query() || original == searchContext.originalQuery()) {
|
||||||
|
// optimize in case its the top level search query and we already rewrote it...
|
||||||
|
if (searchContext.queryRewritten()) {
|
||||||
|
return searchContext.query();
|
||||||
|
}
|
||||||
|
Query rewriteQuery = super.rewrite(original);
|
||||||
|
searchContext.updateRewriteQuery(rewriteQuery);
|
||||||
|
return rewriteQuery;
|
||||||
|
} else {
|
||||||
|
return super.rewrite(original);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override protected Weight createWeight(Query query) throws IOException {
|
@Override protected Weight createWeight(Query query) throws IOException {
|
||||||
if (dfSource == null) {
|
if (dfSource == null) {
|
||||||
return super.createWeight(query);
|
return super.createWeight(query);
|
||||||
|
@ -86,6 +86,8 @@ public class SearchContext implements Releasable {
|
|||||||
|
|
||||||
private String queryParserName;
|
private String queryParserName;
|
||||||
|
|
||||||
|
private Query originalQuery;
|
||||||
|
|
||||||
private Query query;
|
private Query query;
|
||||||
|
|
||||||
private int[] docIdsToLoad;
|
private int[] docIdsToLoad;
|
||||||
@ -238,19 +240,42 @@ public class SearchContext implements Releasable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public SearchContext query(Query query) {
|
public SearchContext query(Query query) {
|
||||||
if (query == null) {
|
|
||||||
this.query = query;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
queryRewritten = false;
|
queryRewritten = false;
|
||||||
|
this.originalQuery = query;
|
||||||
this.query = query;
|
this.query = query;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The original query to execute, unmodified.
|
||||||
|
*/
|
||||||
|
public Query originalQuery() {
|
||||||
|
return this.originalQuery;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The query to execute, might be rewritten.
|
||||||
|
*/
|
||||||
public Query query() {
|
public Query query() {
|
||||||
return this.query;
|
return this.query;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Has the query been rewritten already?
|
||||||
|
*/
|
||||||
|
public boolean queryRewritten() {
|
||||||
|
return queryRewritten;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rewrites the query and updates it. Only happens once.
|
||||||
|
*/
|
||||||
|
public SearchContext updateRewriteQuery(Query rewriteQuery) {
|
||||||
|
query = rewriteQuery;
|
||||||
|
queryRewritten = true;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public int from() {
|
public int from() {
|
||||||
return from;
|
return from;
|
||||||
}
|
}
|
||||||
@ -286,15 +311,6 @@ public class SearchContext implements Releasable {
|
|||||||
this.explain = explain;
|
this.explain = explain;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SearchContext rewriteQuery() throws IOException {
|
|
||||||
if (queryRewritten) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
query = query.rewrite(searcher.getIndexReader());
|
|
||||||
queryRewritten = true;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int[] docIdsToLoad() {
|
public int[] docIdsToLoad() {
|
||||||
return docIdsToLoad;
|
return docIdsToLoad;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user