- 資料建模(Data modeling),是建立資料模型的過程。
- 資料模型是對真實世界進行抽象描述的一種工具和方法,實現對現實世界的對映
- 三個過程:概念模型 =》邏輯模型 =》資料模型(第三正規化)
- 資料模型:結合具體的資料庫,在滿足業務讀寫效能等需求的前提下,確定最終的定義
- Text
- 用於全文字欄位,文字會被 Analyzer 分詞
- 預設不支援聚合分析及排序。需要設定 fielddata 為 true
- Keyword
- 用於 id ,列舉及不需要分詞的文字。例如電話號碼,email 地址,手機號碼,郵政編碼,性別等
- 適用於 Filter(精確匹配),Sorting 和 Aggregations
- 設定多欄位型別
- 預設會為文字型別設定成 text ,並且設定一個 keyword 的子欄位
- 在處理人類語言時,通過增加“英文”,“拼音”和“標準”分詞器,提高搜尋結構
- 資料型別
- 儘量選擇貼近的型別。例如可以用 byte,就不要用 long
- 列舉型別
- 設定為 keyword 。即便是數字,也應該設定成 keyword ,獲取更好的效能
- 其他
- 如不需要檢索,排序和聚合分析
- 如不需要檢索
- 對需要檢索的欄位,可以通過如下配置,設定儲存粒度
- Index_options / Norms : 不需要歸一化資料時,可以關閉
- 如不需要檢索,排序和聚合分析
- 如不需要排序或者聚合分析功能
- Doc_values / fielddata 設定成 false
- 更新頻繁,聚合查詢頻繁的 keyword 型別的欄位
- 推薦將 eager_global_ordinals 設定為 true
- 是否需要專門儲存當前欄位資料
- Store 設定為 true ,可以儲存該欄位的原始資料
- 一般結合 _source 的 enabled 為 false 時候使用
- Disable_source : 節約磁碟,適用於指標型資料
- 一般建議先考慮增加壓縮比
- 無法看到 _source 欄位,無法做 ReIndex,無法做 Update
- Kibana 中無法做 discovery
PUT books/_doc/1
{
"title":"Mastering ElasticSearch 5.0",
"description":"Master the searching, indexing, and aggregation features in ElasticSearch Improve users’ search experience with Elasticsearch’s functionalities and develop your own Elasticsearch plugins",
"author":"Bharvi Dixit",
"public_date":"2017",
"cover_url":"https://images-na.ssl-images-amazon.com/images/I/51OeaMFxcML.jpg"
}
GET books/_mapping
# return
{
"books" : {
"mappings" : {
"properties" : {
"author" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"cover_url" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"description" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"public_date" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"title" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
- 圖書的索引
- 書名:支援全文和精確匹配
- 簡介:支援全文
- 作者:精確值
- 發行日期:日期型別
- 圖書封面:精確值
#優化欄位型別
PUT books
{
"mappings" : {
"properties" : {
"author" : {"type" : "keyword"},
"cover_url" : {"type" : "keyword","index": false},
"description" : {"type" : "text"},
"public_date" : {"type" : "date"},
"title" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 100
}
}
}
}
}
}
#Cover URL index 設定成false,無法對該欄位進行搜尋
POST books/_search
{
"query": {
"term": {
"cover_url": {
"value": "https://images-na.ssl-images-amazon.com/images/I/51OeaMFxcML.jpg"
}
}
}
}
#Cover URL index 設定成false,依然支援聚合分析
POST books/_search
{
"aggs": {
"cover": {
"terms": {
"field": "cover_url",
"size": 10
}
}
}
}
- 新需求:增加圖書內容的欄位,並要求能被搜尋同時支援高亮顯示
- 新需求會導致 _source 的內容過大
- Source Filtering 只是傳輸給客戶端進行過濾, Fetch 資料時, ES 節點還是會傳輸 _source 中的資料
- 解決方法
- 關閉 _source
- 然後將每個欄位的 “store” 設定成 true
DELETE books
#新增 Content欄位。資料量很大。選擇將Source 關閉
PUT books
{
"mappings" : {
"_source": {"enabled": false},
"properties" : {
"author" : {"type" : "keyword","store": true},
"cover_url" : {"type" : "keyword","index": false,"store": true},
"description" : {"type" : "text","store": true},
"content" : {"type" : "text","store": true},
"public_date" : {"type" : "date","store": true},
"title" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 100
}
},
"store": true
}
}
}
}
- 返回結果不包含 _source 欄位
- 對於需要顯示的資訊,可以在查詢中指定 "store_fields"
- 禁止 _source 欄位後,還是支援使用 hignlights API ,高亮顯示 content 中的匹配的相關資訊
# Index 一本書的資訊,包含Content
PUT books/_doc/1
{
"title":"Mastering ElasticSearch 5.0",
"description":"Master the searching, indexing, and aggregation features in ElasticSearch Improve users’ search experience with Elasticsearch’s functionalities and develop your own Elasticsearch plugins",
"content":"The content of the book......Indexing data, aggregation, searching. something else. something in the way............",
"author":"Bharvi Dixit",
"public_date":"2017",
"cover_url":"https://images-na.ssl-images-amazon.com/images/I/51OeaMFxcML.jpg"
}
#查詢結果中,Source不包含資料
POST books/_search
{}
#搜尋,通過store 欄位顯示資料,同時高亮顯示 conent的內容
POST books/_search
{
"stored_fields": ["title","author","public_date"],
"query": {
"match": {
"content": "searching"
}
},
"highlight": {
"fields": {
"content":{}
}
}
}
- Index Template & Dynamic Template
- 根據索引的名字匹配不同的 Mappings 和 Settings
- 可以在⼀個 Mapping 上動態的設定欄位型別
- Index Alias
- Update By Query & Reindex
- 資料建模對功能與效能⾄關重要
- 資料建模對功能與效能⾄關重要
- Mapping. & Setting
- 欄位 Mapping 引數的⼀些回顧,分⽚的設定,會在後續講解
- 通過具體的例項,學習了資料建模時需要考慮的點
- 確定欄位型別
- 是否需要搜尋和聚合以及排序
- 是否需要禁⽌ _source 以及開啟 store
本作品採用《CC 協議》,轉載必須註明作者和本文連結