Elasticsearch From/Size、Scroll、Search After对比

这篇具有很好参考价值的文章主要介绍了Elasticsearch From/Size、Scroll、Search After对比。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Elasticsearch From/Size、Scroll、Search After对比

From/Size

可以使用from和size参数对结果进行分页。from参数定义要获取的第一个结果的偏移量。 size 参数允许您配置要返回的最大匹配数。

简单来说,需要查询from + size 的条数时,coordinate node就向该index的其余的shards 发送同样的请求,等汇总到(shards * (from + size))条数时在coordinate node再做一次排序,最终抽取出真正的 from 后的 size 条结果。

注意from + size 不能超过 index.max_result_window 索引设置,默认为 10,000。 有关深入滚动的更有效方法,请参阅 Scroll 或 Search After API。

示例

举个例子,一个索引,有10亿数据,分10个shards,然后,一个搜索请求,from=1,000,000,size=100,这时候,会带来严重的性能问题:

  • CPU
  • 内存
  • IO
  • 网络带宽

CPU、内存和IO消耗容易理解,网络带宽问题稍难理解一点。在query阶段,每个shards需要返回1,000,100条数据给coordinating node,而coordinating node需要接收10*1,000,100条数据,即使每条数据只有_doc _id 和_score,这数据量也很大了,而且,这才一个查询请求,那如果再乘以100呢?

在另一方面,我们意识到,这种深度分页的请求并不合理,因为我们是很少人为的看很后面的请求的,在很多的业务场景中,都直接限制分页,比如只能看前100页。

Search Type

在执行分布式搜索时可以执行不同的执行路径。分布式搜索操作需要分散到所有相关的shard,然后收集所有的结果。当使用分散/集中类型执行时,有几种方法可以做到这一点,特别是使用搜索引擎。

执行分布式搜索时的一个问题是从每个shard检索多少结果。例如,如果我们有 10 个shard,则第一个shard可能保存从 0 到 10 的最相关的结果,而其他shard的结果排在后面。因此,在执行请求时,我们需要从所有shard中获取从0到10的结果,对它们进行排序,然后返回结果(如果我们希望确保得到正确的结果)。

与搜索引擎相关的另一个问题是每个shard独立存在的事实。当在特定shard上执行查询时,它不会考虑来自其他shard上term频率及(其他shard上)搜索引擎的信息。如果我们想要支持准确的排名,我们需要首先收集所有shard中的term频率,以计算全局term频率,然后使用这些term频率对每个shard执行查询。

此外,由于需要对结果进行排序,在维护正确的排序行为的同时,获取大型文档集,甚至是滚动它,可能是一个非常昂贵的操作。对于大型结果集滚动,如果返回文档的顺序不重要,则最好按_doc排序。

Elasticsearch非常灵活,可以根据每个搜索请求控制执行的搜索类型。可以通过设置查询字符串中的search_type参数来配置类型。类型是:

Query Then Fetch

参数值: query_then_fetch。

请求分两个阶段处理。 在第一阶段,查询被转发到所有涉及的分片。 每个分片执行搜索并生成对该分片本地的结果的排序列表。 每个分片只向协调节点返回足够的信息,以允许其合并并将分片级结果重新排序为全局排序的最大长度大小的结果集。

在第二阶段期间,协调节点仅从相关分片请求文档内容(以及高亮显示的片段,如果有的话)。

如果您未在请求中指定 search_type,那么这是默认设置。

Dfs, Query Then Fetch

参数值:dfs_query_then_fetch

与 “Query Then Fetch” 相同,除了初始分散阶段,该阶段计算分布式term频率以获得更准确的评分。

Scroll与Search After 都依赖于Search Type

Search After

在日志服务架构设计中日志搜索后翻页、日志上下文的功能就是通过search_after实现的。

在官网文档中可以看出Search After有以下特点:

  • 实时
  • 可以深度分页(使用前一页的结果来帮助检索下一页)
  • 不支持跳页

