弹性搜索滚动行为

时间:2016-11-03 12:24:10

标签: elasticsearch

我在弹性搜索中遇到了滚动功能,这看起来非常有趣。我经历了这么多文件,但仍然不清楚我的问题。

  1. 如果已经存在偏移,那么为什么要使用滚动?
  2. 即将发布的唱片怎么样?假设它已完成滚动所有数据,然后几秒后新数据进入索引,那么它将如何工作?是否会滚动以获取新记录,例如流媒体?
  3. 假设连接因服务器负载或互联网问题而中断,那么它会从启动滚动数据吗?
  4. 所有这些问题都在重新索引从旧索引到新索引的数据的背景下。

1 个答案:

答案 0 :(得分:3)

我会尽力提供一些信息,因为我最近也做了一些研究:

  

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

我不确定您是否可以将滚动与偏移结合使用。但我认为主要区别在于偏移查询会给你“假”结果。在它的方面是错误的将正确执行您的查询,但考虑之间的所有更新。在重建索引方面,由于您存在数据松散的风险,因此这将是错误的。想象一下,你做了10k结果的偏移查询,然后花了2分钟来处理它。您可能会在2分钟内更新对象(或插入)。这意味着将您的查询偏移10k可能最终指向跳过其间的几行的结果,或者指向已经存在的结果(想象中间的删除)。但是,Scroll保证保持搜索上下文的活动状态,并以清晰严格的方式返回结果,不会考虑更新。

我认为所需的行为可以通过常规排序+搜索实现,如下所示:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-search-after.html 这应该使结果稳定(反过来光标指向偏移正确)但是它仍然会考虑在2个请求之间发生的所有更改(我认为)。

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

文档:

  

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

下一个:

  

即将发布的记录怎么样?假设它已完成滚动所有数据   然后几秒后新数据进入索引,然后如何   将工作?是否会滚动以获取新记录,如流媒体?

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

  

滚动请求返回的结果反映了状态   在初始搜索请求发生时的索引,   就像快照一样。文件的后续更改(索引,   更新或删除)只会影响以后的搜索请求。

第三名:

  

假设由于服务器负载或互联网问题导致连接中断,   然后它会从开始滚动数据吗?

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

  

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

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

希望这有帮助,

Artur