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(生產環境中,盡量不用打開Dynamic)
- 當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