FunctionScore不允许嵌套,那类似 MAX(A, B) + C 这样的分值该怎么处理?
Elasticsearch | 作者 verra1448 | 发布于2016年07月14日 | 阅读数:4765
目前正在广泛地使用FunctionScore这个功能,但最近遇到一个略微复杂一点的需求,简要描述如下:
最终的打分依赖于3个条件(即functions里的filter),假设三个条件对应的weight为A/B/C
现在我需要取A/B中的最大值,再与C相加,作为最终的打分,即:_score = MAX(A, B) + C
score_mode支持max和sum,但试验下来好像functions是不能嵌套的,无法在一个functions里面对部分filter使用max再对整体使用sum。
这个场景应该算是很普通的了,请问各位前辈如何能实现这个逻辑,最好能提供一个大体的语法,谢谢!
补充:
可能上面说的比较抽象,实际上我想实现类似这样的一种功能(虽然这在语法上肯定通不过):
其实就是对部分条件的weight取max,再与其余条件的weight做sum。恳请指点!
最终的打分依赖于3个条件(即functions里的filter),假设三个条件对应的weight为A/B/C
现在我需要取A/B中的最大值,再与C相加,作为最终的打分,即:_score = MAX(A, B) + C
score_mode支持max和sum,但试验下来好像functions是不能嵌套的,无法在一个functions里面对部分filter使用max再对整体使用sum。
这个场景应该算是很普通的了,请问各位前辈如何能实现这个逻辑,最好能提供一个大体的语法,谢谢!
补充:
可能上面说的比较抽象,实际上我想实现类似这样的一种功能(虽然这在语法上肯定通不过):
"functions": [
functions [
{
"filter": {
"term": {
"fieldA": 1
}
},
"weight": 5
},
{
"filter": {
"term": {
"fieldB": 2
}
},
"weight": 3
},
{
"filter": {
"term": {
"fieldC": 3
}
},
"weight": 1
}
],
"score_mode": "max",
{
"filter": {
"term": {
"fieldD": 4
}
},
"weight": -2
},
{
"filter": {
"term": {
"fieldE": 5
}
},
"weight": 2
},
],
"score_mode": "sum"
稍微扩展了一点,可能不止三个条件,特指类似的情景。其实就是对部分条件的weight取max,再与其余条件的weight做sum。恳请指点!
2 个回复
y136118630 - 90IT
赞同来自:
Jea - 一只猿
赞同来自:
或许可以对数据做预处理之后再扔es