1. 程式人生 > >elasticsearch(9)實現字串排序

elasticsearch(9)實現字串排序

對於text型別欄位,ES預設分詞且不會建立正排索引。即使設定"fielddata": true建立正排索引後,對該欄位的排序依然有問題:ES不會以整個欄位文字排序,而是選擇分詞後的一個欄位進行排序。

對於ES5.x可以設定需要排序的欄位為keyword型別,該型別預設不分詞且"doc_values":true即預設建立正排索引。

對於需要分詞的欄位,想實現字串排序可以將該欄位建立兩次索引,一個索引設定為text型別用於分詞,一個索引設定為keyword型別用於排序。示例如下:

1、建立兩次索引

PUT /testindex
{
  "mappings": {
    "testtype":{
      "properties": {
        "title":{
          "type": "text",
          "fields": {
            "raw":{
              "type": "keyword"
            }
          }
        }
      }
    }
  }
}

2、新增資料

PUT /testindex/testtype/1
{
  "title":"hello world"
}

3、字串排序

GET /testindex/testtype/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "title.raw": {
        "order": "asc"
      }
    }
  ]
}

4、排序結果

返回結果中,可見ES是以該欄位的整個字串排序,而不是已分詞後的一個欄位排序。

{
  "hits": {
    "total": 1,
    "max_score": null,
    "hits": [
      {
        "_index": "testindex",
        "_type": "testtype",
        "_id": "1",
        "_score": null,
        "_source": {
          "title": "hello world"
        },
        "sort": [
          "hello world"
        ]
      }
    ]
  }
}