[英]How to erase ElasticSearch index?
我的單元/集成測試包括搜索功能的測試。
我的想法是在每次測試之前都有空搜索索引。 所以,我試圖刪除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)
。 如你所見,我試圖打開/關閉連接幾次 - 它沒有幫助。
有時需要更多時間的問題,有時需要更多的時間來刪除,有時它無法找到剛剛添加的數據(來自之前的測試)等等。最令人討厭的是集成測試變得不穩定。 將Thread.sleep()
放在任何可能的地方看起來都不是那么好的解決方案。
有沒有辦法提交最后的更改,或者鎖定直到所有數據都被寫入?
找到解決方案
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();
將新數據放入索引后。
首先,您不必通過對每個文檔ID發出刪除來清除所有數據。 您可以通過查詢匹配所有文檔刪除所有數據刪除所有文件http://www.elasticsearch.org/guide/reference/api/delete-by-query.html說完之后我也不建議這樣做,因為它不是建議經常在大型文檔集上執行此操作(請參閱docs)。
你真正想做的是刪除整個索引(它很快) http://www.elasticsearch.org/guide/reference/api/admin-indices-delete-index.html ,重新創建它,輸入數據, 這是重要的是刷新索引以“提交”更改並使其可見。 http://www.elasticsearch.org/guide/reference/api/admin-indices-refresh.html
我在測試中這樣做,從來沒有遇到過問題。
刪除所有項目:
client.prepareDeleteByQuery(indexName). setQuery(QueryBuilders.matchAllQuery()). setTypes(indexType). execute().actionGet();
刷新索引以查看更改(僅在單元測試中需要)
我的想法是在每次測試之前都有空搜索索引
因此,在測試開始時創建一個新索引,不要重復使用舊索引。 那你就保證空了。 在測試的拆解中,您可以刪除測試索引。
有沒有辦法提交最后的更改,或者鎖定直到所有數據都被寫入?
不,ElasticSearch沒有交易或鎖定。
如果您不想每次都創建新索引,那么嘗試添加一個循環來檢查索引是否為空,然后等待並再次嘗試,直到它為止。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.