注意:每个文档具有一个唯一值的字段应用作排序规范的仲裁。 否则,具有相同排序值的文档的排序顺序将是未定义的。建议的方法是使用字段 _uid(elasticsearch 6.x _uid 废弃 替换为_id),它确保每个文档包含一个唯一值。

The _id field is restricted from use in aggregations, sorting, and scripting. In case sorting or aggregating on the _id field is required, it is advised to duplicate the content of the _id field into another field that has doc_values enabled.
_id 字段被限制在聚合、排序和脚本中使用。 如果需要对 _id 字段进行排序或聚合,建议将 _id 字段的内容复制到另一个启用了 doc_values 的字段中。

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-id-field.html

Scroll

虽然搜索请求返回单个 “page” 的结果,但是滚动 API 可以用于从单个搜索请求中检索大量结果(甚至是所有结果),与在传统数据库上使用游标的方式大致相同。

滚动不是用于实时用户请求,而是用于处理大量数据,例如, 以便将一个索引的内容重新索引到具有不同配置的新索引中。

从滚动请求返回的结果反映了进行初始搜索请求时索引的状态,如时间快照。 对文档(索引,更新或删除)的后续更改只会影响以后的搜索请求。

可以把 scroll 分为初始化和遍历两步,初始化时将所有符合搜索条件的搜索结果缓存起来,可以想象成快照,在遍历时,从这个快照里取数据,也就是说,在初始化后对索引插入、删除、更新数据都不会影响遍历结果。

滚动请求具有优化,使排序顺序为_doc时更快。 如果你想迭代所有文档,无论顺序如何,这是最有效的选择:

GET /_search?scroll=1m
{
  "sort": [
    "_doc"
  ]
}

Keeping the search context alive

滚动参数(传递到搜索请求和每个滚动请求)告诉Elasticsearch应该保持搜索上下文活动的时间。其值(例如,1m,请参阅 “Time unit” 一节)不需要足够长以处理所有数据 - 它只需要足够长的时间来处理前一批结果。每个滚动请求(具有滚动参数)设置新的到期时间。

通常,后台合并过程通过将较小的段合并在一起以创建新的较大段来优化索引,此时较小的段被删除。此过程在滚动期间继续,但是打开的搜索上下文防止旧段在它们仍在使用时被删除。这就是Elasticsearch如何能够返回初始搜索请求的结果,而不考虑对文档的后续更改。

小结

如果要做非常多页的查询时,search after是一个常量查询延迟和开销,并无什么副作用,可是,就像要查询结果全量导出那样,要在短时间内不断重复同一查询成百甚至上千次,效率就显得非常低了。

2023-03-18现在不用纠结了 😭 😭 😭 😭 😭 😭

Elasticsearch From/Size、Scroll、Search After对比

https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html#scroll-search-results

search after是lucene原生支持的:
https://lucene.apache.org/core/8_0_0/core/org/apache/lucene/search/IndexSearcher.html
https://lucene.apache.org/core/8_0_0/core/org/apache/lucene/search/IndexSearcher.html#searchAfter-org.apache.lucene.search.ScoreDoc-org.apache.lucene.search.Query-int-

猜测一下search after的实现原理,应该是通过doc_values来实现的
doc_values已经排好序了,所以通过每次search_after指定的值,往后查找即可

Elasticsearch From/Size、Scroll、Search After对比

本文内容来自官方文档,主要是做了翻译及汇总。文章来源地址https://www.toymoban.com/news/detail-404159.html

