【问题标题】:Elastic Search Scroll Behaviour弹性搜索滚动行为
【发布时间】:2016-11-03 12:24:09
【问题描述】:

我在 Elastic Search 中发现了滚动功能,这看起来很有趣。我浏览了很多文件,但我仍然不清楚以下问题。

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

所有这些问题都在将数据从旧索引重新索引到新索引的上下文中。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

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

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

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

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

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

    文档:

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

    下一个:

    即将到来的唱片呢?假设它完成滚动所有数据 然后几秒钟后新数据进入索引,然后它是如何 将工作?它还会滚动以获取新记录,例如流式传输吗?

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

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

    第三个:

    假设连接因服务器负载或互联网问题而中断, 那么它会从开始滚动数据吗?

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

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

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

    希望这会有所帮助,

    阿图尔

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 2021-11-23
      • 2018-10-26
      相关资源
      最近更新 更多