检查 Elasticsearch 是不是已完成索引

Posted

技术标签:

【中文标题】检查 Elasticsearch 是不是已完成索引【英文标题】:Check if Elasticsearch has finished indexing检查 Elasticsearch 是否已完成索引 【发布时间】:2017-08-29 10:03:21 【问题描述】:

有没有办法检查 Elasticsearch 是否已完成处理我的请求? 我想为我的应用程序执行集成测试,检查插入后是否可以找到记录。 例如,如果我提出以下请求:

POST /_all/_bulk
  
   "update":  
      "_id":419,
      "_index":"popc",
      "_type":"offers"
   

  
   "doc":  
      "id":"419",
      "author":"foo bar",
      "number":"642-00419"
   ,
   "doc_as_upsert":true

我立即检查,测试失败,因为 Elasticsearch 需要一些时间来完成我的请求。 如果我在断言之前睡 1 秒钟,它大部分时间都有效,但并非总是如此。 我可以将睡眠时间延长到例如。 3 秒,但它使测试非常慢,因此我的问题。

我尝试过使用cat pending tasks 和pending cluster tasks 端点,但响应总是空的。

如果其中任何一个相关,我正在使用 Elasticsearch 5.4Laravel Scout 3.0.5tamayo/laravel-scout-elastic 3.0.3

【问题讨论】:

【参考方案1】:

我找到了这个 PR:https://github.com/elastic/elasticsearch/pull/17986

您可以使用refresh: wait_for,只有在您的数据可供搜索时,Elasticsearch 才会响应。

【讨论】:

也有官方文档:elastic.co/guide/en/elasticsearch/reference/current/… 这很好地解决了问题。我发现,按照@dshockley 的建议,将 refresh_interval 设置为较低的数字以进行测试也可以节省大量时间。【参考方案2】:

您可以等待回复;当您收到对更新请求的响应时,它就完成了(您不会在待处理或当前任务中看到它)。我认为您遇到的问题可能与刷新间隔有关(请参阅dynamic settings)。索引文档不能立即用于搜索,这是它们可用之前的(最大)时间量。 (您可以根据您的用例更改此设置,或使用此设置让您知道在搜索集成测试之前需要休眠多长时间。)

如果您想查看正在进行的任务,可以使用tasks api。

【讨论】:

谢谢,我已将index.refresh_interval 设置为1ms,对于 1000 次测试运行,睡眠 600 毫秒总是足够的。

以上是关于检查 Elasticsearch 是不是已完成索引的主要内容,如果未能解决你的问题,请参考以下文章

检查elasticsearch中是不是存在文档

优化 Elasticsearch 索引

ElasticSearch 自动完成/按令牌建议

检查所有 AsyncTask 是不是已完成

定期检查是不是所有线程都已完成

检查 Google 是不是已完成显示结果