弹性搜索分页

And*_*rex 2 python elasticsearch

根据经验,使用 ES 进行分页的最佳方法是什么?目前,我正在开发一个后端使用 Elastic(通过 python)的 API,我的索引没有太多数据,所以默认情况下我们在 JavaScript(前端)中进行分页,我们没有问题。我想知道对于更大的索引,使用 Scroll API、切片或 search_after 进行分页的最佳方法是什么。

Nik*_*iev 9

在 Elasticsearch 中对搜索结果进行分页的默认方式是使用from/size参数。但是,这仅适用于前 10k 搜索结果。

万一你需要超越那个要走的路是search_after.

如果您需要转储整个索引,并且它包含超过 10k 的文档,请使用scrollAPI

有什么不同?

所有这些查询都允许检索部分搜索结果,但它们有很大的不同。

from/size 是最便宜和最快的,如果使用 Elasticsearch,Google 会使用它来访问第二、第三等搜索结果页面。

Scroll API 很昂贵,因为它会在您创建第一个查询的那一刻创建索引的一种快照,以确保在滚动结束时您将准确拥有开始时索引中存在的数据。执行滚动请求会消耗资源,并且并行运行许多请求会降低您的性能,因此请谨慎操作。

Search after 相反是两者之间的中间位置:

search_after不是自由跳转到随机页面的解决方案,而是并行滚动多个查询。它与scrollAPI非常相似,但不同的是,search_after参数是无状态的,它始终针对最新版本的搜索器进行解析。出于这个原因,排序顺序可能会在遍历过程中根据索引的更新和删除而改变。

因此,它将允许您在 10k 以上分页,但可能会产生一些不一致的成本。

为什么是 10k 限制?

index.max_result_window设置为 10k 作为硬性限制以避免内存不足的情况

index.max_result_window

搜索此索引时from+的最大值size。默认为 10000。搜索请求占用堆内存和时间与from+成正比size,这限制了内存。

切片卷轴呢?

切片滚动只是进行普通滚动的一种更快的方式:它允许并行下载文档集合。切片只是滚动查询输出中文档的一个子集。