我将尝试提供一些有关此的信息,因为我最近也对此进行了一些研究:
如果偏移量已经存在,那么为什么要使用滚动?
我不确定您是否可以将滚动与偏移结合使用。但我相信主要区别在于偏移查询会给你“错误”的结果。 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
希望这会有所帮助,
阿图尔