我有点怀疑你在刷屏

FunctionScore不允许嵌套,那类似 MAX(A, B) + C 这样的分值该怎么处理?

Elasticsearch | 作者 verra1448 | 发布于2016年07月14日 | 阅读数:4788

目前正在广泛地使用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。

这个场景应该算是很普通的了,请问各位前辈如何能实现这个逻辑,最好能提供一个大体的语法,谢谢!

补充:
可能上面说的比较抽象,实际上我想实现类似这样的一种功能(虽然这在语法上肯定通不过):
"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。恳请指点!
已邀请:

y136118630 - 90IT

赞同来自:

请问找到解决办法了吗?同求

Jea - 一只猿

赞同来自:

我是用script sort来解决的, 但效率很低, 
或许可以对数据做预处理之后再扔es

要回复问题请先登录注册