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_typeDFS_QUERY_THEN_FETCH, total_shards5, 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

相关推荐
Elasticsearch19 小时前
深入解析 simdvec:Elasticsearch 如何利用神经网络和视频编解码 CPU 指令实现向量搜索
elasticsearch
Elasticsearch2 天前
一条命令。自然语言。你的 Elasticsearch 数据,直接进入终端
elasticsearch
vivo互联网技术2 天前
从 10 分钟到 1 秒:ES 深度分页任意跳页的三轮优化实战
服务器·数据库·redis·elasticsearch·深度分页
Elasticsearch2 天前
热力直达:使用 Elasticsearch 插件将 ES|QL 引入你的 Grafana 仪表板
elasticsearch
小猿姐2 天前
唯品会大规模数据库云原生实践:基于 KubeBlocks 管理数千实例的统一运维之路
运维·elasticsearch·云原生
Elasticsearch3 天前
使用 Elastic Agent Builder 和 Sarvam AI 构建多语言语音 agent
elasticsearch
武子康7 天前
调查研究-197 FAISS vs Elasticsearch 全面对比:从向量检索、全文搜索到 RAG 选型指南
人工智能·elasticsearch·agent
Elasticsearch8 天前
Elasticsearch ES|QL:现已支持视图、子查询和读取时模式定义
elasticsearch
Elasticsearch11 天前
Kibana 中的 SNMP 拓扑数据:从采集到 Canvas
elasticsearch