【问题标题】:How to send stored painless script id to spring data elasticsearch update query?如何将存储的无痛脚本ID发送到spring data elasticsearch更新查询?
【发布时间】:2021-08-08 05:05:48
【问题描述】:

Updatequery.builder 只有 withscript(string script) 函数发送脚本源,如果存储脚本如何发送脚本id? .我正在使用弹簧数据弹性搜索 4.1。谢谢

编辑以显示 Spring data elasticsearch 4.2.1 的错误

Map 参数 = new HashMap(); params.put("message","这是要测试的测试消息");

UpdateQuery updateQuery = UpdateQuery.builder(Query.findAll()).withScriptType(ScriptType.STORED) .withScriptName("updateScript01").withParams(params).build(); this.elasticsearchRestTemplate(updateQuery,IndexCoordniates.of("sampleIndex1"));

例外: 原因:org.elasticsearch.action.ActionRequestValidationException:验证失败:1:缺少id;2:缺少脚本或文档;在 org.elasticsearch.action.ValidateActions.addValidationError(ValidateActions.java:26) 在 org.elasticsearch.action.update.UpdateRequest.validate(UpdateRequest.java:206)

在 kibana 的 elasticsearch 中存储的脚本: POST _scripts/updateScript01 { “脚本”: { "lang": "无痛", “来源”:“ctx._source.message = params.message;” } }

【问题讨论】:

    标签: elasticsearch spring-data-elasticsearch


    【解决方案1】:

    在 4.2 版中添加了对使用存储脚本的支持。有关用法,请参阅 Sahil 的回答。

    编辑:

    查看您的示例代码后:

    你需要使用updateByQuery(),而不是update()

    this.elasticsearchOperations.updateByQuery(updateQuery,IndexCoordinates.of("sampleindex1"));
    

    顺便说一句:“indexSample1”因为你有它不是有效的 Elasticsearch 索引名称。索引名称中不允许使用大写字母。

    【讨论】:

    • 我提供的不是脚本,而是脚本类型和脚本名称,但收到以下错误。脚本、文档或查询必须设置在 org.springframework.data.elasticsearch.core.query.UpdateQuery$Builder.build(UpdateQuery.java:438)
    • 这是导致错误的查询:UpdateQuery.builder("sampleID") .withScriptType(ScriptType.STORED).withScriptName("updatescript01") .withParams(params).build() ;
    • 您是否定义了查询?如果没有,并且您想在所有文档上运行更新,请使用 Query.findAll() 作为查询参数
    • 我也试过了,id 和 script 字段仍然报错。原因:org.elasticsearch.action.ActionRequestValidationException:验证失败:1:缺少id;2:缺少脚本或文档;在 org.elasticsearch.action.ValidateActions.addValidationError(ValidateActions.java:26) 在 org.elasticsearch.action.update.UpdateRequest.validate(UpdateRequest.java:206) 使用的查询:UpdateQuery.builder(Query.findAll())。 withScriptType(ScriptType.STORED) .withScriptName("updateScript01").withParams(params).build();
    • 那么请提供一个可复现、可编译、可运行的例子How to create a Minimal, Complete, and Verifiable example
    【解决方案2】:

    使用 ScriptType->Stored 和 name 为 id 的以下方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      • 1970-01-01
      • 2018-11-27
      • 2021-05-24
      • 2020-04-16
      • 2022-07-06
      相关资源
      最近更新 更多