es在查询时,可以指定搜索类型为QUERY_THEN_FETCH,QUERY_AND_FEATCH,DFS_QUERY_THEN_FEATCH和DFS_QUERY_AND_FEATCH。那么这4种搜索类型有什么区别?
分布式搜索背景介绍:
ES天生就是为分布式而生,但分布式有分布式的缺点。比如要搜索某个单词,但是数据却分别在5个分片(Shard)上面,这5个分片可能在5台主机上面。因为全文搜索天生就要排序(按照匹配度进行排名),但数据却在5个分片上,如何得到最后正确的排序呢?ES是这样做的,大概分两步。
step1、ES客户端会将这个搜索词同时向5个分片发起搜索请求,这叫Scatter,
step2、这5个分片基于本Shard独立完成搜索,然后将符合条件的结果全部返回,这一步叫Gather。
客户端将返回的结果进行重新排序和排名,最后返回给用户。也就是说,ES的一次搜索,是一次scatter/gather过程(这个跟mapreduce也很类似).
然而这其中有两个问题。
第一、数量问题。比如,用户需要搜索"双黄连",要求返回最符合条件的前10条。但在5个分片中,可能都存储着双黄连相关的数据。所以ES会向这5个分片都发出查询请求,并且要求每个分片都返回符合条件的10条记录。当ES得到返回的结果后,进行整体排序,然后取最符合条件的前10条返给用户。这种情况,ES5个shard最多会收到10*5=50条记录,这样返回给用户的结果数量会多于用户请求的数量。
第二、排名问题。上面搜索,每个分片计算分值都是基于自己的分片数据进行计算的。计算分值使用的词频率和其他信息都是基于自己的分片进行的,而ES进行整体排名是基于每个分片计算后的分值进行排序的,这就可能会导致排名不准确的问题。如果我们想更精确的控制排序,应该先将计算排序和排名相关的信息(词频率等)从5个分片收集上来,进行统一计算,然后使用整体的词频率去每个分片进行查询。
这两个问题,估计ES也没有什么较好的解决方法,最终把选择的权利交给用户,方法就是在搜索的时候指定query type。
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)步骤,有这一步,据说可以更精确控制搜索打分和排名。
4、DFS query then fetch

比第2种方式多了一个初始化散发(initial scatter)步骤。

DSF是什么缩写?初始化散发是一个什么样的过程?
从es的官方网站我们可以指定,初始化散发其实就是在进行真正的查询之前,先把各个分片的词频率和文档频率收集一下,然后进行词搜索的时候,各分片依据全局的词频率和文档频率进行搜索和排名。显然如果使用DFS_QUERY_THEN_FETCH这种查询方式,效率是最低的,因为一个搜索,可能要请求3次分片。但,使用DFS方法,搜索精度应该是最高的。
至于DFS是什么缩写,没有找到相关资料,这个D可能是Distributed,F可能是frequency的缩写,至于S可能是Scatter的缩写,整个单词可能是分布式词频率和文档频率散发的缩写。
总结一下,从性能考虑QUERY_AND_FETCH是最快的,DFS_QUERY_THEN_FETCH是最慢的。从搜索的准确度来说,DFS要比非DFS的准确度更高。

转载于:https://www.cnblogs.com/pypua/articles/9445255.html