到了这里,关于Elasticsearch From/Size、Scroll、Search After对比的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • elasticsearch 深度分页查询 Search_after(图文教程)

    前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 search_after 是 Elasticsearch 提供的一种分页查询方式,它可以用来在已经排序的结果集中进行分页查询。 search_after查询步骤如下(下面有具体的例子帮助理解):

    2024年04月11日
    浏览(47)
  • Java客户端调用elasticsearch进行深度分页查询 (search_after)

    前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 具体的Search_after解释,可以看我这篇文章 elasticsearch 深度分页查询 Search_after(图文教程) 参考:https://blog.csdn.net/qq_44056652/article/details/126341810 作者:神的孩子

    2024年03月22日
    浏览(50)
  • Elasticsearch 使用scroll滚动技术实现大数据量搜索、深度分页问题 和 search

    基于scroll滚动技术实现大数据量搜索 如果一次性要查出来比如10万条数据,那么性能会很差,此时一般会采取用scroll滚动查询,一批一批的查,直到所有数据都查询完为止。 scroll搜索会在第一次搜索的时候,保存一个当时的视图快照,之后只会基于该旧的视图快照提供数据搜

    2024年02月14日
    浏览(50)
  • elasticsearch结果窗口限制10000[from+size小于或等于10000]

    Elasicsearch版本7.8,执行DSL查询 结果Elasicsearch报如下错误 其实Elasicsearch这个错误已经提示的很明显了,甚至提出了解决方案。大概意思是说:结果窗口太大,from+size必须小于或等于10000,但我们检索的DSL中from+size=10001。我们在查询大量数据时可以采用 scroll api 这种高效的方式。

    2024年02月16日
    浏览(35)
  • Elasticsearch使用msearch提高聚合效率(与search检索对比)

    数据量共约3000万+,在使用es进行term聚合的时候,发现执行耗费时间巨大,因此采用了msearch的检索方式 多搜索接口编辑 多搜索 API 从单个 API 请求执行多个搜索。 请求的格式类似于批量 API 格式,并使用 换行符分隔的 JSON (NDJSON) 格式。 结构类型于下 使用kibana进行msearch操

    2024年02月12日
    浏览(43)
  • Learning from Dialogue after Deployment: Feed Yourself, Chatbot!

    对于一个 bot 来说,它一生中看到的最多的对话是出现在它被部署到生产环境之后,这就产生了大量未被利用的训练数据。本文提出一种 自馈对话机器人(self-feeding chatbot) ,它能够从它自己参与的对话中自动抽取新的训练样本。 在该 bot 参与对话的过程中,它还会评估用户

    2024年02月09日
    浏览(35)
  • Elasticsearch Search API之(Request Body Search 查询主体)

    sentence 句子,使用Java的BreakIterator确定的下一个句子边界处的突出显示片段。您可以使用boundary_scanner_locale指定要使用的区域设置。unified highlighter高亮器默认行为。 word 单词,由Java的BreakIterator确定的下一个单词边界处高亮显示的片段。 boundary_scanner_locale 区域设置。该参数采

    2024年04月09日
    浏览(47)
  • Java elasticsearch scroll模板实现

    scroll 的使用场景: 大数据量的检索和操作 scroll 顾名思义,就是游标的意思,核心的应用场景就是遍历 elasticsearch中的数据; 通常我们遍历数据采用的是分页,elastcisearch还支持 from size 的方式进行分页查询,使用 from and size 的深度分页,比如说 ?size=10from=10000 ,因为 100,000 排

    2024年02月10日
    浏览(37)
  • Elasticsearch Search API之(Request Body Search 查询主体)(1)

    “failed”:0 }, “hits”:{ “total”:1, “max_score”:0.2876821, “hits”:[ { “_index”:“map_highlighting_01”, “_type”:“_doc”, “_id”:“erYsbmcBeEynCj5VqVTI”, “_score”:0.2876821, “_source”:{ “context”:“城中西路可以受理外地二代身份证的办理。” }, “highlight”:{ // @1 “context”:[ “城中西

    2024年04月13日
    浏览(49)
  • ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 88 from C head

    这个错误常见于Numpy包的版本不兼容问题。这通常是由以下原因导致的: Python版本更新:可能是Python版本更新导致原先安装的Numpy包不再兼容。 Numpy版本更新:Numpy的一些旧版本包含的二进制文件与最新版本不兼容。 解决办法 是重新安装一个兼容的Numpy版本。 尝试使用以下命

    2024年02月14日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包