`
kfcman
  • 浏览: 381839 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Elasticsearch搜索类型(query type)详

 
阅读更多

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的准确度更高。

 

参考资料:

http://www.elasticsearch.org/blog/understanding-query-then-fetch-vs-dfs-query-then-fetch/

分享到:
评论

相关推荐

    ElasticSearch SQL 教程

    If you (or others you know) are versed in SQL statements and newer to the Elasticsearch query syntax but want to benefit from the power Elasticsearch, this is the talk for you. After making its debut ...

    ElasticQuery:一个用于Elasticsearch的简单(Python)查询构建器

    ElasticQuery v3 一个用于Elasticsearch的简单查询构建器。 用pip install elasticquery 。 使用metod调用及其args / ... es = Elasticsearch (), index = 'mapping_test' , doc_type = 'doc_mapping' ) # Query

    elasql:通用SQL到Elasticsearch DSL查询转换器

    通用SQL到Elasticsearch DSL查询转换器。 专为设计 地位 实验性-加入我们,骇客入侵! 安装 npm install elasql 用法 const convert = require('elasql').convert convert('SELECT id,name FROM shop WHERE shop_id...

    elasticsearch-yara:ElasticSearch中的Yara匹配

    如果您使用的是其他版本的ElasticSearch,则必须ES 自己编译插件。 有关更多信息,请参见“编译”部分。 安装插件elasticsearch-plugin install file:///path-to-the-plugin/yara-search.zip 您现在可以运行如下...

    elasticsearch-web-export:使用基于 HTTPweb 的界面导出 Elasticsearch 数据

    弹性搜索网络出口使用 robbydyer 的使用基于 HTTP/web 的接口导出 Elasticsearch 数据这是一个非常基本的 elasticsearch 界面,可以在 Web 浏览器中使用,适用于不太熟悉命令行的用户(并且可能已经在使用 Kibana 的...

    ES数据导出工具-使用文档1

    配置文件名词解释index 数据索引type索引type,无则可留空,ES7.0以后删除query 查询条件DSL,必须为ES的查询语句,可留空,默认:查询全部

    elasticsearch-vectorize:Elasticsearch Vectorize插件

    Elasticsearch Vectorize插件Vectorize插件用于根据某些用户给定的规范返回。 在文档术语中,行对应于索引中的文档,而列对应于术语,或更确切地说,对应于与每个术语相关联的某个数值,例如tf或tf-idf。 这样的矩阵...

    中间件参数调优手册大全.pdf

    包含了常用的MySQL、Redis、RocketMQ、Kafka、Elasticsearch、PostgreSQL、ZooKeeper、Nacos、配置参数详细说明。 这份文档是工作中整理的,现在分享出来,希望给用到的同行提供个参考。 后续如果有其它开发中间件的...

    30.初识搜索引擎_快速掌握query string search语法以及_all metadata原理

    1、query string基础语法 查询包含test_field:test的数据: GET /test_index/test_type/_search?q=test_field:test 或 GET /test_index/test_type/_search?q=+test_field:test ---------------------------------...

    ghost-search:搜索鬼POC

    使用声波,elasticsearch的轻量级搜索替代方案为填充和搜索它提供了一个界面 使用 docker-compose up virtualenv venv $(which python3.9) source venv/bin/activate pip install -r requirements.txt # import ...

    sigmod2011全部论文(1)

    Location-Aware Type Ahead Search on Spatial Databases: Semantics and Efficiency (Page 361) Senjuti Basu Roy (University of Texas at Arlington) Kaushik Chakrabarti (Microsoft Research) Collective ...

    中文分词工具word-1.0,Java实现的中文分词组件多种基于词典的分词算法

    3、修改文件elasticsearch-1.1.0/config/elasticsearch.yml,新增如下配置: index.analysis.analyzer.default.type : "word" index.analysis.tokenizer.default.type : "word" 4、启动ElasticSearch测试效果,...

    borderfree_assessment_lambda_rest_api

    此仓库负责执行代码,该代码上载用于lambda函数以用作REST API后端的go代码,它的工作就是,等待来自AWS API网关的get请求,然后使用搜索查询将请求发送到ElasticSearch,然后发送相同的代码搜索结果作为对调用此...

    search-api-service

    搜索API 从源文章复制: : Upload a couple of fake documents, for example, documents found inside fake-data.json file. $ curl -X POST ...

    jQuery完全实例.rar

    在文档的第一个表单中,查找所有的单选按钮(即: type 值为 radio 的 input 元素)。 jQuery 代码: $("input:radio", document.forms[0]); --------------------------------------------------------------------...

    DN资源查看器

    GL_ARB_vertex_type_2_10_10_10_rev GL_ARB_viewport_array GL_ARB_window_pos GL_ATI_draw_buffers GL_ATI_envmap_bumpmap GL_ATI_fragment_shader GL_ATI_meminfo GL_ATI_separate_stencil GL_ATI_texture_...

    hls.min.js

    0,get:i})},e.n=function(t){var r=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(r,"a",r),r},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="/hls....

    Microsoft Visual C# 2013 Step by Step,最新资料

    CHAPTER 21 Querying in-memory data by using query expressions 485 CHAPTER 22 Operator overloading 511 PART IV BUILDING PROFESSIONAL WINDOWS 8.1 APPLICATIONS WITH C# CHAPTER 23 Improving throughput by...

    Bochs - The cross platform IA-32 (x86) emulator

    Changes in 2.4.6 (February 22, 2011): Brief summary : - Support more host OS to run on: - Include win64 native binary in the release. - Fixed failures on big endian hosts. - BIOS: Support for up to...

    rtl8188FU_linux_v5.2.11.1_22924.20170703.tar.gz

    obj-$(CONFIG_RTL8189ES) += rtl8189es/ obj-$(CONFIG_RTL8723BS) += rtl8723bs/ obj-$(CONFIG_ESP8089) += esp8089/ obj-$(CONFIG_ESP8089) += esp_prealloc/ obj-$(CONFIG_RTL8723BS_VQ0) += rtl8723bs_vq0/ 3...

Global site tag (gtag.js) - Google Analytics