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;
我正在尝试升级到 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;