1

我们在 Rails 应用程序上使用 ElasticSearch 和 Tire gem。对于我们的集成测试,我们在每个示例之前删除并重新创建索引,类似于

Foo.index.delete
Foo.create_elasticsearch_index

其中Foo包括Tire::Model::Persistence. 但是当我们在 CI 上运行我们的测试套件时,我们开始时不时地出现缺少索引的错误。我继续并启用了调试,然后我在日志中发现了以下内容:

# 2013-10-04 09:25:05:839 [DELETE] ("test_index")
#
curl -X DELETE http://some-server:9200/test_index

# 2013-10-04 09:25:05:840 [200]
#
# {
#   "ok": true,
#   "acknowledged": true
# }

# 2013-10-04 09:25:05:852 [HEAD] ("test_index")
#
curl -I "http://some-server:9200/test_index"

# 2013-10-04 09:25:05:852 [200]

如您所见,我得到了 DELETE 请求的 200 ok 响应,但是当 Tyre 在创建索引之前执行 HEAD 请求以查看索引是否存在时,它仍然返回 200 而不是 404。这是随机发生的,大多数情况下它工作正常的时间,但在测试套件中的某个时候它会失败。

我尝试在删除和创建操作之间等待黄色状态,但它不起作用。所以我的问题是,删除索引操作是否以某种方式异步?(在 ES 文档上找不到任何关于此的内容)。有什么方法可以等待索引被删除?(因为黄色状态不起作用)。

编辑:感谢@PinnyM 的澄清。所以通过 HTTP API的所有操作确实是异步的。所以剩下的问题是,我怎样才能等待索引被删除,以便我可以再次创建它?

4

2 回答 2

1

在每个示例之前,您删除并重新创建索引。exists作为该过程的一部分,您可以通过轮询要返回的函数来确保删除过程已(异步)完成false......在蹩脚的伪代码中......

max_wait = 5
while wait < max_wait and Tire.index("test_index").exists:
    wait some more
    if wait > max_wait:
        throw WaitedTooLongException()

轮胎文档exist在这里 - 基本上他们正在执行您在调试代码中找到的相同索引轮询: http ://rubydoc.info/github/karmi/tire/master/Tire/Index#exists?-instance_method这是调用:http ://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-exists.html

就个人而言,我会调整您使用 ES 实例的测试......如果您在测试开始时放置不存在循环并在测试结束时删除索引,那么您可以获得两个好处。你可以:

  • 断言测试开始时索引不存在 - 干净整洁。
  • 在测试结束时要求删除索引并运行下一个可能不需要 ES 的测试 - 可能会稍微加快速度,具体取决于您的应用程序和测试排序的 CI 实现。
于 2013-10-07T12:08:03.427 回答
0

等待异步操作完成我在我的 RSpecs 中使用

collection.__elasticsearch__.refresh_index!

当我刚刚索引一个新文档并且我想在我的规范之后立即对其进行搜索时非常有用。

.refresh_index!是一种阻塞方法。其实我相信所有!的方法都可能是……你试过其他的!方法吗?

collection.__elasticsearch__.delete_index!
collection.__elasticsearch__.create_index!

(使用 ES 5.x 和适当的 elasticsearch-ruby/rails gems,不带轮胎)

于 2018-05-03T22:47:26.023 回答