【问题标题】:Elastic Search GET doesn't give latest documentElastic Search GET 不提供最新文档
【发布时间】:2017-07-13 09:34:05
【问题描述】:

我使用的是 Elastic 5.1.2 版本。我正在使用 Elastic java Restclient 从 Elastic 搜索中发布和查询文档。

当我在 POST 操作后立即使用 GET 操作时,我没有得到准确的文档计数。如果我在 POST 和 GET 之间睡眠 > 1 秒,那么 GET 操作能够给出准确的计数。

我的操作流程是: 1) 使用 POST 操作发布新交易(文档)。 2) 使用 GET 操作检索总文档数。这是在 POST 之后。

我在想,Elastic 需要时间来更新索引。这是 Elasticsearch 还是我的任何设置的问题。请帮忙

【问题讨论】:

    标签: java elasticsearch


    【解决方案1】:

    这是正常行为!当您索引新数据时,它不会立即可用,但会在下一次刷新之后,默认情况下每秒发生一次。

    如果这让您感到困扰,您有几个选择:

    1. 您可以在发布文档后调用/_refresh endpoint,这将立即刷新您的索引,并且下一次 GET 调用将起作用
    2. 您可以在索引文档时在 POST 调用中添加 ?refresh=true parameter,这与 1 的作用基本相同
    3. 您可以在索引文档时在 POST 调用中添加?refresh=wait_for parameter,该调用仅在发生刷新操作时返回,以便下一次 GET 调用将返回文档
    4. 您可以减少设置中的index.refresh_interval(默认为 1 秒),以便更频繁地进行刷新操作。

    只知道从性能的角度来看,实现您想要的最不激进的方法是 3,即这是 ES 5 中引入的一个新参数,它不会强制刷新您的索引,但只会在新索引的文档后返回可供搜索。过于频繁地强制刷新(1、2 和 3)会影响您的性能。

    【讨论】:

    • 谢谢瓦尔。我担心刷新时的性能。尽管如此,我在这里给出了示例数据,但我的实际用例每秒有 30 个 txns,需要高性能和正确的计数,而无需等待 1 秒。由于这是弹性的正常行为,因此我必须选择一个选项,并且我倾向于选项 3。感谢您提供详细的参考答案。
    • 在这种情况下,这个答案也可能有帮助:stackoverflow.com/questions/31499575/…
    • 感谢您指出解决方法。正如我所说,它是大批量应用程序,我们不会陷入这样的情况:发布 1 笔交易并调用 get,这将在 1 秒后刷新,在 1 秒的持续时间内,我提交了 10 多笔交易。对于第 11 笔交易,我的 get 操作是在第 1 条 txn 帖子的 1 秒之后。我的第 11 笔交易会包括所有 11 笔交易吗?还是这样,即使我们之间有刷新,每个帖子都会在 1 秒后刷新?
    • 您可以在每个刷新窗口内执行任意数量的 POST,但是当刷新发生时,在刷新之前发布的任何内容都将可供搜索
    • 感谢您澄清这一点。
    猜你喜欢
    • 1970-01-01
    • 2018-08-01
    • 2018-08-02
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多