elasticsearch,Java,elasticsearch" /> elasticsearch,Java,elasticsearch" />

在elasticsearch java API中删除不带删除索引的所有文档

在elasticsearch java API中删除不带删除索引的所有文档,java,elasticsearch,Java,elasticsearch,是否有任何简单的JavaAPI可以在不删除索引的情况下从弹性搜索中删除所有文档 我知道我们可以得到所有的ID并逐个删除每个文档 DeleteResponse response = _client.prepareDelete(INDEX, TYPE, id) .setRefresh(true) .execute() .actionGet(); 但我在寻找截短的场景 目前,我正在删除索引并在单元测试中重新创建映射 您可以使用来

是否有任何简单的JavaAPI可以在不删除索引的情况下从弹性搜索中删除所有文档

我知道我们可以得到所有的ID并逐个删除每个文档

DeleteResponse response = _client.prepareDelete(INDEX, TYPE, id)
            .setRefresh(true)
            .execute()
            .actionGet();
但我在寻找截短的场景

目前,我正在删除索引并在单元测试中重新创建映射

您可以使用来实现这一点

您需要在所有节点上安装它

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>

org.elasticsearch.plugin

为了在测试后删除您的所有文档。

如果是我,我不会尝试像这样截断ES中的数据。相反,我将使用-0和-1后缀索引以及指向我认为“热门”的索引的索引别名

例如,如果您有一个名为
my-data
的索引,我会用
my-data-0
my-data-1
替换该索引。然后,我将为指向
my-data-0

如果我想截断我的索引,我只需将别名替换为
my data
,将其指向
my-data-1
,它将是空的,并远离
my-data-0
,因为您试图截断它,显然不是这样。之后,我会删除
my-data-0
,然后立即重新创建索引。下次我需要一个空索引时,我会再次做同样的事情,只是反过来

您应该注意,这种操作可以原子化处理(例如)


你还应该注意到,这种方式会快得多,特别是在大指数上。。。这也将使模式演化更易于管理。请考虑这是否能满足你的需要。如果是这样,我想您会发现使用它比使用deleteby查询更好

您可以找到ElasticSearchService.functioncall-这是因为我在一个单独的类中编写了所有es操作

异步方式--
DeleteByQueryRequestBuilder DeleteByQueryRequestBuilder=elasticsearchService.deleteAllDocument(PRODUCTSINDEX);
deleteByQueryRequestBuilder.execute(新建ActionListener()){
@凌驾
公共无效onResponse(BulkIndexByScrollResponse BulkIndexByScrollResponse){
if(bulkIndexByScrollResponse.getDeleted()==0){
}else if(bulkIndexByScrollResponse.getDeleted()>0){
//getDeleted()提供该索引中已删除的文档数
}
}
@凌驾
公共失效失效失效(例外e){
//没有索引、连接不正确等原因
}
});
------------------------------------------------------------------  
public DeleteByQueryRequestBuilder deleteAllDocument(字符串索引名){
DeleteByQueryRequestBuilder DeleteByQueryRequestBuilder=DeleteByQueryAction.INSTANCE.newRequestBuilder(客户端)
.filter(QueryBuilders.matchAllQuery())
.来源(索引名称);
返回DeleteByQueryRequestBuilder;
}

正常方式--
public void deleteAllProduct(RoutingContext RoutingContext){
long starttime=System.currentTimeMillis();
elasticsearchService.deleteAllDocument1(PRODUCTSINDEX);
}
--------------------------------------------------------------
public void deleteAllDocument1(字符串索引名){
ListenableActionFuture execute=DeleteByQueryAction.INSTANCE.newRequestBuilder(客户端)
.filter(QueryBuilders.matchAllQuery())
.source(indexName).execute();
试一试{
BulkIndexByScrollResponse BulkIndexByScrollResponse=execute.get();
如果(bulkIndexByScrollResponse.getDeleted()>0)
{
System.out.println(bulkIndexByScrollResponse.getDeleted());
}
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
}

您可以通过循环搜索结果并删除它们来截断:

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

使用
RestHighLevelClient
时,可以执行以下操作:

DeleteByQueryRequest request = new DeleteByQueryRequest(index);
request.setQuery(QueryBuilders.matchAllQuery());

client.deleteByQuery(request, RequestOptions.DEFAULT);


谢谢Val。我正在使用内存弹性搜索,让我看看如何实现这一点。这应该会有所帮助,然后:,也就是说,只需将JAR添加到类路径。我同意你的观点,但我所寻找的是单元测试从内存弹性搜索中清除数据。忽略了这一部分。我道歉。对于内存单元测试,Val是正确的。按删除并继续。
    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();
    }
}
DeleteByQueryRequest request = new DeleteByQueryRequest(index);
request.setQuery(QueryBuilders.matchAllQuery());

client.deleteByQuery(request, RequestOptions.DEFAULT);