Elasticsearch源码分析十四--搜索类型

本文详细探讨了Elasticsearch的六种搜索类型:query_then_fetch、query_and_fetch、dfs_query_and_fetch、dfs_query_then_fetch、count以及scan。通过对这些搜索类型的分析,帮助读者深入理解Elasticsearch的查询机制和优化策略。
摘要由CSDN通过智能技术生成
  • 简介
  • 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值