1. 程式人生 > >Elasticsearch資料建模筆記

Elasticsearch資料建模筆記

資料建模
  • 資料建模是建立資料模型的過程
    • 資料模型是對真實世界進行抽象描述的一種工具和方法,實現對現實世界的對映
    • 三個過程:概念模型=》邏輯模型=》資料模型
      • 資料模型:結合具體的資料庫,在滿足業務讀寫效能等需求的前提下,確定最終定義
  • 資料建模:功能需求+效能需求
    • 邏輯模型(功能需求)
      • 實體屬性
      • 實體之間的關係
      • 搜尋相關的配置
    • 物理模型(效能需求)
      • 索引模版
        • 分片數量
      • 索引Mapping
        • 欄位配置
        • 關係處理
  • 對欄位進行建模
          
    • 欄位型別:
      • Text vs Keyword
        • Text
          • 用於全文字欄位,文字會被Analyzer分詞
          • 預設不支援聚合分析及排序。需要設定fielddata為true
        • Keyword
          • 用於id,列舉及不需要分詞的文字。例如電話號碼,email地址,手機號碼,郵政編碼,性別等
          • 適用於Filter(精確匹配),Sorting和Aggregations
        • 設定多欄位型別
          • 預設會為文字型別設定成text,並且設定一個keyword的子欄位
          • 在處理人類語言時,通過增加“英文”,“拼音”和“標準”分詞器,提高搜尋結果
      • 結構化資料
        • 數值型別
          • 儘量選擇貼近的型別。例如可以用byte,就不要用long
        • 列舉型別
          • 設定為keyword。即便是數字,也應該設定成keyword,獲取更加好的效能
        • 其他
          • 日期/布林/地理資訊
    • 檢索
      • 如不需要檢索
        • Enable設定成false
      • 如不需要檢索
        • Index設定成false
      • 對需要檢索的欄位,可以通過如下配置,設定儲存粒度
        • Index_options/Norms:不需要歸一化資料時,可以關閉
    • 聚合及排序
      • 如不需要排序和聚合分析
        • Enable設定成false
      • 如不需要排序或者聚合分析
        • Doc_value/fielddata設定成false
      • 更新頻繁,聚合查詢頻繁的keyword型別的欄位
        • 推薦eager_global_ordinals設定為true
    • 額外的儲存
      • 是否需要專門儲存當前欄位資料
      • Disable _source:節約磁碟;適用於指標型資料
        • 一般建議考慮增加壓縮比
        • 無法看到_source欄位,無法ReIndex 無法Upadte
        • Kibana中無法做discovery
  • 最佳實踐
    • 建模建議一:如何處理關聯關係

            

    • 建模建議二:避免過多欄位
      • 一個文件中,最好避免大量的欄位
        • 過多的欄位數不容易維護
        • Mapping資訊儲存在Cluster State中,資料量過大,對叢集效能會有影響(Cluster State資訊需要和所有的節點同步)
        • 刪除或者修改資料需要reindex
      • 預設最大欄位數是1000,可以設定index.mapping.tatal_fields.limt限定最大欄位數
      • Dynamic vs Strict
        • Dynamic(生產環境中,儘量不用開啟Dynamic)
          • true-未知欄位會被自動加入
          • false-新欄位不會被索引。但是會儲存在_source
          • strict-新欄位不會被索引,文件寫入失敗
        • Strict
          • 可以控制道欄位級別  
      • 當Dynamic設定為True,同時採用扁平化的設計且鍵值對過多會導致欄位數量的膨脹,通過Nested物件儲存key/value可以減少欄位數量。
    • 建模建議三:避免正則查詢
      • 通過 Inner Object避免低效能的正則匹配 
{
  "version":{
  "display_name":"7.1.0",
  "marjor":7,
  "minor":1,
  "hot_fix":0  
  }
}
    • 建模建議四:避免空值引起的聚合不準確
      • 使用Null_Value解決空值的問題
    • 建模建議五:為索引的Mapping加入Meta資訊便於管理
{
  "mappings": {
    "_meta": {
      "software_version_mapping": "1.0"
    }
  }
}

 

 

Mapping欄位的相關設定 https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-params.html &nbs