为符合特定条件的文档添加排序优先级

时间:2014-11-10 14:07:37

标签: elasticsearch

我正在寻找一种方法来做到这一点。我需要在用户映射中显示所有专家。 (专家是具有场角色的文件等于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中具有更多优先级,但是无法弄清楚如何指定基于条件的优先级。

1 个答案:

答案 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,那么他们会得到额外的分数,从而使他们得分更高,并且在结果列表中排在第一位。