Elasticsearch數據建模筆記

  • 2020 年 3 月 16 日
  • 筆記

數據建模
  • 數據建模是創建數據模型的過程
    • 數據模型是對真實世界進行抽象描述的一種工具和方法,實現對現實世界的映射
    • 三個過程:概念模型=》邏輯模型=》數據模型
      • 數據模型:結合具體的資料庫,在滿足業務讀寫性能等需求的前提下,確定最終定義
  • 數據建模:功能需求+性能需求
    • 邏輯模型(功能需求)
      • 實體屬性
      • 實體之間的關係
      • 搜索相關的配置
    • 物理模型(性能需求)
      • 索引模版
        • 分片數量
      • 索引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