一尘不染

如何清除ElasticSearch索引?

elasticsearch

我的 单元/集成测试 包括搜索功能的测试。

我的想法是在每次测试之前有一个空的搜索索引。因此,我正在尝试删除setup方法(它是Groovy代码)的索引中的所有元素:

Client client = searchConnection.client

SearchResponse response = client.prepareSearch("item")
    .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
    .setQuery(termQuery('name', 'test')) //tried also matchAllQuery()
    .setFrom(0).setSize(100).setExplain(false).execute().actionGet()

List<String> ids = response.hits.hits.collect {
    return it.id
}
client.close()

client = searchConnection.client

ids.each {
    DeleteResponse delete = client.prepareDelete("item", "item", it)
        .setOperationThreaded(false)
        .execute().actionGet()
}

client.close()

似乎它正在异步处理所有删除操作,因此Thread.sleep(5000)在它之后添加了它。如您所见,我尝试几次打开/关闭连接-在那里没有帮助。

这个问题有时需要更多时间,有时需要5秒钟以上才能删除,有时无法找到刚刚添加的数据(来自先前的测试),等等。而最令人烦恼的是集成测试变得不稳定。Thread.sleep()尽可能将其放置在任何地方似乎不是一个好的解决方案。

是否有任何方法可以 提交 最后的更改,或者进行 锁定 直到写入所有数据?


阅读 1092

收藏
2020-06-22

共1个答案

一尘不染

找到的解决方案:

IndicesAdminClient adminClient = searchConnection.client.admin().indices();
String indexName = "location";
DeleteIndexResponse delete = adminClient.delete(new DeleteIndexRequest(indexName)).actionGet()
if (!delete.isAcknowledged()) {
    log.error("Index {} wasn't deleted", indexName);
}

client.admin().indices().flush(new FlushRequest('location')).actionGet();

将新数据放入索引后。

2020-06-22