一尘不染

elasticsearch滚动行为

elasticsearch

我在Elastic Search中遇到了滚动功能,这看起来很有趣。我浏览了许多文档,但对我而言仍然不清楚以下问题。

  1. 如果偏移量已经存在,那么为什么要使用滚动?
  2. 那即将到来的记录呢?假设它完成了所有数据的滚动,然后几秒钟后新数据进入了索引,那么它将如何工作?它还会滚动以获取新记录,例如流媒体吗?
  3. 假设由于服务器负载或Internet问题导致连接断开,那么它将从头开始滚动数据吗?

所有这些问题都与将数据从旧索引重新索引到新索引有关。


阅读 233

收藏
2020-06-22

共1个答案

一尘不染

我将尝试就此提供一些信息,因为我最近也对此进行了一些研究:

如果偏移量已经存在,那么为什么要使用滚动?

我不确定是否可以结合使用滚动和偏移量。但是我相信主要的区别是偏移查询将为您提供“假”结果。如果为False,它将正确执行查询,但是请考虑介于两者之间的所有更新。在重新索引方面,这将是错误的,因为您可能会丢失数据。想象一下,您对10k个结果进行了偏移量查询,然后花费2分钟来处理它。您可能会在2分钟内更新对象(或插入内容)。这意味着将查询偏移10k可能最终指向跳过中间几行的结果,或者指向已经存在的结果(想象之间的删除)。但是,Scroll保证保持搜索上下文有效,并以清晰,严格的方式返回结果,其中不考虑任何更新。

我想,所需的行为可以用一个恒定的分选+作为记录在这里搜索后实施:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-
request-search-
after.html 这应该可以使结果稳定(光标指向正确的偏移量),但是仍会考虑2个请求之间发生的所有更改(我认为)。

我想通过更改配置(例如logstash)开始将正确的文档插入新索引,然后滚动所有旧数据以将其重新索引到新索引中,从而可以进行重新索引。通过使用滚动,您仍然可以使用旧数据,而更改不会影响您的重新索引操作。

文件:

当搜索请求返回单个“页面”结果时,滚动API可用于从单个搜索请求中检索大量结果(甚至所有结果),其方式与在游标上使用光标的方式几乎相同传统数据库。

接下来:

那即将到来的记录呢?假设它完成了所有数据的滚动,然后几秒钟后新数据进入了索引,那么它将如何工作?它还会滚动以获取新记录,例如流媒体吗?

滚动将保留在第一个滚动请求上创建的结果。这是通过拍摄快照并防止将更改发布到特定滚动条来完成的。文件:

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

第三:

假设由于服务器负载或Internet问题导致连接断开,那么它将从头开始滚动数据吗?

没关系。Scroll带有一个POST /twitter/tweet/_search?scroll=1m分配,例如,赋值1m指示elasticsearch在ES服务器上保持搜索上下文有效的时间。这意味着,如果您的连接中断,您要做的就是拿起您的滚动ID并使用它创建一个新的请求。ES会将该ID与现有搜索上下文匹配,并为您提供预期的结果。文件:

为了使用滚动,初始搜索请求应在查询字符串中指定scroll参数,该参数告诉Elasticsearch它应将“搜索上下文”保持活动状态的时间(请参见使搜索上下文保持活动状态),例如?scroll
= 1m。

通常,所有这些信息都可以在这里找到:https :
//www.elastic.co/guide/en/elasticsearch/reference/current/search-request-
scroll.html

希望这可以帮助,

阿图尔

2020-06-22