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
相關文章
相關標籤/搜索