Elasticsearch 2.0:如何在 Java 中通过查询删除

Elasticsearch 2.0: how to delete by query in Java

我正在尝试升级到 ES 2.0。我已经下载了 ES 2.0 并将其安装在我的 Windows 机器上。

在我的 pom.xml 中,我有以下内容:

<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>2.0.0-rc1</version>
</dependency>

<dependency>
    <groupId>org.elasticsearch.plugin</groupId>
    <artifactId>delete-by-query</artifactId>
    <version>2.0.0-rc1</version>
</dependency>

在我的Java代码中,我确实在使用ES 1.7.3时按以下方式通过查询删除:

    StringBuilder b = new StringBuilder("");
    b.append("{");
    b.append("  \"query\": {");  
    b.append("      \"term\": {");
    b.append("          \"category\": " + category_value );
    b.append("      }");
    b.append("  }");
    b.append("}");

    client = getClient(); 

    DeleteByQueryResponse response = client.prepareDeleteByQuery("myindex")
                .setTypes("mydocytype")
                .setSource(b.toString())
                .execute()
                .actionGet();

我希望替换这个:

    DeleteByQueryResponse response = client.prepareDeleteByQuery("myindex")
                .setTypes("mydocytype")
                .setSource(b.toString())
                .execute()
                .actionGet();

使用 ES 2.0 方式。谷歌搜索但未能找到它的例子。在线 API 文档对我来说似乎太抽象了。我该怎么做?

另一个问题:是否必须在 Elasticsearch 服务器中安装按查询删除插件?

感谢指点!

更新

我听从了 Max 的建议,现在我得到的是:

首先,在创建客户端时,进行如下设置:

Settings settings = Settings.settingsBuilder()
                        .put("cluster.name", "mycluster")
                        .put("plugin.types", DeleteByQueryPlugin.class.getName())
                        .build();

其次,查询删除的地方:

    DeleteByQueryResponse rsp = new DeleteByQueryRequestBuilder(client, DeleteByQueryAction.INSTANCE)
    .setIndices("myindex")
    .setTypes("mydoctype")
    .setSource(b.toString())
    .execute()
    .actionGet();

我还在ES的根目录下运行安装了delete by query plugin:

bin\plugin install delete-by-query

如果我不安装这个插件会出现错误。

完成所有这些步骤后,与 ES 相关的部分就可以正常工作了。

我相信你可以使用这个:

     DeleteByQueryResponse rsp = new DeleteByQueryRequestBuilder(client, DeleteByQueryAction.INSTANCE)
            .setTypes("mydocytype")
            .setSource(b.toString())
            .execute()
            .actionGet();

您必须在设置中添加插件类型:

     Settings settings = Settings.settingsBuilder()
                         .put("plugin.types", DeleteByQueryPlugin.class.getName())

如果您有远程服务器,则必须安装该插件。

plugin.types 已在 ES 2.1.0 (source) 中弃用。因此,接受的解决方案将导致 NullPointerException

解决方法是使用addPlugin方法:

Client client = TransportClient.builder().settings(settings())
                .addPlugin(DeleteByQueryPlugin.class)
                .build()
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host",9300));

首先: 添加 elasticsearch-2.3.3/plugins/delete-by-query/delete-by-query-2.3.3.jar 构建路径.

然后:

Client client = TransportClient.builder().settings(settings)
                .addPlugin(DeleteByQueryPlugin.class)
                .build()
                .addTransportAddress(new InetSocketTransportAddress(
                        InetAddress.getByName("192.168.0.224"), 9300));

从 Elastic 5 开始...

final BulkIndexByScrollResponse response = DeleteByQueryAction.INSTANCE.newRequestBuilder(super.transportClient)
                    .filter(
                            QueryBuilders.boolQuery()
                                    .must(QueryBuilders.termQuery("_type", "MY_TYPE")) // Trick to define and ensure the type.
                                    .must(QueryBuilders.termQuery("...", "...")))
                    .source("MY_INDEX")
                    .get();

    return response.getDeleted() > 0;

Oficial documentation