ES 筆記四十六:Elasticsearch 資料建模例項

CrazyZard發表於2020-01-27
  • 資料建模(Data modeling),是建立資料模型的過程。
    • 資料模型是對真實世界進行抽象描述的一種工具和方法,實現對現實世界的對映
      • 部落格、作者、使用者評論
    • 三個過程:概念模型 =》邏輯模型 =》資料模型(第三正規化)
      • 資料模型:結合具體的資料庫,在滿足業務讀寫效能等需求的前提下,確定最終的定義

ES 筆記四十六:Elasticsearch 資料建模例項

ES 筆記四十六:Elasticsearch 資料建模例項

  • 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_values / fielddata 設定成 false
  • 更新頻繁,聚合查詢頻繁的 keyword 型別的欄位
    • 推薦將 eager_global_ordinals 設定為 true
  • 是否需要專門儲存當前欄位資料
    • Store 設定為 true ,可以儲存該欄位的原始資料
    • 一般結合 _source 的 enabled 為 false 時候使用
  • Disable_source : 節約磁碟,適用於指標型資料
    • 一般建議先考慮增加壓縮比
    • 無法看到 _source 欄位,無法做 ReIndex,無法做 Update
    • Kibana 中無法做 discovery
  • 圖書的索引
    • 書名
    • 簡介
    • 作者
    • 發行日期
    • 圖書封面

ES 筆記四十六:Elasticsearch 資料建模例項

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
            }
          }
        }
      }
    }
  }
}
  • 圖書的索引
    • 書名:支援全文和精確匹配
    • 簡介:支援全文
    • 作者:精確值
    • 發行日期:日期型別
    • 圖書封面:精確值

ES 筆記四十六:Elasticsearch 資料建模例項

#優化欄位型別
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

ES 筆記四十六:Elasticsearch 資料建模例項

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 中的匹配的相關資訊

ES 筆記四十六:Elasticsearch 資料建模例項

# 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 協議》,轉載必須註明作者和本文連結

快樂就是解決一個又一個的問題!

相關文章