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的准确度更高。
分享到:
相关推荐
Elasticsearch的核心概念包括索引(Index)、类型(Type)、文档(Document)和节点(Node)。在Elasticsearch 7.x版本后,类型已被废弃,所有文档直接存入索引中。索引用于存储相似数据,文档是索引中的最小存储...
Elasticsearch是一个开源的、分布式搜索引擎,常用于大数据分析和实时搜索。Spring Boot与Elasticsearch的集成使得在Java环境中处理 Elasticsearch变得更加简单高效。 首先,我们要了解Spring Data Elasticsearch,...
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 ...
**Elasticsearch 8.x 向量搜索使用详解** Elasticsearch 8.x 版本引入了对向量搜索的支持,这使得它能够处理非结构化的数据,如图像、文本和语音的语义搜索。向量搜索是通过将数据转换为高维向量并进行相似度比较来...
Elasticsearch是一个开源的全文搜索引擎,基于Lucene构建,设计用于分布式、实时的搜索和分析引擎。它不仅提供搜索功能,还支持数据分析、日志收集等多种用途。这本书《Elasticsearch权威指南》是学习Elasticsearch...
Elasticsearch是一个强大的开源搜索引擎,广泛应用于大数据分析和实时数据检索。它采用了分布式、RESTful方式工作,并且具有高可用性和可扩展性。在实际开发中,为了方便操作Elasticsearch,开发者通常会封装一些...
在Web开发中,Elasticsearch已经成为了一个强大的搜索引擎和数据分析平台,尤其在处理大量实时数据时,其高效、灵活的特点得到了广泛应用。PHP作为后端开发的主流语言之一,与Elasticsearch的集成是常见的需求。在...
Elasticsearch提供了丰富的API和搜索语法,如Term Query、Match Query、Bool Query等,可以根据业务需求进行扩展。 总的来说,通过Spring MVC与Elasticsearch的集成,我们可以轻松地在Web应用中利用Elasticsearch的...
在IT行业中,Elasticsearch是一种极其重要的开源全文搜索引擎,它基于Lucene库,提供分布式、实时、可扩展的搜索和分析功能。而PHP是广泛应用于Web开发的编程语言,因此,将Elasticsearch与PHP结合使用能为开发者...
Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,被广泛用于实时的索引和搜索,尤其在大数据分析领域表现突出。在这个基于Elasticsearch 2.1.1的Java API基本操作代码示例中,我们将探讨如何利用Java ...
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,它能够处理大量的数据并提供快速的搜索、分析和实时的数据存储功能。在版本 2.3.4 中,Elasticsearch 提供了更稳定和优化的性能,适用于各种规模的...
Elasticsearch(简称ES)是一种基于Lucene的开源搜索引擎,主要设计用于分布式、实时的文档存储和搜索。它不仅能够高效地处理结构化和非结构化的数据,还提供了数据分析的功能,使得用户可以在海量数据中快速获取...
searchSourceBuilder.query(QueryBuilders.matchQuery("message", "elasticsearch")); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions...
Elasticsearch 7.14.3 是一个高级的全文搜索和分析引擎,广泛应用于大数据检索、日志分析、实时监控等领域。这个压缩包“elasticsearch7.14.3.rar”包含了该版本的完整安装文件,使得用户可以直接在本地进行安装和...
Elasticsearch的数据模型是基于文档的,每个文档属于一个索引(Index),索引由一个或多个类型(Type)组成,虽然在较新版本中,Type已经被废弃,但概念仍然存在。每个文档都有一个唯一的ID,通过映射(Mapping)...
- **查询(Query)**:Elasticsearch支持丰富的查询语法,包括全文搜索、短语搜索、范围搜索等,能快速准确地找到所需数据。 - **聚合(Aggregation)**:用于对搜索结果进行统计分析,如求平均值、最大值、最小值...
而Elasticsearch作为一个强大的搜索引擎和数据分析工具,被广泛应用于日志分析、监控、推荐系统等领域。本教程将深入探讨如何将Spring Boot与Elasticsearch进行整合,以构建高效、灵活的数据检索和分析应用。 首先...
5. **类型(Type)**:在Elasticsearch 7.x及更高版本中已被弃用,之前用于在一个索引中组织文档的类别。现在,所有的文档都属于“_doc”类型。 6. **映射(Mapping)**:定义索引中字段的属性,如数据类型、是否可被...