ES 筆記三十五:排序及 Doc Values & Field Data

CrazyZard發表於2019-12-22
  • 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 檢視儲存的資訊
- 

快樂就是解決一個又一個的問題!

相關文章