Elasticsearch自定义排序脚本问题:脚本始终返回1
Elasticsearch自定义排序脚本始终返回1的解决方法
核心问题
你的Painless脚本没有明确返回计算结果。你仅对变量res完成了赋值,但没有通过return语句返回它,Elasticsearch会将无返回值的脚本默认处理为返回1,导致所有排序结果都按1排序。
修正后的脚本
在脚本末尾添加return res;即可解决问题:
"sort": [ { "_script": { "type": "number", "script": { "lang": "painless", "source": "String country_code = doc['country_code'].value; long res = 0; if (country_code == params['multiplier']) { res = 0; } else { res = 1; } return res;", "params": { "multiplier": "OTHER_COUNTRY" } }, "order": "asc" } } ]
额外排查点
- 确认
country_code字段的映射类型为keyword:如果字段是text类型,存储的值会被分词,精确字符串匹配会失败,导致始终进入else分支返回1。 - 处理字段值为null的场景:如果部分文档的
country_code字段为空,直接访问doc['country_code'].value会抛出异常,可以添加空值判断:"source": "long res = 1; if (doc['country_code'].size() > 0) { String country_code = doc['country_code'].value; if (country_code == params['multiplier']) { res = 0; } } return res;"
内容的提问来源于stack exchange,提问作者Nam Kiều Thanh
相关产品推荐
相关产品推荐

