如何在将这些字段的值相互比较时按多个字段对 elasticsearch 进行排序?

How to sort elasticsearch by multiple fields while comparing the values of those fields to each other?

假设我有三个对象

[
    {
        'name' : 'Apple',
        'popularityFoo': 100,
        'popularityBar': 80,
        'popularity': 40,
    },
    {
        'name' : 'Banana',
        'popularityFoo': 50,
        'popularityBar': 90,
        'popularity': 50,
    },
    {
        'name' : 'Cherry',
        'popularityFoo': 60,
        'popularityBar': 60,
        'popularity': 60,
    }  
];

我的默认排序是按人气排序,返回 Cherry (60), Banana (50), Apple (40) 如果用户有一个偏好的类别,它将首先按该类别的流行指数排序,然后再返回到流行指数。因此,如果我最喜欢的类别是 Foo,它 returns Apple (100), Cherry (60), Banana (50),对于类别 Bar,搜索 returns Banana (90), Apple (80), Cherry (60)

现在我的问题是:如果我的用户喜欢 Foo 和 Bar 我如何在排序时比较不同的流行度值以便得到结果 Apple (100), Banana (90), Cherry (60)?我索引错了吗?我应该采用不同的方法吗?

我有 20 个类别,我的用户有 1-3 个最喜欢的类别。

使用脚本进行条件排序如下:

{
    "sort" : {
        "_script" : {
            "type" : "number",
            "script" : {
                "lang": "painless",
                "inline": "doc['popularityFoo'].value > doc['popularityBar'].value ? doc['popularityFoo'].value : doc['popularityBar'].value"
            },
            "order" : "desc"
        }
    }
}

感谢 的提示,我解决这个问题的方法是使用 Math.max(double a, double b) 为每个附加类别嵌套函数。

"sort": [
    {
      "_script": {
        "script": "Math.max(doc['popularityFoo'].value, Math.max(doc['popularityBar'].value, doc['popularityBaz'].value))",
        "type": "number",
        "order": "desc"
      }
    }
]