簡體   English   中英

如何擦除ElasticSearch索引?

[英]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

我在測試中這樣做,從來沒有遇到過問題。

  1. 它不是異步調用(您可以添加偵聽器並避免actionGet來獲取異步調用)
  2. 刪除所有項目:

     client.prepareDeleteByQuery(indexName). setQuery(QueryBuilders.matchAllQuery()). setTypes(indexType). execute().actionGet(); 
  3. 刷新索引以查看更改(僅在單元測試中需要)

我的想法是在每次測試之前都有空搜索索引

因此,在測試開始時創建一個新索引,不要重復使用舊索引。 那你就保證空了。 在測試的拆解中,您可以刪除測試索引。

有沒有辦法提交最后的更改,或者鎖定直到所有數據都被寫入?

不,ElasticSearch沒有交易或鎖定。

如果您不想每次都創建新索引,那么嘗試添加一個循環來檢查索引是否為空,然后等待並再次嘗試,直到它為止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM