我正在寻找一种方法来做到这一点。我需要在用户映射中显示所有专家。 (专家是具有场角色的文件等于3)。但在展示专家的同时,我需要首先向社交媒体中显示“Linkedin”的专家(social_medias是用户映射中的数组字段),然后是那些没有“军队”的专家。对于ex:,我有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的文档,在获取文档时,社交媒体中有“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中具有更多优先级,但是无法弄清楚如何指定基于条件的优先级。
答案 0 :(得分:1)
为什么不让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
的{{1}}字段匹配,那么就给他们一个分数在这个匹配上。还要包括所有其他不匹配Linkedin
的文档,为Linkedin
添加另一个should
。现在,匹配match_all
的所有内容都会获得分数。如果这些文档也匹配match_all
,那么他们会得到额外的分数,从而使他们得分更高,并且在结果列表中排在第一位。