Elastic Search - 滚动行为

Nag*_*Nag 3 elasticsearch

我遇到了至少两种可能的方法来批量获取结果。

  1. 滚动API

  2. 分页 - From 、 Size 参数

根本的区别是什么?我假设#1 允许滚动记录,而#2 允许您一次获取一批记录。如果我只是使用不同的 From 、 Size 参数来驱动分页,是否有可能在不同批次中返回相同的记录?

Val*_*Val 6

使用from/size是对结果进行分页的默认且最简单的方法。默认情况下,它最多只能工作到 10000 的大小。您可以增加该限制,但不建议增加太多,因为深度分页会降低集群的性能。

滚动API将允许您对所有数据进行分页。它的工作方式是创建一个搜索上下文(即开始滚动时的数据快照),然后您将获得一个光标来对所有数据进行分页。完成后,您可以关闭搜索上下文。创建的搜索上下文具有相关成本(需要状态,因此需要内存),因此这种分页方式不适合实时分页(更适合批量分页)。

还有另一种方法可以滚动所有数据,而无需每次创建专用搜索上下文的额外成本,它称为search_after. 在这种风格中,其想法是对数据进行排序,然后将排序值用作轻量级游标。它可能有一些缺点,例如,如果您不断索引新数据,则可能会面临丢失上一个“页面”上出现的新数据的风险。

在 7.10 中,将有另一种对数据进行分页的方法,称为时间点搜索 (PIT)。这里的想法是再次创建一个上下文,以便您可以在两个不同的调用中尽快返回命中和聚合(稍后)。

更新

7.10 于 2020 年 11 月 11 日发布,现在也可以进行时间点搜索。