elasticsearch(9)實現字串排序
阿新 • • 發佈:2018-11-16
對於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" ] } ] } }