2

Let's say that I store documents like this in ElasticSearch:

{
    'name':'user name', 
    'age':43, 
    'location':'CA, USA', 
    'bio':'into java, scala, python ..etc.', 
    'tags':['java','scala','python','django','lift']
}

And let's say that I search using location=CA, how can I sort the results according to the number of the items in 'tags'?

I would like to list the people with the most number of tag in the first page.

Winston Chen
  • 6,799
  • 12
  • 52
  • 81

1 Answers1

3

You can do it indexing an additional field which contains the number of tags, on which you can then easily sort your results. Otherwise, if you are willing to pay a little performance cost at query time there's a nice solution that doesn't require to reindex your data: you can sort based on a script like this:

{
    "query" : {
        "match_all" : {}
    },
    "sort" : {
        "_script" : { 
            "script" : "doc['tags'].values.length",
            "type" : "number",
            "order" : "asc"
        }
    }
}

As you can read from the script based sorting section:

Note, it is recommended, for single custom based script based sorting, to use custom_score query instead as sorting based on score is faster.

That means that it'd be better to use a custom score query to influence your score, and then sort by score, like this:

{
    "query" : {
        "custom_score" : {
            "query" : {
                "match_all" : {}
            },
            "script" : "_score * doc['tags'].values.length"
        }
    }
}
javanna
  • 59,145
  • 14
  • 144
  • 125