Elasticsearch脚本查询空值报错:5.x正常6.2执行失败求助
解决Elasticsearch 6.2中Painless脚本无法访问
_source的问题 你遇到的这个问题其实是Elasticsearch从5.x升级到6.x时的常见脚本API变更导致的——6.x版本的Painless脚本里,params['_source']这个访问方式被移除了,所以才会抛出“在Painless中不存在'_source'数据”的错误。
下面给你两种可行的解决方案:
方案1:通过ctx._source访问原始文档数据
如果你需要直接读取文档的原始字段内容,可以把原来的params['_source']替换成ctx._source,修改后的查询语句如下:
"bool": { "must": [ { "script": { "script": { "inline": "ctx._source.my_field != null", "lang": "painless" } } } ] }
方案2:利用doc对象检查字段(推荐)
如果你的my_field已经被索引(绝大多数场景都是如此),更推荐用doc对象来判断字段是否存在。这种方式性能更好,因为它直接从倒排索引中读取数据,无需加载整个文档的_source内容。写法如下:
"bool": { "must": [ { "script": { "script": { "inline": "doc.containsKey('my_field')", "lang": "painless" } } } ] }
你也可以用doc['my_field'].size() > 0来替代doc.containsKey('my_field'),两者效果完全一致。
补充说明
Elasticsearch 6.x对Painless脚本的参数体系做了精简,params对象不再包含_source这类文档数据,转而通过ctx上下文对象来统一访问文档的元数据、原始内容等信息,这样的设计让脚本逻辑更清晰,同时也减少了不必要的性能损耗。
内容的提问来源于stack exchange,提问作者J.Done
相关产品推荐
相关产品推荐

