[英]Add _timestamp to Elasticsearch results using Java API
[英]Deleting data results related to a query using Java API Elasticsearch
我正在嘗試根據搜索結果刪除某些數據。 我正在將Elasticsearch 2.3版與嵌入式服務器一起使用。 我已經設法通過獨立服務器上的delete-by-query插件來做到這一點,但似乎我們不能在嵌入式服務器上使用插件。
DeleteByQueryResponse delete = new DeleteByQueryRequestBuilder(client, DeleteByQueryAction.INSTANCE)
.setIndices(ES_INDEX_NAME)
.setTypes(ES_RECORD_TYPE)
.setQuery(QueryBuilders.boolQuery()
.filter(QueryBuilders.termQuery(ENTITY_ID, entityId)))
.execute().actionGet();
有什么方法可以在v2.3中的嵌入式服務器上使用按查詢刪除插件? 如果不是,如何根據某些匹配條件刪除數據?
任何幫助將不勝感激。
我在這里找到了針對Elasticsearch早期版本的解決方案。 這是我的解決方案。
public void resetStatistics(String entityId) {
if (client.admin().indices().exists(new IndicesExistsRequest(ES_INDEX_NAME)).actionGet().isExists()) {
BulkRequestBuilder bulkRequest = client.prepareBulk();
try {
logger.info("Elasticsearch cleaning task execution started");
SearchResponse scrollResp = client.prepareSearch(ES_INDEX_NAME)
.setTypes(ES_RECORD_TYPE)
.setScroll(TIME_VALUE)
.setQuery(
QueryBuilders.boolQuery()
.filter(QueryBuilders.termQuery(ENTITY_ID, entityId)))
.addSort("_doc", SortOrder.ASC)
.setNoFields()
.setSize(100).execute().actionGet();
while (true) {
for (SearchHit hit : scrollResp.getHits().getHits()) {
bulkRequest.add(client.prepareDelete()
.setIndex(ES_INDEX_NAME)
.setType(ES_RECORD_TYPE)
.setId(hit.getId()));
}
scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(TIME_VALUE).execute().actionGet();
if (scrollResp.getHits().getHits().length == 0) {
break;
}
}
if (!bulkRequest.request().requests().isEmpty()) {
BulkResponse bulkResponse = bulkRequest.execute().actionGet();
if (bulkResponse.hasFailures()) {
logger.error("Elasticsearch cleaning task execution failed");
} else {
logger.info("Elasticsearch cleaning task finished execution deleting {} documents", bulkResponse.getItems().length);
}
} else {
logger.info("Elasticsearch cleaning task finished execution without deleting any documents");
}
} catch (Exception e) {
logger.error("Unable to delete data", e);
}
try {
logger.info("Elasticsearch index optimization started");
ForceMergeResponse forceMergeResponse = client.admin().indices()
.prepareForceMerge(ES_INDEX_NAME)
.setFlush(true)
.setOnlyExpungeDeletes(false)
.execute().actionGet();
logger.info("Elasticsearch index optimization finished with {} successful and {} failed shards out of " +
"{} total shards", forceMergeResponse.getSuccessfulShards(), forceMergeResponse.getFailedShards(),
forceMergeResponse.getTotalShards());
} catch (Exception e) {
logger.error("Error while optimizing Elasticsearch index", e);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.