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

相关推荐
Java程序之猿42 分钟前
Spring Boot 集成spring-boot-starter-data-elasticsearch
spring boot·elasticsearch·jenkins
Elasticsearch1 小时前
如何增加 Elasticsearch 中的 primary shard 数量
elasticsearch
阿里云大数据AI技术1 小时前
阿里云 Elasticsearch Serverless 检索增强型 8.17 版来袭!
大数据·elasticsearch·serverless
星释4 小时前
GitLab-CI集成FTP自动发布
elasticsearch·ci/cd·gitlab
-曾牛10 小时前
Git完全指南:从入门到精通版本控制 ------- Git仓库创建 (5)
大数据·网络·git·学习·elasticsearch·个人开发
twj_one13 小时前
[ElasticSearch]Suggest查询建议(自动补全&纠错)
大数据·elasticsearch·搜索引擎
Willliam_william13 小时前
QEMU学习之路(8)— ARM32通过u-boot 启动Linux
linux·学习·elasticsearch
絮落锦乡19 小时前
ES DSL 常用修改语句
大数据·elasticsearch·搜索引擎
-曾牛19 小时前
Git完全指南:从入门到精通版本控制 ------- Git 查看提交历史(8)
大数据·git·学习·elasticsearch·个人开发
·云扬·19 小时前
【技术派后端篇】ElasticSearch 实战指南:环境搭建、API 操作与集成实践
大数据·elasticsearch·搜索引擎