我在java中进行了一个外观的集成测试,它做了一些事情,其中包括对弹性搜索数据库的索引操作。这个弹性搜索数据库已经非常天真地设置(开箱即用的东西实际上,我在学习fase)。 插件在外观内部使用java api完成,也非常天真,示例几乎完全从弹性搜索中复制粘贴,如下所述:http://www.elasticsearch.org/guide/reference/java-api/index_.html。
然后我测试我的外观是否正确地完成了它的东西,部分是检查该文档是否真的插入数据库中。我再次按照弹性在其网站上描述的方式进行:http://www.elasticsearch.org/guide/reference/java-api/search.html。我插入一个带有特定负载的文档,并以相同的方式查找。
如果我在调试中运行并在facade之后设置了一个断点,那么这个测试是有效的,但是如果我没有放置这个断点或者没有在调试中运行它会失败并且没有找到结果。这让我觉得我真的做错了什么。此外,应用程序本身也可以工作(插入等),因此我的集成测试可能有问题,而不是我的复制粘贴代码。
我想在索引操作返回之后,索引还没有真正完成,或者有一些复制在搜索之前没有完成,或类似的东西,但它让我想到了什么,我可以'似乎也解决了它。 我没有尝试将弹性放在一个节点和一个碎片上,也许那里有一些错误,但我真的没看到究竟是什么,所以我还没走那条路。 就像我说的,刚刚开始使用弹性,所以我可能会遗漏一些关键和初学者风格的东西。如果需要,我可以粘贴我的确切代码,但就像我说的那样归结为在测试中使用弹性搜索网站的两个代码片段。
卡斯帕
答案 0 :(得分:22)
在调用索引操作后,Elasticsearch不会立即使数据可用。默认情况下,等待1秒即可获得更多数据。但是,您可以强制弹性搜索通过调用refresh
:
client.admin().indices().refresh(refreshRequest()).actionGet();
在检查最终结果之前,请在完成索引之后尝试添加此操作。
答案 1 :(得分:3)
无法找到refreshRequest方法。我曾经使用过类似的东西,现在似乎正在运作。我会做更多的测试
client.admin().indices().refresh(new RefreshRequest(indexName)).actionGet();
其中indexName是要刷新的索引的String名称