我正在寻找一种方法来做到这一点。我需要显示用户映射内的所有专家。 (专家是字段角色等于3的文档)。但是,在向专家展示时,我需要向专家展示在其社交媒体中包含“Linkedin”的专家(social_medias是用户映射中的一个数组字段),然后展示没有“军队”的专家。例如:我有5个文件:
[
{
role: 3,
name: "David",
social_medias: ["Twitter", "Facebook"]
},
{
role: 3,
name: "James",
social_medias: ["Facebook", "Linkedin"]
},
{
role: 3,
name: "Michael",
social_medias: ["Linkedin", "Facebook"]
},
{
role: 3,
name: "Peter",
social_medias: ["Facebook"]
},
{
role: 3,
name: "John",
social_medias: ["Facebook", "Twitter"]
},
{
role: 2,
name: "Babu",
social_medias: ["Linkedin", "Facebook"]
}
]
因此,我想获取角色3的文档,并且在获取角色3时,应优先考虑在社交媒体中具有“Linkedin”的文档。因此,查询后的输出应按以下顺序:
[
{
role: 3,
name: "James",
social_medias: ["Facebook", "Linkedin"]
},
{
role: 3,
name: "Michael",
social_medias: ["Linkedin", "Facebook"]
},
{
role: 3,
name: "David",
social_medias: ["Twitter", "Facebook"]
},
{
role: 3,
name: "Peter",
social_medias: ["Facebook"]
},
{
role: 3,
name: "John",
social_medias: ["Facebook", "Twitter"]
}
]
我正在尝试使用
function_score
。我可以在function_score中指定一列具有更高的优先级,但是无法弄清楚如何指定基于条件的优先级。
最佳答案
为什么不让ES中的默认排序(按分数排序)为您完成这项工作,而无需自定义排序或自定义评分:
GET /my_index/media/_search
{
"query": {
"filtered": {
"query": {
"bool": {
"should": [
{"match": {"social_medias": "Linkedin"}},
{"match_all": {}},
{"query_string": {
"default_field": "social_medias",
"query": "NOT Army"
}}
]
}
},
"filter": {
"term": {
"role": "3"
}
}
}
}
}
上面的查询会过滤
"role":"3"
,然后在should
子句中基本上说:如果文档将social_medias
字段与值Linkedin
匹配,则根据此匹配给它们打分。同样,要包括所有其他与Linkedin
不匹配的文档,请为should
添加另一个match_all
。现在,所有与match_all
匹配的东西都会得到一个分数。如果这些文档也匹配Linkedin
,则它们会得到一个额外的分数,从而使它们得分更高,并且在结果列表中排在第一位。
关于elasticsearch - 为符合特定条件的文档添加排序优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26845669/