如何在将这些字段的值相互比较时按多个字段对 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"
}
}
]
假设我有三个对象
[
{
'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"
}
}
]