ElasticSearch 开发总结(九)——SearchType:DFS_QUERY_THEN_FETCH和QUERY_THEN_FETCH

ElasticSearch 开发总结(九)------SearchType:DFS_QUERY_THEN_FETCH和QUERY_THEN_FETCH-CSDN博客

1.SearchType

ES的搜索类型 有一个类SearchType(如下图示),关于该类的描述:

Search type represent the manner at which the search operation is executed.

ES的搜索分scatter/gather两个步骤:

scatter阶段:客户端向10个分片发起搜索请求;

gather阶段:10个分片完成搜索,符合条件的结果返回;

客户端,将返回的结果进行重新拍下和排名,最后返回给用户。

搜索面临的两个问题:

问题1:假如集群一个节点有10个分片,词语"土豆"在分片的相关性从分片0到分片9依次降低(即分片0存储词语"土豆"相关性最大,分片9相关性最小),如果搜索词语"土豆"需要10个分片的计算;

问题2:如果针对特定的分片进行搜索,因为词语"土豆"在每个分片的相关性不一致,可能返回的结果也存在偏差。

针对以上问题,ES给允许设置search_type来解决上述问题

SearchType共四种类型:

1、query and fetch

向索引的所有分片(shard)都发出查询请求,各分片返回的时候把元素文档(document)和计算后的排名信息一起返回。这种搜索方式是最快的。因为相比下面的几种搜索方式,这种查询方法只需要去shard查询一次。但是各个shard返回的结果的数量之和可能是用户要求的size的n倍。

2、query then fetch(默认的搜索方式)

如果你搜索时,没有指定搜索方式,就是使用的这种搜索方式。这种搜索方式,大概分两个步骤,第一步,先向所有的shard发出请求,各分片只返回排序和排名相关的信息(注意,不包括文档document),然后按照各分片返回的分数进行重新排序和排名,取前size个文档。然后进行第二步,去相关的shard取document。这种方式返回的document与用户要求的size是相等的。

3、DFS query and fetch

这种方式比第一种方式多了一个初始化散发(initial scatter)计算全局词频(term frequencies)步骤,有这一步,据说可以更精确控制搜索打分和排名。先对所有分片发送请求, 把所有分片中的词频和文档频率等打分依据全部汇总到一块, 再执行后面的操作。优点很明显,数据量是准确并且排名也准确,但性能是最差的。

4、DFS query then fetch

比第2种方式多了一个初始化散发(initial scatter)计算全局词频(term frequencies)步骤,过程与上一种类似,优点是排名准确,但返回的数据量不准确,可能返回(N*分片数量)的数据。。

2.日志分析,ElasticSearch的搜索有慢查询

使用DFS_QUERY_THEN_FETCH类型进行搜索,运维反应有慢查询:

search_type[DFS_QUERY_THEN_FETCH], total_shards[5], source[{"from":0,"size":200,"query":{"bool":{"filter":[{"term":{"isMarketable":true}},{"term":{"isAppSale":true}},{"terms":{"saleType":[0,2]}},{"term":{"categoryId":10}}]}},"explain":false}], extra_source

建议,把DFS_QUERY_THEN_FETCH类型修改为QUERY_THEN_FETCH(默认)类型

3.引用与知识

DFS类型的搜索,精度高,但是搜索的效率低;

非DFS类型的搜索,精度低,但是效率高;

DFS类型适合微调,大部分场景下应该用不到,除非业务有需要。

ElasticSearch版本6.6,官网:SearchType


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/HuoqilinHeiqiji/article/details/103460430

相关推荐
Dusk_橙子8 小时前
在elasticsearch中,document数据的写入流程如何?
大数据·elasticsearch·搜索引擎
喝醉酒的小白10 小时前
Elasticsearch 中,分片(Shards)数量上限?副本的数量?
大数据·elasticsearch·jenkins
熟透的蜗牛13 小时前
Elasticsearch 8.17.1 JAVA工具类
elasticsearch
九圣残炎16 小时前
【ElasticSearch】 Java API Client 7.17文档
java·elasticsearch·搜索引擎
risc12345619 小时前
【Elasticsearch】HNSW
elasticsearch
我的棉裤丢了19 小时前
windows安装ES
大数据·elasticsearch·搜索引擎
乙卯年QAQ21 小时前
【Elasticsearch】RestClient操作文档
java·大数据·elasticsearch·jenkins
超级阿飞1 天前
利用Kubespray安装生产环境的k8s集群-实施篇
elasticsearch·容器·kubernetes
小诺大人2 天前
Docker 安装 elk(elasticsearch、logstash、kibana)、ES安装ik分词器
elk·elasticsearch·docker
forestsea2 天前
【Elasticsearch 】 聚合分析:桶聚合
大数据·elasticsearch·搜索引擎