ElasticSearch字段比较报错求助:Kibana脚本查询运行时异常
解决Elasticsearch中脚本比较两个字段的运行时异常问题
我来帮你搞定这个字段比较的报错问题!首先看你的情况,match_all查询能正常返回结果,说明索引和字段都是存在的,那脚本查询报错大概率是因为部分文档缺失其中一个字段,或者脚本的字段访问逻辑没做容错处理。
问题分析
你的脚本直接用doc['output_record_count'].value < doc['input_record_count'].value,如果有任何文档缺少output_record_count或input_record_count字段,访问doc[xxx].value就会抛出运行时异常,导致整个查询失败。
另外,从你给出的match_all响应来看,字段值是数字(13、10),说明这两个字段的映射类型是数值型(比如integer/long),这一点是没问题的,可以排除类型不匹配的问题。
解决方案
给脚本加上字段存在性的判断,确保只在两个字段都存在的情况下进行比较,修改后的查询如下:
GET /eps/_search { "query": { "bool" : { "filter" : { "script" : { "script" : { "source": "doc.containsKey('output_record_count') && doc.containsKey('input_record_count') && doc['output_record_count'].value < doc['input_record_count'].value", "lang" : "painless" } } } } } }
如果还是有问题,也可以尝试直接从_source中读取字段值(这种方式效率略低,但兼容性更好):
GET /eps/_search { "query": { "bool" : { "filter" : { "script" : { "script" : { "source": "_source.output_record_count != null && _source.input_record_count != null && _source.output_record_count < _source.input_record_count", "lang" : "painless" } } } } } }
验证逻辑
从你提供的示例文档来看,output_record_count是13,input_record_count是10,这个文档不会被筛选出来。如果有其他文档满足output_record_count < input_record_count的条件,就会被正常返回。
内容的提问来源于stack exchange,提问作者HShetty
相关产品推荐
相关产品推荐

