- ES 預設採用相關性算分對結果進行降序排序
- 可以通過設定sorting引數,自行設定排序
- 如果不指定_score,算分為null
POST /**/_search
{
"size" : 5
"query":{
"match_all":{}
},
"sort":[
{
"order_data":{
"order:"desc"
}
}
]
}
- 組合多個條件
- 優先考慮寫在前面的排序
- 支援對相關性算分進行排序
POST /**/_search
{
"size" : 5
"query":{
"match_all":{}
},
"sort":[
{"order_data":{"order:"desc" } },
{"_doc":{"order:"asc" } },
{"_score":{"order:"desc" } },
]
}
POST /**/_search
{
"size" : 5
"query":{
"match_all":{}
},
"sort":[
{"text":{"order:"desc" } },
]
}
//對 text 欄位進行排序。預設會報錯,需開啟fielddata
PUT kibana_sample_data_ecommerce/_mapping
{
"properties": {
"customer_full_name" : {
"type" : "text",
"fielddata": true,
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
- 排序是針對欄位原始內容進行的。倒排索引無法發揮作用
- 需要用到正排索引。通過文件ID和欄位快速得到欄位原始內容
- ES有2種實現方式
- Fielddata
- Doc Values(列式儲存,對Text型別無效)
Doc Values | Field data | |
---|---|---|
何時建立 | 索引時,和倒排索引一起建立 | 搜尋時候動態建立 |
建立位置 | 磁碟檔案 | JVM Heap |
優點 | 避免大量記憶體佔用 | 索引速度快,不佔用額外的磁碟空間 |
缺點 | 降低索引速度,佔用額外磁碟空間 | 文件過多時,動態建立開銷大,佔用過多 JVM Heap |
預設值 | ES 2.x之後 | ES1.x及之前 |
- 預設關閉,可以通過Mapping設定開啟。修改設定後,即時生效,無需縮減索引
- 其他欄位型別不支援,支援對Text進行設定
- 開啟後,可以對Text欄位進行排序,但是結果無法滿足預期,不建議使用
- 部分情況下開啟,滿足一些聚合分析的特定需求
- 預設啟動,可以通過Mapping 設定關閉
- 增減索引速度/ 減少磁碟空間
- 如果重新開啟,需要重建索引
- 什麼時候需要關閉
- 明確不需要做排序及聚合分析
PUT test_keyword/_mapping { "properties": { "user_name":{ "type": "keyword", "doc_values":false } } }
- 明確不需要做排序及聚合分析
- Text型別的不支援Doc Values
- Text型別開啟Fielddata後,可以檢視分詞後的資料
DELETE temp_users PUT temp_users PUT temp_users/_mapping { "properties": { "name":{"type": "text","fielddata": true}, "desc":{"type": "text","fielddata": true} } }
Post temp_users/_doc
{"name":"Jack","desc":"Jack is a good boy!","age":10}
POST temp_users/_search
{
"docvalue_fields": [
"name","desc"
]
}
POST temp_users/_search
{
"docvalue_fields": [
"age"
]
}
# Fielddata Demo
- 對Text欄位設定fielddata ,支援隨時修改
- Doc Values 可以在Mapping 中關閉,但是需要重新索引
- Text 不支援Doc Values
- 使用docvalue_fields 檢視儲存的資訊
-