`

Elasticsearch搜索类型(query type)详解

    博客分类:
  • ES
ES 
阅读更多
es在查询时,可以指定搜索类型为:
QUERY_THEN_FETCH:查询结果和需要的结果一致,查询速度慢;
QUERY_AND_FEATCH:查询的结果比实际结果多;
DFS_QUERY_THEN_FEATCH:比QUERY_THEN_FETCH精度更高,查询最慢;
DFS_QUERY_AND_FEATCH:比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://elasticsearch.cn/article/102
分享到:
评论

相关推荐

    02-Elasticsearch 8.x 向量搜索使用详解 杭州 1.6 2024

    **Elasticsearch 8.x 向量搜索使用详解** Elasticsearch 8.x 版本引入了对向量搜索的支持,这使得它能够处理非结构化的数据,如图像、文本和语音的语义搜索。向量搜索是通过将数据转换为高维向量并进行相似度比较来...

    php 的elasticsearch拓展

    **PHP的Elasticsearch扩展详解** 在Web开发中,Elasticsearch已经成为了一个强大的搜索引擎和数据分析平台,尤其在处理大量实时数据时,其高效、灵活的特点得到了广泛应用。PHP作为后端开发的主流语言之一,与...

    elasticsearch-2.3.4_IK_HEAD

    **Elasticsearch 2.3.4 和 IK Head 插件详解** Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,它能够处理大量的数据并提供快速的搜索、分析和实时的数据存储功能。在版本 2.3.4 中,Elastic...

    Elastic Search实战

    1. **查询语句(Query)**:Elasticsearch支持多种查询方式,如全文搜索、范围查询、布尔查询等,可以组合使用构建复杂的查询条件。 2. **聚合(Aggregation)**:允许对搜索结果进行统计分析,如求平均值、最大值...

    elasticsearch-net-api 离线文档

    **Elasticsearch-Net-API 离线文档详解** Elasticsearch-Net-API 是一个针对 Elasticsearch 的 .NET 客户端库,它为 .NET 开发者提供了与 Elasticsearch 数据存储和检索服务交互的强大工具。本离线文档将帮助你深入...

    java操作elasticsearch5.x的demo

    Java操作Elasticsearch 5.x的Demo详解 在大数据时代,Elasticsearch作为一个高效、可扩展的全文搜索引擎,被广泛应用于日志分析、实时监控、数据挖掘等领域。本篇文章将详细解析如何使用Java API来操作Elastic...

    elasticsearch-java中文文档 -5.6.3版本

    **Elasticsearch-Java中文文档5.6.3版本详解** Elasticsearch是一款高度可扩展的开源全文搜索引擎,被广泛应用于大数据分析、日志聚合、实时搜索等领域。Java API是与Elasticsearch进行交互的主要方式之一,使得...

    Elasticsearch笔记

    ### Elasticsearch核心知识点详解 #### 1. Elasticsearch简介 Elasticsearch是一种分布式的、基于REST的搜索引擎,它能够处理大量的数据并提供快速的搜索响应。它建立在Lucene之上,但提供了一个更为简单和统一的...

    ElasticSearch java开发Demo(5.1.5)_Javaelasticsearch_ES使用java开发_ela

    **Elasticsearch Java 开发详解** Elasticsearch 是一个分布式、全文检索的搜索引擎,它以其高效、可扩展和易用性而广泛应用于日志分析、信息检索、网站搜索等领域。在Java环境中,我们可以使用官方提供的Java API...

    ElasticSearch入门篇.docx

    ### ElasticSearch 入门知识点详解 #### 一、ElasticSearch 概览 **1.1 ElasticSearch 的使用案例** ElasticSearch 在多个领域有着广泛的应用案例,这充分证明了其在大规模数据处理和搜索方面的强大能力。 - **...

    elasticsearch-analysis-ik-7.6.2

    **Elasticsearch Analysis IK 7.6.2 知识点详解** Elasticsearch 是一个开源的全文搜索引擎,被广泛应用于大数据分析、日志搜索、信息检索等领域。它基于 Lucene 库,提供了分布式、实时、高可扩展的搜索和分析能力...

    es(elasticsearch)整合SpringCloud(SpringBoot)搭建教程详解

    在本教程中,我们将探讨如何将Elasticsearch与SpringBoot和SpringCloud进行集成,以便在微服务架构中利用Elasticsearch强大的搜索和分析能力。Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,而...

    elasticsearch拼音分词器

    **Elasticsearch 拼音分词器详解** 在中文信息检索和文本处理领域,分词是基础且关键的一环。Elasticsearch(简称ES)作为一个强大的全文搜索引擎,提供了多种分词器,其中包括针对中文环境的拼音分词器。本文将...

    elasticsearch-analysis-ik-7.15.2.zip

    《Elasticsearch IK分词器详解及其实现过程》 在大数据时代,搜索引擎技术成为了信息检索的关键工具,其中Elasticsearch作为一款强大的全文搜索引擎,因其高效、可扩展性以及灵活性,被广泛应用于各种数据检索场景...

    elasticsearch及其教程

    Elasticsearch(简称ES)是一款基于Lucene的开源全文搜索引擎,它以其分布式、实时、高可扩展性以及强大的搜索能力而受到广泛赞誉。它不仅用于搜索,还常被用作数据分析和数据存储平台。Elasticsearch采用JSON文档型...

    elasticsearch数据库下载、配置、使用案例

    ### Elasticsearch 数据库下载、配置与使用案例详解 #### 一、Elasticsearch 概述 Elasticsearch 是一款基于 Lucene 开发的分布式搜索引擎和分析系统,能够高效地处理大量数据,并提供快速的搜索响应。它支持多种...

    elasticsearch-sql插件

    **Elasticsearch-SQL插件详解** Elasticsearch-SQL插件是针对Elasticsearch(ES)设计的一个重要工具,它使得用户能够使用SQL(结构化查询语言)来查询、管理和操作Elasticsearch中的数据。SQL是传统数据库系统中...

    Elasticsearch 教程与案例.docx

    ### Elasticsearch 教程与案例详解 #### 一、Elasticsearch 概述 Elasticsearch 是一款基于 Lucene 的开源搜索引擎。它具有分布式、RESTful 风格的特点,能够处理大量的数据,并提供几乎实时的全文搜索和数据分析...

    深入探索:Elasticsearch 的 RESTful API 揭秘

    #### Elasticsearch RESTful API 的基本操作详解 ##### 3.1 创建索引 创建索引是使用 Elasticsearch 的第一步。索引相当于数据库中的表,用于组织和存储相关的文档集合。例如,下面的代码展示了如何创建一个名为 `...

    Python-ElasticSearch搜索查询的讲解

    ### Python-ElasticSearch搜索查询详解 #### 引言 Elasticsearch作为一个强大的分布式搜索和分析引擎,被广泛应用于各类应用场景中,例如日志数据分析、实时应用程序监控以及网站搜索等。其核心特性在于能够处理...

Global site tag (gtag.js) - Google Analytics