- 简介
- query_then_fetch
- query_and_fetch
- dfs_query_and_fetch
- dfs_query_then_fetch
- count
- scan
简介
Elasticsearch允许通过指定搜索类型来选择查询在内部如何处理。不同的搜索类型适合不同的情况;可以只在乎性能,但有时查询的关联性可能是最重要的因素。使用search_type请求参数指定搜索类型,其各种取值介绍参考下文,其中size参数指定一次查询中返回的最大文档数。默认值为0。
在Elasticsearch代码中,会将上述几种搜索类型分隔成几个阶段phrases顺序执行,前提是可以分成两个阶段。比如query_and_fetch不能分解成两个阶段,只需一步就能完成查询。而dfs_query_then_fetch需要三个阶段。
这几种搜索类型最终会调用具体的搜索类SearchService,该类的介绍参考另一篇文章。
query_then_fetch
此搜索类型分两步,第一步:执行查询得到对文档进行排序和分级所需信息。这一步在所有的分片上执行。然后,只在相关分片上查询文档的实际内容。不同于query_and_fetch,此查询类型返回结果的最大数量等于size参数的值。默认使用这个类型。
public class TransportSearchQueryThenFetchAction extends TransportSearchTypeAction {
'''执行请求'''
@Override
protected void doExecute(SearchRequest searchRequest, ActionListener<SearchResponse> listener) {
new AsyncAction(searchRequest, listener).start();
}
private class AsyncAction extends BaseAsyncAction<QuerySearchResult> {
'''第一阶段是queryphrase'''
@Override
protected String firstPhaseName() {
return "query";
}
@Override
protected void sendExecuteFirstPhase(DiscoveryNode node, ShardSearchRequest request, SearchServiceListener<QuerySearchResult> listener) {
'''调用SearchServiceTransportAction发送query请求'''
searchService.sendExecuteQuery(node, request, listener);
}
'''在其父类TransportSearchTypeAction的onFirstPhaseResult函数中调用
在收到第一阶段的处理结果后转移到第二阶段'''
@Override
protected void moveToSecondPhase()
{ ... }
}
}
query_and_fetch
这通常是最快也最简单的搜索类型实现。查询在所有分片上并行执行(当然,任意一个主分片,只查询一个副本),所有分片返回等于size值的结果数。返回文档的最大数量等于size的值乘以分片的数量。
public class TransportSearchQueryAndFetchAction extends TransportSearchTypeAction {
'''执行请求'''
@Override
protected void doExecute(SearchRequest searchRequest, ActionListener<SearchResponse> listener) {
new AsyncAction(searchRequest, listener).start();
}
private class AsyncAction extends BaseAsyncAction<QuerySe