Elasticsearch script_fields如何检查嵌套字段中是否存在指定值?
问题分析与解决
编译错误原因
你的Painless脚本存在语法错误:Painless中遍历集合的for循环语法要求使用:而非in,原脚本里的for (item in params._source.myNestedField)不符合语法规范,这是导致编译失败的直接原因。
额外逻辑问题
即使修复语法,原脚本逻辑也有漏洞:遍历第一个元素时,若code不匹配就直接返回false,不会继续检查后续元素,会漏掉后续符合条件的项。
修正后的脚本
"script_fields": { "boolFieldToReturn": { "script": { "source": "boolean found = false; for (item : params._source.myNestedField) { if (item.code == '1815495') { found = true; break; } } return found;" } } }
简洁写法(Elasticsearch 7.10+ 支持)
如果你的ES版本满足要求,可以用流式API简化代码:
"script_fields": { "boolFieldToReturn": { "script": { "source": "params._source.myNestedField.stream().anyMatch(item -> item.code == '1815495')" } } }
内容的提问来源于stack exchange,提问作者toch
相关产品推荐
相关产品推荐

