【问题标题】:Integration test elastic search, timing issue, document not found集成测试elasticsearch,计时问题,找不到文档
【发布时间】:2018-11-19 15:19:46
【问题描述】:

我在 java 中进行了一个外观的集成测试,它做了一些事情,其中​​包括对弹性搜索数据库的索引操作。这个弹性搜索数据库的设置非常天真(实际上是开箱即用的东西,我正在学习中)。 插入在该外观内完成,使用 java api,也非常天真,示例几乎完全从弹性搜索中复制粘贴,如下所述:http://www.elasticsearch.org/guide/reference/java-api/index_.html

之后我测试了我的外观是否正确地完成了它的工作,其中一部分是检查该文档是否真的被插入到数据库中。我再次按照弹性在他们的网站上描述的方式这样做:http://www.elasticsearch.org/guide/reference/java-api/search.html。我插入具有特定负载的文档并以相同的方式查找它。

如果我在调试中运行并在外观完成后设置断点,则此测试有效,但如果我不放置此断点或不在调试中运行,它会失败并且找不到结果。这让我觉得我真的做错了什么。此外,应用程序本身可以工作(插入等),所以我的集成测试可能有问题,而不是我复制粘贴的代码。

我猜在索引操作返回之后,索引还没有真正完成,或者在搜索之前有一些复制没有完成,或者类似的事情,但它让我不知道究竟是什么,我可以'似乎也解决了它。 我还没有尝试将弹性放在一个节点和一个分片上,也许那里有问题,但我真的不知道到底是什么,所以我还没有走那条路。 就像我说的,刚开始使用弹性,所以我可能会遗漏一些重要的和初学者风格的东西。如果需要,我可以粘贴我的确切代码,但就像我说的那样,它归结为在测试中使用来自弹性搜索站点的两个代码 sn-ps。

卡斯帕

【问题讨论】:

  • 如果它是从调试中运行的,但不是在您刚刚运行时运行,那么您的测试开始似乎是在启动一个新线程,然后不等待线程完成。

标签: java elasticsearch


【解决方案1】:

Elasticsearch 不会在调用索引操作后立即提供数据。默认情况下,它会等待 1 秒以等待更多数据到达。但是,您可以通过调用 refresh 来强制 elasticsearch 使所有数据立即可用:

client.admin().indices().refresh(refreshRequest()).actionGet();

尝试在外观完成索引后添加此操作,然后再检查最终结果。

【讨论】:

  • 恐怕我只能在明天晚上检查,但我怀疑是这样的。感谢您的快速答复。我是否正确理解,在需要索引操作之后,弹性搜索不会立即索引,而是等待更多索引请求到达,然后执行某种更有效的批处理索引?同时索引操作返回的ListenableActionFuture已经声明索引操作完成(actionGet没问题),但实际上还没有索引?这是怎么回事(如果你明白我的话)?
  • 是的,我想,你可以这样想。从技术上讲,当返回索引操作时,数据被“索引”,但直到一秒钟后才“提交”,因此在这一秒内搜索者无法获得数据。但是,如果您在索引后立即调用 GET 而不是搜索操作,您将返回最新版本的数据。
  • 好的,非常感谢,帮我省了一些挫折:-)。如果可以的话,我会投票 ;-)。
  • @imotov - 如果你在维也纳停留,我欠你一杯啤酒 ;-)
  • 如果使用REST api,可以点击index/_refresh,见elastic.co/guide/en/elasticsearch/reference/current/…
【解决方案2】:

找不到 refreshRequest 方法。我用过这样的东西,现在似乎可以工作了。我会做更多的测试

client.admin().indices().refresh(new RefreshRequest(indexName)).actionGet();

其中 indexName 是要刷新的索引的字符串名称

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2015-08-20
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    相关资源
    最近更新 更多