如何按自定义值排序结果,然后按_score排序

时间:2015-01-19 09:42:04

标签: elasticsearch

我的文档如下:

{
  ...
  user: {
    name: "some_name", 
    role: "admin" // this can be "admin", "member" or "guest"
  }
  ...
}

我知道如何通过_score搜索文档和排序结果,但我想按此顺序订购匹配的记录:

  1. 管理员(第一个)
  2. 成员(第二名 - 管理员后)
  3. 来宾(最后 - 管理员和成员之后)
  4. 我想使用_score作为第二个排序参数。

1 个答案:

答案 0 :(得分:1)

您可以使用基于_script的评分:

{
  "query": {
    // whatever
  },
  "sort": [
    {
      "_script": {
        "script": "if(doc['role'].value=='admin') return 1; else if(doc['role'].value=='member') return 2; else if(doc['role'].value=='guest') return 3;",
        "type": "number",
        "order": "asc"
      }
    },
    {
      "_score": {
        "order": "desc"
      }
    }
  ]
}

或者,如果您不介意并且可以这样做,您可以在索引中创建一个新字段,为每个角色放置一个数字 - 就像我在上面的脚本中所做的那样。然后,在您的查询中,您不会使用脚本,但

"sort": [
    {
      "role_ID_field": {
        "order": "asc"
      }
    },
    {
      "_score": {
        "order": "desc"
      }
    }
  ]