findAll() 在 Painless Script Elasticsearch 中不起作用

问题描述 投票:0回答:1

我需要更新/添加该项目到现有字段。该字段保存项目列表。

下面是我的无痛脚本(Elasticsearch 8.x),

POST_scripts/update_event { “脚本”: { “来源”: ””” if (ctx._source.events.size() > 0) {' ctx._source.events = ctx._source.events.findAll(key -> key.event_id != params['event'].event_id).Take(10) + params['event'] } 别的 { ctx._source.events =params['事件'] }

  """,

"lang": "painless"

} }

当我运行下面的批量 API 时,出现错误。

错误:“caused_by”:{ “类型”:“非法参数异常”, "reason": "['event'] 附近的标记序列无效。", “引起”:{ “类型”:“no_viable_alt_exception”, “原因”:“no_viable_alt_exception:空” } }

POST_批量 {“更新”:{“_index”:“es.customer-3.24-08-08-3-29-01”,“_id”:“477597”}} {“upsert”:{“名称”:“update_event”},“脚本”:{“id”:“update_event”,“参数”:{“事件”:{“event_category”:1,“状态”:“7 - 丢失","status_id":226,"type":"新 CRM","sub_type":null,"primary_assigned":"Adam Daniel","vehicle_of_interest":null,"dms_ro_number":null,"dms_deal_number": "","primary_assigned_user_name":"fsadaniel","dealership_id":3,"ancestor_id":477597,"event_id":15131032,"已删除":false,"service_date":null,"update_date":null,"secondary_assigned_user_name" :“fsdpinckne”,“bdc_assigned_user_name”:“0”,“publish_version_information”:{“版本”:“1.0.0.0”,“生产者”:“DealerSocket.Search.Publish”,“last_update”:“2024-08-07T22 :37:48.1874999-05:00"},"proxy_version_information":{"版本":"1.0.0.0","生产者":"DealerSocket.Search","last_update":"2024-08-07T22:37:48.6909805 -05:00"}} } } } }

请帮我解决这个错误。

elasticsearch elastic-stack spring-data-elasticsearch elasticsearch-painless elasticsearch-8
1个回答
-1
投票

您遇到的问题是由于 Painless 脚本中的语法错误和逻辑错误造成的。主要问题是:

不正确使用单引号和错误的标点符号。 不正确的串联和方法使用。

POST _scripts/update_event 
{
  "script": {
    "source": """
      import java.util.stream.Collectors;
      if (ctx._source.events != null && ctx._source.events.size() > 0) {
        ctx._source.events = ctx._source.events.stream().filter(event -> event.event_id != params.event.event_id).limit(10).collect(Collectors.toList());
        ctx._source.events.add(params.event);
      } else {
        ctx._source.events = [params.event];
      }
    """,
    "lang": "painless"
  }
}

检查:

  • 在检查其大小之前确保 ctx._source.events 不为空。
  • 使用 Java 流来过滤列表、限制大小并将其收集回列表中。
  • 将新事件添加到列表中。
  • 如果 events 字段为 null 或为空,则使用数组中的新事件对其进行初始化。
  • 如果需要,请确保在 Painless 脚本的开头导入必要的 Java 类:

更新脚本后,您的批量 API 调用应该可以正常工作。确保文档中的事件字段结构正确,并且您尝试更新的文档存在

© www.soinside.com 2019 - 2024. All rights reserved.