Elasticsearch搜索类型(query type)详解相关推荐

  1. Elasticsearch中字段类型(Field Type)详解

    ElasticSearch 7.7 字段类型(Field datatype)详解 字符串, object, 数值, 日期, 数组, 0x00 字符串: text, keyword 5.0以后,stri ...

  2. Oracle PL/SQL存储过程对象类型Object type详解 create type obj_type as object, create table tab_name of obj_type

    原 oracle 对象类型 object type 置顶 2011年06月13日 18:00:00 oypj2010 阅读数:3453 /* 对象类型属于用户自定义的一种复合类型,它封装了数据结构和拥 ...

  3. ElasticSearch 全文搜索引擎的查询详解①(Ubuntu版 v6.6.2)

    ElasticSearch 全文搜索引擎的查询详解①(Ubuntu版 v6.6.2) 1. 前提 2. 轻量搜索 2.1 单条件查询 2.2 多条件查询 2.3 不指定属性查询(查询所有文档属性)-- ...

  4. 【转载】salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解...

    salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解 建立好的数据表在数据库中查看有很多方式,本人目前采用以下两种方式查看数据表. 1.采用schema ...

  5. elasticsearch性能测试工具rally深入详解

    Elasticsearch性能测试工具rally深入详解题记 elasticsearch性能测试研究了很久,自己想过通过批量导入数据,然后记录时间,统计CPU.内存等变化,计算得出某个性能指标.但显然 ...

  6. mysql text类型 使用方法_MySQL使用TEXT/BLOB类型的知识点详解

    一.TEXT和BLOB的区别 TEXT和BLOB家族之间仅有的不同是BLOB类型存储的是二进制数据,没有排序规则或字符集,而TEXT类型有字符集或排序规则.说白了如果要储存中文则选择TEXT. 二.默 ...

  7. 自定义PMD检测的类型集合(详解)

    自定义PMD检测的类型集合 PMD所能检测的类型(八大种) 使用方法 使用xml配置文件配置多条规则 1.在resources目录下写个配置文件 settings.xml(命名无要求) 2.confi ...

  8. HubbleDotNet开源全文搜索数据库项目--技术详解

    HubbleDotNet开源全文搜索数据库项目--技术详解 HubbleDotNet 简介 HubbleDotNet 和 Lucene.net 性能对比测试 HubbleDotNet 和 Lucene ...

  9. Spring Data JPA 之 @Query 语法详解及其应用

    5 Spring Data JPA 之 @Query 语法详解及其应用 5.1 快速体验 @Query 的方法 沿⽤我们之前的例⼦,新增⼀个 @Query 的⽅法: // 通过 query 注解根据 ...

最新文章

  1. 大规模集群自动化部署SSH无密码登陆
  2. 基于FT5x06嵌入式Linux电容触摸屏驱动
  3. RxJs fromEvent 工作原理分析
  4. App in Scala
  5. 极验创始人吴渊:恶意流量威胁新趋势,揭秘网络黑产3大核心本质
  6. jeesite中activiti中的流程表梳理
  7. 因未发项目奖金,一程序员删代码泄愤被判刑5个月
  8. Arcgis空间自相关Moran I(莫兰指数)
  9. 下一代宽带策略控制系统走向何方?
  10. 搜索思维[PPT制作]
  11. 第十二章 软件壳(四)(代码抽取型壳)
  12. 算法实现: OTP(One-Time Pad) 一次一密密码本 加解密
  13. 计算机电源输出电压 电流,电脑USB接口的输出电压以及电流你知道吗?
  14. 修改计算机ip地址cmd,win7系统通过命令提示符将系统修改为静态IP地址的方法【图文】...
  15. 低功耗基础——Lib文件中对ICG的描述
  16. SpringBoot-使用分页插件(PageHelper)
  17. web351-360(ctfshow刷题记录)
  18. mac 移动硬盘装linux系统安装教程,移动硬盘上安装Ubuntu系统
  19. Qwt Plot Magnifier 缩放以鼠标为中心
  20. Google黑客语法总结

热门文章

  1. 关于计算机工作的诗歌,提高计算机工作及上网效率的方法
  2. php底层运行机制(二)
  3. Makefile系列之五 :函数
  4. k8s glusterfs mysql_k8s使用glusterfs实现动态持久化存储
  5. 启动ubuntu无反应_奔驰E200轿车启动无反应检修
  6. PhoneGap在Microsoft Visual Studio Express For Wi...
  7. Android4.4点击无响应,webview某些超链接点击无响应的问题
  8. php 内存池,内存详解: 详解PHP内存池中的存储层_php
  9. LINUX 邮件服务器qmail 架设
  10. 使用驱动器h中的光盘之前需要将其格式化怎么办_电脑磁盘显示未分配怎么办?磁盘数据如何恢复?...