14

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

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

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

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

卡斯帕

4

2 回答 2

23

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

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

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

于 2012-10-17T14:15:29.133 回答
3

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

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

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

于 2013-12-28T13:45:49.397 回答