2013-08-26 16:28:27 +02:00
|
|
|
/*
|
2014-01-06 22:48:02 +01:00
|
|
|
* Licensed to Elasticsearch under one or more contributor
|
|
|
|
* license agreements. See the NOTICE file distributed with
|
|
|
|
* this work for additional information regarding copyright
|
|
|
|
* ownership. Elasticsearch licenses this file to you under
|
|
|
|
* the Apache License, Version 2.0 (the "License"); you may
|
|
|
|
* not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
2013-08-26 16:28:27 +02:00
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing,
|
|
|
|
* software distributed under the License is distributed on an
|
|
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
|
|
* KIND, either express or implied. See the License for the
|
|
|
|
* specific language governing permissions and limitations
|
|
|
|
* under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package org.elasticsearch.search.internal;
|
|
|
|
|
|
|
|
import com.google.common.collect.ImmutableList;
|
|
|
|
import com.google.common.collect.Lists;
|
|
|
|
import org.apache.lucene.search.Filter;
|
|
|
|
import org.apache.lucene.search.Query;
|
2014-01-31 01:46:02 +01:00
|
|
|
import org.apache.lucene.search.ScoreDoc;
|
2013-08-26 16:28:27 +02:00
|
|
|
import org.apache.lucene.search.Sort;
|
2014-01-06 21:58:46 +01:00
|
|
|
import org.elasticsearch.ElasticsearchException;
|
2013-08-26 16:28:27 +02:00
|
|
|
import org.elasticsearch.action.search.SearchType;
|
2013-12-03 16:02:31 +01:00
|
|
|
import org.elasticsearch.cache.recycler.PageCacheRecycler;
|
2013-08-26 16:28:27 +02:00
|
|
|
import org.elasticsearch.common.Nullable;
|
2014-02-26 16:40:15 +01:00
|
|
|
import org.elasticsearch.common.lease.Releasables;
|
2013-08-26 16:28:27 +02:00
|
|
|
import org.elasticsearch.common.lucene.search.AndFilter;
|
|
|
|
import org.elasticsearch.common.lucene.search.Queries;
|
|
|
|
import org.elasticsearch.common.lucene.search.XConstantScoreQuery;
|
|
|
|
import org.elasticsearch.common.lucene.search.XFilteredQuery;
|
|
|
|
import org.elasticsearch.common.lucene.search.function.BoostScoreFunction;
|
|
|
|
import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery;
|
2014-02-26 16:40:15 +01:00
|
|
|
import org.elasticsearch.common.util.BigArrays;
|
2013-08-26 16:28:27 +02:00
|
|
|
import org.elasticsearch.index.analysis.AnalysisService;
|
|
|
|
import org.elasticsearch.index.cache.filter.FilterCache;
|
2014-07-25 16:17:48 +02:00
|
|
|
import org.elasticsearch.index.cache.fixedbitset.FixedBitSetFilterCache;
|
2014-09-04 02:54:19 +02:00
|
|
|
import org.elasticsearch.index.engine.Engine;
|
2013-08-26 16:28:27 +02:00
|
|
|
import org.elasticsearch.index.fielddata.IndexFieldDataService;
|
|
|
|
import org.elasticsearch.index.mapper.FieldMapper;
|
|
|
|
import org.elasticsearch.index.mapper.FieldMappers;
|
|
|
|
import org.elasticsearch.index.mapper.MapperService;
|
|
|
|
import org.elasticsearch.index.query.IndexQueryParserService;
|
|
|
|
import org.elasticsearch.index.query.ParsedFilter;
|
|
|
|
import org.elasticsearch.index.query.ParsedQuery;
|
|
|
|
import org.elasticsearch.index.service.IndexService;
|
|
|
|
import org.elasticsearch.index.shard.service.IndexShard;
|
|
|
|
import org.elasticsearch.index.similarity.SimilarityService;
|
|
|
|
import org.elasticsearch.script.ScriptService;
|
|
|
|
import org.elasticsearch.search.Scroll;
|
|
|
|
import org.elasticsearch.search.SearchShardTarget;
|
2013-11-24 03:13:08 -08:00
|
|
|
import org.elasticsearch.search.aggregations.SearchContextAggregations;
|
2013-08-26 16:28:27 +02:00
|
|
|
import org.elasticsearch.search.dfs.DfsSearchResult;
|
|
|
|
import org.elasticsearch.search.fetch.FetchSearchResult;
|
2014-01-09 15:20:06 -07:00
|
|
|
import org.elasticsearch.search.fetch.fielddata.FieldDataFieldsContext;
|
2013-08-26 16:28:27 +02:00
|
|
|
import org.elasticsearch.search.fetch.partial.PartialFieldsContext;
|
|
|
|
import org.elasticsearch.search.fetch.script.ScriptFieldsContext;
|
|
|
|
import org.elasticsearch.search.fetch.source.FetchSourceContext;
|
|
|
|
import org.elasticsearch.search.highlight.SearchContextHighlight;
|
|
|
|
import org.elasticsearch.search.lookup.SearchLookup;
|
|
|
|
import org.elasticsearch.search.query.QuerySearchResult;
|
|
|
|
import org.elasticsearch.search.rescore.RescoreSearchContext;
|
|
|
|
import org.elasticsearch.search.scan.ScanContext;
|
|
|
|
import org.elasticsearch.search.suggest.SuggestionSearchContext;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
2014-01-15 17:58:22 -05:00
|
|
|
import java.util.Collections;
|
2013-08-26 16:28:27 +02:00
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
public class DefaultSearchContext extends SearchContext {
|
|
|
|
|
|
|
|
private final long id;
|
|
|
|
|
|
|
|
private final ShardSearchRequest request;
|
|
|
|
|
|
|
|
private final SearchShardTarget shardTarget;
|
|
|
|
|
|
|
|
private SearchType searchType;
|
|
|
|
|
|
|
|
private final Engine.Searcher engineSearcher;
|
|
|
|
|
|
|
|
private final ScriptService scriptService;
|
|
|
|
|
2013-12-03 16:02:31 +01:00
|
|
|
private final PageCacheRecycler pageCacheRecycler;
|
|
|
|
|
2014-02-26 16:40:15 +01:00
|
|
|
private final BigArrays bigArrays;
|
|
|
|
|
2013-08-26 16:28:27 +02:00
|
|
|
private final IndexShard indexShard;
|
|
|
|
|
|
|
|
private final IndexService indexService;
|
|
|
|
|
|
|
|
private final ContextIndexSearcher searcher;
|
|
|
|
|
|
|
|
private final DfsSearchResult dfsResult;
|
|
|
|
|
|
|
|
private final QuerySearchResult queryResult;
|
|
|
|
|
|
|
|
private final FetchSearchResult fetchResult;
|
|
|
|
|
|
|
|
// lazy initialized only if needed
|
|
|
|
private ScanContext scanContext;
|
|
|
|
|
|
|
|
private float queryBoost = 1.0f;
|
|
|
|
|
|
|
|
// timeout in millis
|
|
|
|
private long timeoutInMillis = -1;
|
|
|
|
|
2014-07-18 10:53:20 -04:00
|
|
|
// terminate after count
|
|
|
|
private int terminateAfter = DEFAULT_TERMINATE_AFTER;
|
|
|
|
|
2013-08-26 16:28:27 +02:00
|
|
|
|
|
|
|
private List<String> groupStats;
|
|
|
|
|
|
|
|
private Scroll scroll;
|
|
|
|
|
|
|
|
private boolean explain;
|
|
|
|
|
|
|
|
private boolean version = false; // by default, we don't return versions
|
|
|
|
|
|
|
|
private List<String> fieldNames;
|
2014-01-09 15:20:06 -07:00
|
|
|
private FieldDataFieldsContext fieldDataFields;
|
2013-08-26 16:28:27 +02:00
|
|
|
private ScriptFieldsContext scriptFields;
|
|
|
|
private PartialFieldsContext partialFields;
|
|
|
|
private FetchSourceContext fetchSourceContext;
|
|
|
|
|
|
|
|
private int from = -1;
|
|
|
|
|
|
|
|
private int size = -1;
|
|
|
|
|
|
|
|
private Sort sort;
|
|
|
|
|
|
|
|
private Float minimumScore;
|
|
|
|
|
|
|
|
private boolean trackScores = false; // when sorting, track scores as well...
|
|
|
|
|
|
|
|
private ParsedQuery originalQuery;
|
|
|
|
|
|
|
|
private Query query;
|
|
|
|
|
2013-12-16 12:11:06 +01:00
|
|
|
private ParsedFilter postFilter;
|
2013-08-26 16:28:27 +02:00
|
|
|
|
|
|
|
private Filter aliasFilter;
|
|
|
|
|
|
|
|
private int[] docIdsToLoad;
|
|
|
|
|
|
|
|
private int docsIdsToLoadFrom;
|
|
|
|
|
|
|
|
private int docsIdsToLoadSize;
|
|
|
|
|
2013-11-24 03:13:08 -08:00
|
|
|
private SearchContextAggregations aggregations;
|
|
|
|
|
2013-08-26 16:28:27 +02:00
|
|
|
private SearchContextHighlight highlight;
|
|
|
|
|
|
|
|
private SuggestionSearchContext suggest;
|
|
|
|
|
2014-01-15 17:58:22 -05:00
|
|
|
private List<RescoreSearchContext> rescore;
|
2013-08-26 16:28:27 +02:00
|
|
|
|
|
|
|
private SearchLookup searchLookup;
|
|
|
|
|
|
|
|
private boolean queryRewritten;
|
|
|
|
|
|
|
|
private volatile long keepAlive;
|
|
|
|
|
2014-01-31 01:46:02 +01:00
|
|
|
private ScoreDoc lastEmittedDoc;
|
|
|
|
|
2014-02-18 14:43:25 -05:00
|
|
|
private volatile long lastAccessTime = -1;
|
2013-08-26 16:28:27 +02:00
|
|
|
|
2014-01-31 01:46:02 +01:00
|
|
|
private volatile boolean useSlowScroll;
|
2013-08-26 16:28:27 +02:00
|
|
|
|
|
|
|
public DefaultSearchContext(long id, ShardSearchRequest request, SearchShardTarget shardTarget,
|
|
|
|
Engine.Searcher engineSearcher, IndexService indexService, IndexShard indexShard,
|
2014-08-21 10:56:35 +02:00
|
|
|
ScriptService scriptService, PageCacheRecycler pageCacheRecycler,
|
2014-02-26 16:40:15 +01:00
|
|
|
BigArrays bigArrays) {
|
2013-08-26 16:28:27 +02:00
|
|
|
this.id = id;
|
|
|
|
this.request = request;
|
|
|
|
this.searchType = request.searchType();
|
|
|
|
this.shardTarget = shardTarget;
|
|
|
|
this.engineSearcher = engineSearcher;
|
|
|
|
this.scriptService = scriptService;
|
2013-12-03 16:02:31 +01:00
|
|
|
this.pageCacheRecycler = pageCacheRecycler;
|
2014-05-21 13:37:03 +02:00
|
|
|
// SearchContexts use a BigArrays that can circuit break
|
|
|
|
this.bigArrays = bigArrays.withCircuitBreaking();
|
2013-08-26 16:28:27 +02:00
|
|
|
this.dfsResult = new DfsSearchResult(id, shardTarget);
|
|
|
|
this.queryResult = new QuerySearchResult(id, shardTarget);
|
|
|
|
this.fetchResult = new FetchSearchResult(id, shardTarget);
|
|
|
|
this.indexShard = indexShard;
|
|
|
|
this.indexService = indexService;
|
|
|
|
|
|
|
|
this.searcher = new ContextIndexSearcher(this, engineSearcher);
|
|
|
|
|
|
|
|
// initialize the filtering alias based on the provided filters
|
|
|
|
aliasFilter = indexService.aliasesService().aliasFilter(request.filteringAliases());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2014-04-11 11:18:49 +02:00
|
|
|
public void doClose() throws ElasticsearchException {
|
2013-08-26 16:28:27 +02:00
|
|
|
if (scanContext != null) {
|
|
|
|
scanContext.clear();
|
|
|
|
}
|
|
|
|
// clear and scope phase we have
|
2014-04-11 11:18:49 +02:00
|
|
|
Releasables.close(searcher, engineSearcher);
|
2013-09-30 22:50:29 +02:00
|
|
|
}
|
|
|
|
|
2013-08-26 16:28:27 +02:00
|
|
|
/**
|
|
|
|
* Should be called before executing the main query and after all other parameters have been set.
|
|
|
|
*/
|
|
|
|
public void preProcess() {
|
|
|
|
if (query() == null) {
|
|
|
|
parsedQuery(ParsedQuery.parsedMatchAllQuery());
|
|
|
|
}
|
|
|
|
if (queryBoost() != 1.0f) {
|
|
|
|
parsedQuery(new ParsedQuery(new FunctionScoreQuery(query(), new BoostScoreFunction(queryBoost)), parsedQuery()));
|
|
|
|
}
|
|
|
|
Filter searchFilter = searchFilter(types());
|
|
|
|
if (searchFilter != null) {
|
|
|
|
if (Queries.isConstantMatchAllQuery(query())) {
|
|
|
|
Query q = new XConstantScoreQuery(searchFilter);
|
|
|
|
q.setBoost(query().getBoost());
|
|
|
|
parsedQuery(new ParsedQuery(q, parsedQuery()));
|
|
|
|
} else {
|
|
|
|
parsedQuery(new ParsedQuery(new XFilteredQuery(query(), searchFilter), parsedQuery()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public Filter searchFilter(String[] types) {
|
|
|
|
Filter filter = mapperService().searchFilter(types);
|
|
|
|
if (filter == null) {
|
|
|
|
return aliasFilter;
|
|
|
|
} else {
|
|
|
|
filter = filterCache().cache(filter);
|
|
|
|
if (aliasFilter != null) {
|
|
|
|
return new AndFilter(ImmutableList.of(filter, aliasFilter));
|
|
|
|
}
|
|
|
|
return filter;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public long id() {
|
|
|
|
return this.id;
|
|
|
|
}
|
|
|
|
|
2013-09-30 22:50:29 +02:00
|
|
|
public String source() {
|
|
|
|
return engineSearcher.source();
|
|
|
|
}
|
|
|
|
|
2013-08-26 16:28:27 +02:00
|
|
|
public ShardSearchRequest request() {
|
|
|
|
return this.request;
|
|
|
|
}
|
|
|
|
|
|
|
|
public SearchType searchType() {
|
|
|
|
return this.searchType;
|
|
|
|
}
|
|
|
|
|
|
|
|
public SearchContext searchType(SearchType searchType) {
|
|
|
|
this.searchType = searchType;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public SearchShardTarget shardTarget() {
|
|
|
|
return this.shardTarget;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int numberOfShards() {
|
|
|
|
return request.numberOfShards();
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean hasTypes() {
|
|
|
|
return request.types() != null && request.types().length > 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
public String[] types() {
|
|
|
|
return request.types();
|
|
|
|
}
|
|
|
|
|
|
|
|
public float queryBoost() {
|
|
|
|
return queryBoost;
|
|
|
|
}
|
|
|
|
|
|
|
|
public SearchContext queryBoost(float queryBoost) {
|
|
|
|
this.queryBoost = queryBoost;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
Query Cache: Support shard level query response caching
The query cache allow to cache the (binary serialized) response of the shard level query phase execution based on the actual request as the key. The cache is fully coherent with the semantics of NRT, with a refresh (that actually ended up refreshing) causing previous cached entries on the relevant shard to be invalidated and eventually evicted.
This change enables query caching as an opt in index level setting, called `index.cache.query.enable` and defaults to `false`. The setting can be changed dynamically on an index. The cache is only enabled for search requests with search_type count.
The indices query cache is a node level query cache. The `indices.cache.query.size` controls what is the size (bytes wise) the cache will take, and defaults to `1%` of the heap. Note, this cache is very effective with small values in it already. There is also the advanced option to set `indices.cache.query.expire` that allow to control after a certain time of inaccessibility the cache will be evicted.
Note, the request takes the search "body" as is (bytes), and uses it as the key. This means same JSON but with different key order will constitute different cache entries.
This change includes basic stats (shard level, index/indices level, and node level) for the query cache, showing how much is used and eviction rates.
While this is a good first step, and the goal is to get it in, there are a few things that would be great additions to this work, but they can be done as additional pull requests:
- More stats, specifically cache hit and cache miss, per shard.
- Request level flag, defaults to "not set" (inheriting what the setting is).
- Allowing to change the cache size using the cluster update settings API
- Consider enabling the cache to query phase also when asking hits are involved, note, this will only include the "top docs", not the actual hits.
- See if there is a performant manner to solve the "out of order" of keys in the JSON case.
- Maybe introduce a filter element, that is outside of the request, that is checked, and if it matches all docs in a shard, will not be used as part of the key. This will help with time based indices and moving windows for shards that fall "inside" the window to be more effective caching wise.
- Add a more infra level support in search context that allows for any element to mark the search as non deterministic (on top of the support for "now"), and use it to not cache search responses.
closes #7161
2014-06-28 16:54:32 +02:00
|
|
|
protected long nowInMillisImpl() {
|
2013-08-26 16:28:27 +02:00
|
|
|
return request.nowInMillis();
|
|
|
|
}
|
|
|
|
|
|
|
|
public Scroll scroll() {
|
|
|
|
return this.scroll;
|
|
|
|
}
|
|
|
|
|
|
|
|
public SearchContext scroll(Scroll scroll) {
|
|
|
|
this.scroll = scroll;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2013-11-24 03:13:08 -08:00
|
|
|
@Override
|
|
|
|
public SearchContextAggregations aggregations() {
|
|
|
|
return aggregations;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public SearchContext aggregations(SearchContextAggregations aggregations) {
|
|
|
|
this.aggregations = aggregations;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2013-08-26 16:28:27 +02:00
|
|
|
public SearchContextHighlight highlight() {
|
|
|
|
return highlight;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void highlight(SearchContextHighlight highlight) {
|
|
|
|
this.highlight = highlight;
|
|
|
|
}
|
|
|
|
|
|
|
|
public SuggestionSearchContext suggest() {
|
|
|
|
return suggest;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void suggest(SuggestionSearchContext suggest) {
|
|
|
|
this.suggest = suggest;
|
|
|
|
}
|
|
|
|
|
2014-01-15 17:58:22 -05:00
|
|
|
public List<RescoreSearchContext> rescore() {
|
|
|
|
if (rescore == null) {
|
|
|
|
return Collections.emptyList();
|
|
|
|
}
|
|
|
|
return rescore;
|
2013-08-26 16:28:27 +02:00
|
|
|
}
|
|
|
|
|
2014-01-15 17:58:22 -05:00
|
|
|
public void addRescore(RescoreSearchContext rescore) {
|
|
|
|
if (this.rescore == null) {
|
2014-03-27 15:54:45 +01:00
|
|
|
this.rescore = new ArrayList<>();
|
2014-01-15 17:58:22 -05:00
|
|
|
}
|
|
|
|
this.rescore.add(rescore);
|
2013-08-26 16:28:27 +02:00
|
|
|
}
|
|
|
|
|
2014-01-09 15:20:06 -07:00
|
|
|
public boolean hasFieldDataFields() {
|
|
|
|
return fieldDataFields != null;
|
|
|
|
}
|
|
|
|
|
|
|
|
public FieldDataFieldsContext fieldDataFields() {
|
|
|
|
if (fieldDataFields == null) {
|
|
|
|
fieldDataFields = new FieldDataFieldsContext();
|
|
|
|
}
|
|
|
|
return this.fieldDataFields;
|
|
|
|
}
|
|
|
|
|
2013-08-26 16:28:27 +02:00
|
|
|
public boolean hasScriptFields() {
|
|
|
|
return scriptFields != null;
|
|
|
|
}
|
|
|
|
|
|
|
|
public ScriptFieldsContext scriptFields() {
|
|
|
|
if (scriptFields == null) {
|
|
|
|
scriptFields = new ScriptFieldsContext();
|
|
|
|
}
|
|
|
|
return this.scriptFields;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean hasPartialFields() {
|
|
|
|
return partialFields != null;
|
|
|
|
}
|
|
|
|
|
|
|
|
public PartialFieldsContext partialFields() {
|
|
|
|
if (partialFields == null) {
|
|
|
|
partialFields = new PartialFieldsContext();
|
|
|
|
}
|
|
|
|
return this.partialFields;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A shortcut function to see whether there is a fetchSourceContext and it says the source is requested.
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
public boolean sourceRequested() {
|
|
|
|
return fetchSourceContext != null && fetchSourceContext.fetchSource();
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean hasFetchSourceContext() {
|
|
|
|
return fetchSourceContext != null;
|
|
|
|
}
|
|
|
|
|
|
|
|
public FetchSourceContext fetchSourceContext() {
|
|
|
|
return this.fetchSourceContext;
|
|
|
|
}
|
|
|
|
|
|
|
|
public SearchContext fetchSourceContext(FetchSourceContext fetchSourceContext) {
|
|
|
|
this.fetchSourceContext = fetchSourceContext;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public ContextIndexSearcher searcher() {
|
|
|
|
return this.searcher;
|
|
|
|
}
|
|
|
|
|
|
|
|
public IndexShard indexShard() {
|
|
|
|
return this.indexShard;
|
|
|
|
}
|
|
|
|
|
|
|
|
public MapperService mapperService() {
|
|
|
|
return indexService.mapperService();
|
|
|
|
}
|
|
|
|
|
|
|
|
public AnalysisService analysisService() {
|
|
|
|
return indexService.analysisService();
|
|
|
|
}
|
|
|
|
|
|
|
|
public IndexQueryParserService queryParserService() {
|
|
|
|
return indexService.queryParserService();
|
|
|
|
}
|
|
|
|
|
|
|
|
public SimilarityService similarityService() {
|
|
|
|
return indexService.similarityService();
|
|
|
|
}
|
|
|
|
|
|
|
|
public ScriptService scriptService() {
|
|
|
|
return scriptService;
|
|
|
|
}
|
|
|
|
|
2013-12-03 16:02:31 +01:00
|
|
|
public PageCacheRecycler pageCacheRecycler() {
|
|
|
|
return pageCacheRecycler;
|
|
|
|
}
|
|
|
|
|
2014-02-26 16:40:15 +01:00
|
|
|
public BigArrays bigArrays() {
|
|
|
|
return bigArrays;
|
|
|
|
}
|
|
|
|
|
2013-08-26 16:28:27 +02:00
|
|
|
public FilterCache filterCache() {
|
|
|
|
return indexService.cache().filter();
|
|
|
|
}
|
|
|
|
|
2014-07-25 16:17:48 +02:00
|
|
|
@Override
|
|
|
|
public FixedBitSetFilterCache fixedBitSetFilterCache() {
|
|
|
|
return indexService.fixedBitSetFilterCache();
|
|
|
|
}
|
|
|
|
|
2013-08-26 16:28:27 +02:00
|
|
|
public IndexFieldDataService fieldData() {
|
|
|
|
return indexService.fieldData();
|
|
|
|
}
|
|
|
|
|
|
|
|
public long timeoutInMillis() {
|
|
|
|
return timeoutInMillis;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void timeoutInMillis(long timeoutInMillis) {
|
|
|
|
this.timeoutInMillis = timeoutInMillis;
|
|
|
|
}
|
|
|
|
|
2014-07-18 10:53:20 -04:00
|
|
|
@Override
|
|
|
|
public int terminateAfter() {
|
|
|
|
return terminateAfter;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void terminateAfter(int terminateAfter) {
|
|
|
|
this.terminateAfter = terminateAfter;
|
|
|
|
}
|
|
|
|
|
2013-08-26 16:28:27 +02:00
|
|
|
public SearchContext minimumScore(float minimumScore) {
|
|
|
|
this.minimumScore = minimumScore;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Float minimumScore() {
|
|
|
|
return this.minimumScore;
|
|
|
|
}
|
|
|
|
|
|
|
|
public SearchContext sort(Sort sort) {
|
|
|
|
this.sort = sort;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Sort sort() {
|
|
|
|
return this.sort;
|
|
|
|
}
|
|
|
|
|
|
|
|
public SearchContext trackScores(boolean trackScores) {
|
|
|
|
this.trackScores = trackScores;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean trackScores() {
|
|
|
|
return this.trackScores;
|
|
|
|
}
|
|
|
|
|
2013-12-16 12:11:06 +01:00
|
|
|
public SearchContext parsedPostFilter(ParsedFilter postFilter) {
|
|
|
|
this.postFilter = postFilter;
|
2013-08-26 16:28:27 +02:00
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2013-12-16 12:11:06 +01:00
|
|
|
public ParsedFilter parsedPostFilter() {
|
|
|
|
return this.postFilter;
|
2013-08-26 16:28:27 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public Filter aliasFilter() {
|
|
|
|
return aliasFilter;
|
|
|
|
}
|
|
|
|
|
|
|
|
public SearchContext parsedQuery(ParsedQuery query) {
|
|
|
|
queryRewritten = false;
|
|
|
|
this.originalQuery = query;
|
|
|
|
this.query = query.query();
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public ParsedQuery parsedQuery() {
|
|
|
|
return this.originalQuery;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The query to execute, might be rewritten.
|
|
|
|
*/
|
|
|
|
public Query 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() {
|
|
|
|
return from;
|
|
|
|
}
|
|
|
|
|
|
|
|
public SearchContext from(int from) {
|
|
|
|
this.from = from;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int size() {
|
|
|
|
return size;
|
|
|
|
}
|
|
|
|
|
|
|
|
public SearchContext size(int size) {
|
|
|
|
this.size = size;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean hasFieldNames() {
|
|
|
|
return fieldNames != null;
|
|
|
|
}
|
|
|
|
|
|
|
|
public List<String> fieldNames() {
|
|
|
|
if (fieldNames == null) {
|
|
|
|
fieldNames = Lists.newArrayList();
|
|
|
|
}
|
|
|
|
return fieldNames;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void emptyFieldNames() {
|
|
|
|
this.fieldNames = ImmutableList.of();
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean explain() {
|
|
|
|
return explain;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void explain(boolean explain) {
|
|
|
|
this.explain = explain;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Nullable
|
|
|
|
public List<String> groupStats() {
|
|
|
|
return this.groupStats;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void groupStats(List<String> groupStats) {
|
|
|
|
this.groupStats = groupStats;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean version() {
|
|
|
|
return version;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void version(boolean version) {
|
|
|
|
this.version = version;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int[] docIdsToLoad() {
|
|
|
|
return docIdsToLoad;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int docIdsToLoadFrom() {
|
|
|
|
return docsIdsToLoadFrom;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int docIdsToLoadSize() {
|
|
|
|
return docsIdsToLoadSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
public SearchContext docIdsToLoad(int[] docIdsToLoad, int docsIdsToLoadFrom, int docsIdsToLoadSize) {
|
|
|
|
this.docIdsToLoad = docIdsToLoad;
|
|
|
|
this.docsIdsToLoadFrom = docsIdsToLoadFrom;
|
|
|
|
this.docsIdsToLoadSize = docsIdsToLoadSize;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void accessed(long accessTime) {
|
|
|
|
this.lastAccessTime = accessTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
public long lastAccessTime() {
|
|
|
|
return this.lastAccessTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
public long keepAlive() {
|
|
|
|
return this.keepAlive;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void keepAlive(long keepAlive) {
|
|
|
|
this.keepAlive = keepAlive;
|
|
|
|
}
|
|
|
|
|
2014-01-31 01:46:02 +01:00
|
|
|
@Override
|
|
|
|
public void lastEmittedDoc(ScoreDoc doc) {
|
|
|
|
this.lastEmittedDoc = doc;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public ScoreDoc lastEmittedDoc() {
|
|
|
|
return lastEmittedDoc;
|
|
|
|
}
|
|
|
|
|
2013-08-26 16:28:27 +02:00
|
|
|
public SearchLookup lookup() {
|
|
|
|
// TODO: The types should take into account the parsing context in QueryParserContext...
|
|
|
|
if (searchLookup == null) {
|
|
|
|
searchLookup = new SearchLookup(mapperService(), fieldData(), request.types());
|
|
|
|
}
|
|
|
|
return searchLookup;
|
|
|
|
}
|
|
|
|
|
|
|
|
public DfsSearchResult dfsResult() {
|
|
|
|
return dfsResult;
|
|
|
|
}
|
|
|
|
|
|
|
|
public QuerySearchResult queryResult() {
|
|
|
|
return queryResult;
|
|
|
|
}
|
|
|
|
|
|
|
|
public FetchSearchResult fetchResult() {
|
|
|
|
return fetchResult;
|
|
|
|
}
|
|
|
|
|
|
|
|
public ScanContext scanContext() {
|
|
|
|
if (scanContext == null) {
|
|
|
|
scanContext = new ScanContext();
|
|
|
|
}
|
|
|
|
return scanContext;
|
|
|
|
}
|
|
|
|
|
|
|
|
public MapperService.SmartNameFieldMappers smartFieldMappers(String name) {
|
|
|
|
return mapperService().smartName(name, request.types());
|
|
|
|
}
|
|
|
|
|
|
|
|
public FieldMappers smartNameFieldMappers(String name) {
|
|
|
|
return mapperService().smartNameFieldMappers(name, request.types());
|
|
|
|
}
|
|
|
|
|
|
|
|
public FieldMapper smartNameFieldMapper(String name) {
|
|
|
|
return mapperService().smartNameFieldMapper(name, request.types());
|
|
|
|
}
|
|
|
|
|
|
|
|
public MapperService.SmartNameObjectMapper smartNameObjectMapper(String name) {
|
|
|
|
return mapperService().smartNameObjectMapper(name, request.types());
|
|
|
|
}
|
2014-01-31 01:46:02 +01:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean useSlowScroll() {
|
|
|
|
return useSlowScroll;
|
|
|
|
}
|
|
|
|
|
|
|
|
public DefaultSearchContext useSlowScroll(boolean useSlowScroll) {
|
|
|
|
this.useSlowScroll = useSlowScroll;
|
|
|
|
return this;
|
|
|
|
}
|
2013-08-26 16:28:27 +02:00
|
|
|
}
|