是否有任何简单的Java API可以从弹性搜索中删除所有文档而不删除索引。
我知道我们可以获取所有ID并逐个删除每个文档
DeleteResponse response = _client.prepareDelete(INDEX, TYPE, id)
.setRefresh(true)
.execute()
.actionGet();
但我一直在寻找TRUNCATE的场景。
目前我正在删除索引并在单元测试中重新创建映射。
答案 0 :(得分:3)
您可以使用delete-by-query plugin来实现这一目标。
您需要使用
在所有节点上安装它sudo bin/plugin install delete-by-query
然后,您可以将此依赖关系添加到pom.xml
<dependency>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>delete-by-query</artifactId>
<version>2.2.0</version>
</dependency>
最后,您将能够使用DeleteByQueryRequestBuilder
在测试后删除所有文档。
答案 1 :(得分:1)
如果是我,我不会尝试像这样截断ES中的数据。相反,我会使用-0和-1后缀索引以及指向我认为“热”的索引的索引别名。
例如,如果您有一个名为my-data
的索引,我会将该索引替换为my-data-0
和my-data-1
。然后,我将为my-data
my-data-0
的别名
如果我想截断我的索引,我只需交换my-data
的别名,将其指向my-data-1
,这将是空的,远离my-data-0
,这显然是my-data-0
是不是因为你试图截断它。之后,我会删除app.component
,然后立即重新创建索引。下次我需要一个空索引时,我会再次做同样的事情,反过来。
您应该注意,这种操作可以原子方式处理(例如https://www.elastic.co/guide/en/elasticsearch/guide/current/index-aliases.html)。
你还应该注意到,这种方式会快得多,特别是在大型索引上......而且它也会使架构演变更容易管理。请考虑是否能达到您的需求。如果是这样,我认为你会发现使用比查询删除更好的工作。
答案 2 :(得分:0)
你可以找到elaseticsearchservice.functioncall - 这是因为我已经在一个单独的类中编写了所有的es操作
DeleteByQueryRequestBuilder deleteByQueryRequestBuilder = elasticsearchService.deleteAllDocument(PRODUCTSINDEX);
deleteByQueryRequestBuilder.execute(new ActionListener<BulkIndexByScrollResponse>() {
@Override
public void onResponse(BulkIndexByScrollResponse bulkIndexByScrollResponse) {
if (bulkIndexByScrollResponse.getDeleted() == 0) {
} else if (bulkIndexByScrollResponse.getDeleted() > 0) {
// getDeleted() gives you how many docs in that index have been deleted
}
}
@Override
public void onFailure(Exception e) {
//reason like no index exists, improper connection etc
}
});
------------------------------------------------------------------
public DeleteByQueryRequestBuilder deleteAllDocument(String indexName) {
DeleteByQueryRequestBuilder DeleteByQueryRequestBuilder = DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
.filter(QueryBuilders.matchAllQuery())
.source(indexName);
return DeleteByQueryRequestBuilder;
}
public void deleteAllProduct(RoutingContext routingContext) {
long starttime = System.currentTimeMillis();
elasticsearchService.deleteAllDocument1(PRODUCTSINDEX);
}
--------------------------------------------------------------
public void deleteAllDocument1(String indexName) {
ListenableActionFuture<BulkIndexByScrollResponse> execute = DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
.filter(QueryBuilders.matchAllQuery())
.source(indexName).execute();
try {
BulkIndexByScrollResponse bulkIndexByScrollResponse = execute.get();
if (bulkIndexByScrollResponse.getDeleted()>0)
{
System.out.println(bulkIndexByScrollResponse.getDeleted());
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
答案 3 :(得分:0)
您可以通过循环搜索结果并删除它们来截断:
public static void truncateESNamespace(String namespace) {
client.admin().indices().prepareRefresh(namespace).get();
SearchResponse response = client.prepareSearch(namespace).setSize(10000).get();
while (response.getHits().totalHits > 0) {
BulkRequestBuilder bulkRequest = client.prepareBulk();
Arrays.stream(response.getHits().getHits()).forEach(h -> bulkRequest.add(client.prepareDelete(h.getIndex(), h.getType(), h.getId())));
bulkRequest.get();
client.admin().indices().prepareRefresh(namespace).get();
response = client.prepareSearch(namespace).setSize(10000).get();
}
}
答案 4 :(得分:0)
使用 datetime.timedelta(previous month)
时,您可以执行以下操作:
RestHighLevelClient