目前有一个比较变态的需求,文档有多个列,都是数值的,产品需求是通过几列计算出一个排序分,再通过几列计算出来一个显示分数(给用户看的)。
目前查询是这么写的(经过省略简化):
GET index/type/_search
{
"query": {
"function_score": {
"query": {
"match_all": {}
},
"functions": [
{
"script_score": {
"script": "return doc.a * 10 + doc.b * 1.2"
}
}
],
"score_mode": "max",
"boost_mode": "replace"
}
}
}
期望在返回的内容中可以通过_source.xxx
拿到另外一个显示分数,或者通过其他方式也行。
我的设想,其中doc.x
就是我想要的显示分数,通过结果中的_source.x
拿到对应的值,但是实际上这个无法工作:
GET index/type/_search
{
"query": {
"function_score": {
"query": {
"match_all": {}
},
"functions": [
{
"script_score": {
"script": "_doc.x = doc.a + doc.b; return _doc.a * 10 + _doc.b * 1.2"
}
}
],
"score_mode": "max",
"boost_mode": "replace"
}
}
}
ps:目前有其他的实现方案,通过返回的所有列,在得到结果后再计算一遍,但这样公式是分布在两个地方了。不太方便维护。。。 所以,期望让 es 返回可直接使用的值。
1
wclssdn OP 没人关心还是咋的。。。
后来我找到答案了~~ 使用 script_fields,配合_source=*实现的~ 代码不贴了,有兴趣自行查阅官方文档~ |