【问题标题】:Update by query multiple fields using Spring Data Elasticsearch?通过使用 Spring Data Elasticsearch 查询多个字段来更新?
【发布时间】:2020-06-24 22:10:33
【问题描述】:

我想更新所有具有相同名称的文档。我在 elasticsearch 文档中看到我可以使用 _update_by_query。所以我尝试在我的存储库中像这样实现它:

@Query("{\"script\": { \"inline\": \"ctx._source.name = ?1\"; \"ctx._source.username = ?2\"; \"ctx._source.avatar = ?3\", \"lang\": \"painless\" }, \"query\": { \"match\": { \"name\" : \"?1\" }}")
List<User> update(String name, String username, String avatar);

但我收到以下错误:

nested exception is ElasticsearchStatusException[Elasticsearch exception [type=parsing_exception, reason=[script] query does not support [inline]]]
    at org.springframework.kafka.listener.SeekUtils.seekOrRecover(SeekUtils.java:157) ~[spring-kafka-2.5.0.RELEASE.jar:2.5.0.RELEASE]

【问题讨论】:

    标签: spring elasticsearch spring-data spring-data-elasticsearch


    【解决方案1】:

    编辑 26.06.2020:

    这个答案不正确,我加了一个正确的。

    旧的错误答案:

    我觉得很奇怪,这个错误来自org.springframework.kafka.listener.SeekUtils

    要使用脚本进行更新,您可以使用ElasticsearchOperations 实例的update(UpdateQuery updateQuery, IndexCoordinates index)

    要在您的存储库中使用它,您需要创建一个存储库自定义,例如 described here。在实现中,自动装配一个ElasticsearchOperations 实例。在此自定义存储库界面中,您定义方法

    List<User> update(String name, String username, String avatar);
    

    在实现中,使用脚本和其他信息构建一个UpdateQuery 对象并将其传递给ElasticsearchOperations 实例。

    【讨论】:

    • 您能否分享一下如何使用 ElasticsearchOperations 的示例
    • 请查看我的其他答案
    【解决方案2】:

    查看Spring Data Elasticsearch的代码后,我需要撤回我在第一个答案中写的内容:

    目前 Spring Data Elasticsearch 不支持update by query。只能在单个操作或批量更新中更新具有已知 ID 的实体。

    我创建了an issue in Jira 来添加对此的支持。

    【讨论】:

      猜你喜欢
      • 2019-06-08
      • 2017-12-03
      • 2019-11-17
      • 1970-01-01
      • 2016-01-08
      • 1970-01-01
      • 2017-07-18
      • 2016-09-07
      • 2017-05-06
      相关资源
      最近更新 更多