如何删除弹性搜索索引?

2022-09-01 13:48:18

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

我的想法是在每次测试之前都有空的搜索索引。所以,我试图删除方法索引中的所有元素(它是Groovy代码):setup

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()

它有什么方法可以提交最后的更改,或者进行锁定,直到写入所有数据?


答案 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();

将新数据放入索引后。


答案 2

首先,您不必通过对每个文档ID发出删除来清除所有数据。您可以通过查询匹配所有文档来删除所有数据 http://www.elasticsearch.org/guide/reference/api/delete-by-query.html 话虽如此,我也不建议这样做,因为不建议在大型文档集合上经常这样做(请参阅文档)。

您真正想做的是删除整个索引(它很快),http://www.elasticsearch.org/guide/reference/api/admin-indices-delete-index.html,重新创建它,放入数据,这很重要,刷新索引以“提交”更改并使其可见。http://www.elasticsearch.org/guide/reference/api/admin-indices-refresh.html

我在测试中这样做,从来没有遇到过问题。