我正在为使用Elasticsearch的应用编写一些集成测试,我遇到了一种奇怪的行为。如果我插入一个文档然后我直接查询,我每次都得到不同的结果。 我怀疑,虽然插入本身会返回,但索引本身不会同步发生,因此,查询将试验具有不可预测结果的竞争条件。
如果是这种情况:有同步方法,那么当我运行查询时,我知道它们已经准备好并且成功了吗?
更多细节:我使用的是elasticsearch embedded,查询是一个简单的过滤器。唯一奇怪的是我正在使用文档模型的模板文件。
编辑:我甚至尝试在插入后通过ID获取文档,但查询仍会返回随机结果(除非我将线程Sleep等待几秒钟。)
答案 0 :(得分:10)
来自Elasticsearch docs for the index API:
刷新
在操作发生后立即刷新索引,这样 文档立即出现在搜索结果中,刷新 参数可以设置为true。将此选项设置为true应该是唯一的 经过仔细的思考和验证,它不会导致 从索引和搜索角度来看,性能都很差。 请注意,使用get API获取文档完全是实时的。
这就是我的查询返回奇怪结果的原因。因为索引有时还没有完成。此外,可以不作为插入的一部分进行刷新using the _refresh
endpoint:
$ curl -XPOST 'http://localhost:9200/twitter/_refresh'