user606521
user606521

Reputation: 15424

How to order results by custom value and then by _score

My document looks like this:

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

I know how to search for documents and ordering results by _score however I would like to order matching records in this order:

  1. admins (first)
  2. members (second - after admins)
  3. guests (last - after admins and members)

And I would like to use _score as a second ordering parameter.

Upvotes: 1

Views: 168

Answers (1)

Andrei Stefan
Andrei Stefan

Reputation: 52368

You can use a _script based scoring:

{
  "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"
      }
    }
  ]
}

OR, if you don't mind and can do this, you can create a new field in your index where you place for each role a number - like I did in the script above. Then, in your queries you don't use scripting, but

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

Upvotes: 1

Related Questions