弹性查询在插入后返回相同的结果

时间:2017-06-18 00:40:41

标签: elasticsearch elastic-beanstalk elasticsearch-plugin

我使用elasticsearch.js将文档从一个索引移动到另一个索引。

1a)查询所有文档的index_new并显示在页面上。 1b)使用index_old查询通过id获取文档。 2)使用insert to index_new,从index_old插入结果。 3)从index_old删除文档(按id)。

4)重新查询index_new以查看所有文档(包括新文档)。但是,此时,它返回与1a中返回的结果相同的结果列表。不包括新文件。

这是因为缓存吗?当我刷新整个页面并触发1a时,新文档就在那里......但不是没有刷新。

谢谢, 丹尼尔

1 个答案:

答案 0 :(得分:0)

这是由于每个分片和副本的elasticsearch索引内发生的段合并和刷新。

每当您写入索引时,您都不会写入原始索引文件,而是写入名为 segment 的较新的较小文件,然后在后台批处理作业中将其合并到较大的文件中。

您可能遇到的下一个问题是 这件事发生的次数或者如何控制

  1. 索引级别配置中有一个名为 refresh_interval 的设置。它可以有多个值,具体取决于您要使用的策略类型。

    refresh_interval -

  2. -1:要停止elasticsearch处理合并,并使用elasticsearch中的 _refresh API控制您。

    X:x是一个整数,其值为秒。因此,elasticsearch将每隔x秒刷新所有索引。

    1. 如果您在索引中启用了复制,那么您可能还会遇到结果值切换。发生这种情况只是因为索引具有多个分片并且分片具有多个副本。因此,不同的副本具有不同的窗口模式以进行刷新。因此,查询查询实际上会同时路由到不同的分片副本,并在时间窗口中显示不同的状态。
    2. 因此,如果您使用设置来设置刷新间隔的周期,则假设在 max 的下一个X到2X秒内具有一致状态。

      Segment Merge Background details

      https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-refresh.html

      https://www.elastic.co/guide/en/elasticsearch/reference/5.4/indices-update-settings.html