删除elasticsearch java API中没有删除索引的所有文档

时间:2016-03-03 06:00:24

标签: java elasticsearch

是否有任何简单的Java API可以从弹性搜索中删除所有文档而不删除索引。

我知道我们可以获取所有ID并逐个删除每个文档

DeleteResponse response = _client.prepareDelete(INDEX, TYPE, id)
            .setRefresh(true)
            .execute()
            .actionGet();

但我一直在寻找TRUNCATE的场景。

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

5 个答案:

答案 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-0my-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