当前位置: 首页 > 面试题库 >

使用Java在Elasticsearch中按查询更新

薛弘厚
2023-03-14
问题内容

我目前正在使用Elasticsearch V2.3.1。我想在Java中使用以下Elasticsearch查询。

POST /twitter/_update_by_query
{
  "script": {
    "inline": "ctx._source.List = [‘Item 1’,’Item 2’]”
  },
  "query": {
    "term": {
      "user": "kimchy"
    }
  }
}

上面的查询搜索名为“
kimchy”的“用户”,并使用给定值更新“列表”字段。该查询同时更新多个文档。我在https://www.elastic.co/guide/en/elasticsearch/client/java-
api/2.3/java-docs-
update.html上
了解了有关Java的Update API,但找不到我想要的东西。Java的Update
API仅讨论一次更新单个文档。有什么办法可以更新多个文档?抱歉,如果我缺少明显的内容。感谢您的时间。

更新:

我尝试了以下Java代码:

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

UpdateByQueryRequestBuilder ubqrb = UpdateByQueryAction.INSTANCE
    .newRequestBuilder(client);

Script script = new Script("ctx._source.List = [\"Item 1\",\"Item 2\"]");

//termQuery is not recognised by the program
BulkIndexByScrollResponse r = ubqrb.source("twitter").script(script)
    .filter(termQuery("user", "kimchy")).execute().get();

因此,我如上所述编辑了Java程序,而Java不识别termQuery。我可以知道我在做什么错吗?谢谢。


问题答案:

从ES
2.3开始,按查询更新功能可用作REST端点,_update_by_query但不适用于Java客户端。为了从Java客户端代码中调用该端点,您需要reindex在pom.xml中包含该模块,如下所示

<dependency>
    <groupId>org.elasticsearch.module</groupId>
    <artifactId>reindex</artifactId>
    <version>2.3.2</version>
</dependency>

然后,在构建客户端时需要包括以下模块:

clientBuilder.addPlugin(ReindexPlugin.class);

最后,您可以这样称呼它:

UpdateByQueryRequestBuilder ubqrb = UpdateByQueryAction.INSTANCE.newRequestBuilder(client);

Script script = new Script("ctx._source.List = [\"Item 1\",\"Item 2\"]");

BulkIndexByScrollResponse r = ubqrb.source("twitter")
    .script(script)
    .filter(termQuery("user", "kimchy"))
    .get();

更新

如果您需要指定更新应关注的类型,则可以执行以下操作:

ubqrb.source("twitter").source().setTypes("type1");
BulkIndexByScrollResponse r = ubqrb.script(script)
    .filter(termQuery("user", "kimchy"))
    .get();


 类似资料:
  • 问题内容: 我在Spring Boot应用程序中使用Elasticsearch 2.4,我需要使用Java API 执行对远程ES实例的请求。 我已经找到了解决这个问题的方法,但是就我而言,我有一个NPE试图执行该功能。 ES的模块包括: 这是我现在用于测试的代码片段: 这是包装好的豆: 需要包装器以允许通过Spring Boot配置文件进行配置,因此只是为了方便。 在通过调用引起的方法 : 我想

  • 问题内容: 我当前正在使用Elasticsearch V2.3.1。我想在Java中使用以下Elasticsearch查询。 上面的查询搜索名为“ kimchy”的“用户”,并使用给定值更新“列表”字段。该查询同时更新多个文档。我在https://www.elastic.co/guide/en/elasticsearch/client/java- api/2.3/java-docs- update

  • 因此,我像上面那样编辑了Java程序,而termQuery不是由Java标识的。我能知道我在这里做错了什么吗?谢了。

  • 我想更新索引中的所有文档。我发现更新查询是我们应该使用的方法。但是,当我使用ctx._now作为更新文档字段的值时,我遇到了问题,导致字段值变为NULL。 这是示例: 当我使用随机数值时,它是工作。假设我把timenow=5。然后,All documents字段timenow变为5。但是,使用这种ctx方法是行不通的。 我该怎么做呢? 附加信息 示例:POST INDEX/TYPE/24/_UPD

  • 我知道我可以通过http://localhost:9200/[index_name]/[index_type]/[_id]更新特定的文档,但是我的文档中的_id有#个符号,Sense找不到它们。 了解查询DSL将能够执行一个搜索,我能够指出_id不在URL中。资源:https://www.elastic.co/guide/en/elasticsearch/reference/current/que

  • 问题内容: 我正在尝试使用 Java 和 Elasticsearch 进行Elasticsearch搜索。elasticsearch为Java提供了API,这很酷。 问题是,我希望在Java中创建一个方法,该方法接收一个字符串(应该是一个包含用于搜索的信息的JSON),该字符串反映此对Elasticsearch的HTTP调用 但是我希望这种方法尽可能通用。 所以问题是: 是否可以使用Java AP