Elasticsearch is not sorting the results

14,839

The field "title" in your document is an analyzed string field, which is also a multivalued field, which means elasticsearch will split the contents of the field into tokens and stores it separately in the index. You probably want to sort the "title" field alphabetically on the first term, then on the second term, and so forth, but elasticsearch doesn’t have this information at its disposal at sort time.

Hence you can change your mapping of the "title" field from:

{
  "title": {
    "type": "string", "boost": 9, "analyzer": "autocomplete", "search_analyzer": "standard"
  }
}

into a multifield mapping like this:

{
  "title": {
    "type": "string", "boost": 9, "analyzer": "autocomplete", "search_analyzer":"standard",
    "fields": {
      "raw": {
        "type": "string",
        "index": "not_analyzed"
      }
    }
  }
}

Now execute your search based on analyzed "title" field and sort based on the not_analyzed "title.raw" field

{
    "sort": [{
        "title.raw": {"order": "desc"}
    }],
    "query":{
        "term": { "title": "pagos" }
    }
}

It is beautifully explained here: String Sorting and Multifields

Share:
14,839
Alberto Menendez Romero
Author by

Alberto Menendez Romero

Updated on June 20, 2022

Comments

  • Alberto Menendez Romero
    Alberto Menendez Romero almost 2 years

    I'm having problem with an elasticsearch query. I want to be able to sort the results but elasticsearch is ignoring the sort tag. Here my query:

    {
        "sort": [{
            "title": {"order": "desc"}
        }],
        "query":{
            "term": { "title": "pagos" }
        }
    }
    

    However, when I remove the query part and I send only the sort tag, it works. Can anyone point me out the correct way?

    I also tried with the following query, which is the complete query that I have:

    {
      "sort": [{
        "title": {"order": "asc"}
      }],
      "query":{
        "bool":{
          "should":[
            {
              "match":{
                "title":{
                  "query":"Pagos",
                  "boost":9
                }
              }
            },
            {
              "match":{
                "description":{
                  "query":"Pagos",
                  "boost":5
                }
              }
            },
            {
              "match":{
                "keywords":{
                  "query":"Pagos",
                  "boost":3
                }
              }
            },
            {
              "match":{
                "owner":{
                  "query":"Pagos",
                  "boost":2
                }
              }
            }
          ]
        }
      }
    }
    

    Settings

    {
      "settings": {
        "analysis": {
          "filter": {
            "autocomplete_filter": {
              "type": "ngram",
              "min_gram": 3,
              "max_gram": 15,
              "token_chars": [
                "letter",
                "digit",
                "punctuation",
                "symbol"
              ]
            }
          },
          "analyzer": {
            "default" : {
              "tokenizer" : "standard",
              "filter" : ["standard", "lowercase", "asciifolding"]
            },
            "autocomplete": {
              "type": "custom",
              "tokenizer": "standard",
              "filter": [
                "lowercase",
                "asciifolding",
                "autocomplete_filter"
              ]
            }
          }
        }
      }
    }
    

    Mappings

    {
      "objects": {
        "properties": {
          "id":             { "type": "string", "index": "not_analyzed" },
          "type":           { "type": "string" },
          "title":          { "type": "string", "boost": 9, "analyzer": "autocomplete", "search_analyzer": "standard" },
          "owner":          { "type": "string", "boost": 2 },
          "description":    { "type": "string", "boost": 4 },
          "keywords":       { "type": "string", "boost": 1 }
        }
      }
    }
    

    Thanks in advance!