Elasticsearch資料建模筆記
阿新 • • 發佈:2020-03-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 &nbs