目錄web
(1) 映射(mapping): 定義index的元數據, 指定要索引並存儲的文檔的字段類型.json
也就是說映射決定了Elasticsearch在創建倒排索引、進行檢索時對文檔採起的相關策略, 如數字類型、日期類型、文本類型等等.bash
須要注意的是: 檢索時用到的分析策略, 要和創建索引時的分析策略相同, 不然將致使數據不許確.app
(2) ES對不一樣的類型有不一樣的存儲和檢索策略.ui
① 好比: 對full text型的數據類型(如text), 在索引時, 會通過各種處理 (包括分詞、normalization(時態轉換、同義詞轉換、大小寫轉換)等處理), 纔會創建到索引數據中.
② 再好比: 對exact value(如date), 在索引的分詞階段, 會將整個value做爲一個關鍵詞創建到倒排索引中.code
每一個index都有一 (至多) 個type, 每一個type對應一個mapping.orm
在Elasticsearch 6.X版本開始, 1個index只能有1個type.blog
每一個mapping都由下述部分組成:索引
① 元字段:
_index
、_type
、_id
和_source
.
② field/properties(字段或屬性): 同一index中, 同名的field的映射配置必須相同rema) 由於index是根據
_type
元字段來區分type的, 也就是存儲的每一個文檔中都有_type
等元字段, 若是相同名稱的field的映射(_type
字段的值)不一樣, Elasticsearch在解析時就會出現衝突.b) 這些參數能夠例外:
copy_to、dynamic、enabled、ignore_above、include_in_all
.
關於type的處理方法, 能夠參考博客: ES XX - Elasticsearch對type的處理(type的底層結構).
每一個文檔都有與之關聯的元數據 —— ES內部爲全部的文檔配備的field, 都是如下劃線_
開頭的內置字段.
具體的內容請參考博文 ES XX - Elasticsearch的元字段 中詳細講解.
Elasticsearch中每一個field都對應一至多個數據類型.
詳細的內容請參考博文 ES XX - Elasticsearch中字段的類型 中詳細講解.
(1) 必讀說明:
① 建立mapping時, 能夠指定每一個field是否須要:
索 引:
"index": true
—— 默認配置
不索引:"index": false
② mapping root object
:
每一個type對應的mapping的JSON串, 包括properties, metadata(_id, _source, _type) , settings(analyzer) , 其餘settings(如include_in_all)
(2) 建立mapping的示例:
需求: 建立名爲website的索引, 包含一個user類型. user類型中禁用元字段_all
.
PUT website { "mappings": { "user": { // 這就是一個root object "_all": { "enabled": false }, // 禁用_all字段 "properties": { "user_id": { "type": "text" }, "name": { "type": "text", "analyzer": "english" }, "age": { "type": "integer" }, "sex": { "type": "keyword" }, "birthday": { "type": "date", "format": "strict_date_optional_time||epoch_millis" }, "address": { "type": "text", "index": false // 不分詞 } } } } }
(3) 過時提示說明 —— 這裏使用的是Elasticsearch 6.6.10版本:
① 是否索引的API已經作了修改, 若使用"analyzed" | "not_analyzed" | "yes" | "no"等, 將拋出以下警告:
#! Deprecation: Expected a boolean [true/false] for property [index] but got [not_analyzed] #! Deprecation: Expected a boolean [true/false] for property [index] but got [no]②
_all
元字段也將在7.0版本中移除, 它建議咱們使用copy_to
定製本身的all field
:#! Deprecation: [_all] is deprecated in 6.0+ and will be removed in 7.0. As a replacement, you can use [copy_to] on mapping fields to create your own catch all field.
(1) 必讀說明:
映射一旦建立完成, 就不容許修改:
—— Elasticsearch對文檔的分析、存儲、檢索等過程, 都是嚴格按照mapping中的配置進行的. 若是容許後期修改mapping, 在檢索時對索引的處理將存在不一致的狀況, 致使數據檢索行爲不許確.
只能在建立index的時候手動配置mapping, 或者新增field mapping, 可是不能update field mapping.
(2) 更新mapping出現異常:
修改已經建立好的mapping
PUT website { "mappings": { "user": { "properties": { "author_id": { "type": "text" } } } } }
拋出以下錯誤 —— 索引已經存在的異常:
{ "error": { "root_cause": [ { "type": "resource_already_exists_exception", "reason": "index [website/mVYk4-a7RMOZbkcCp2avfw] already exists", "index_uuid": "mVYk4-a7RMOZbkcCp2avfw", "index": "website" } ], "type": "resource_already_exists_exception", "reason": "index [website/mVYk4-a7RMOZbkcCp2avfw] already exists", "index_uuid": "mVYk4-a7RMOZbkcCp2avfw", "index": "website" }, "status": 400 }
(3) 向mapping中添加新type:
向已有mapping中添加字段及其映射信息:
PUT website/_mapping/user // 修改user類型的_mapping, 注意API的順序 { "properties": { "new_field": { "type": "text", "index": false } } }
(1) 查看mapping的API:
GET website/_mapping
(2) 查看的結果信息以下:
{ "website" : { "mappings" : { "user" : { "_all" : { "enabled" : false // 禁用元字段_all }, "properties" : { "address" : { "type" : "text", "index" : false // 不索引 }, "age" : { "type" : "integer" }, "birthday" : { "type" : "date" }, "name" : { "type" : "text", "analyzer" : "english" }, "new_field" : { // 後期添加的新字段 "type" : "text", "index" : false // 不索引 }, "sex" : { "type" : "keyword" }, "user_id" : { "type" : "text" } } } } } }
版權聲明
做者: 馬瘦風
出處: 博客園 馬瘦風的博客
您的支持是對博主的極大鼓勵, 感謝您的閱讀.
本文版權歸博主全部, 歡迎轉載, 但請保留此段聲明, 並在文章頁面明顯位置給出原文連接, 不然博主保留追究相關人員法律責任的權利.