我在弹性搜索中遇到了滚动功能,这看起来非常有趣。我经历了这么多文件,但仍然不清楚我的问题。
所有这些问题都在重新索引从旧索引到新索引的数据的背景下。
答案 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