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

标签 elasticsearch

我正在寻找一种方法来做到这一点。我需要显示用户映射内的所有专家。 (专家是字段角色等于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/

相关文章:

使用http身份验证的Django Haystack连接错误

elasticsearch - 如何使用delete_by_query api删除索引中包含特定字段的所有文档?

php - Laravel Scout - 搜索垃圾记录并保持软删除模型更新

elasticsearch - 弹性匹配文档,包含数组中的所有值

elasticsearch - 将新字段添加到嵌套对象

elasticsearch - ElasticSearch嵌套[AND OR]过滤器

elasticsearch - elasticsearch:如何根据搜索结果中的类型设置自定义记录计数

elasticsearch - 如何使用java在Elasticsearch中删除文档的字段属性?

elasticsearch - ElasticSearch-按字段值返回唯一结果

regex - Kibana : Cannot query with regex having space