在ES中,index至關於數據庫,type至關於表,而mapping則至關於表結構。數據庫
簡單來說,elasticsearch會在你插入數據的時候,自動根據數據類型設置mapping格式。並且由於通常文檔數據都是不規則的,因此ES的mapping會根據插入值格式的變動,自動進行mapping變動。json
雖然對於初學者而言,不須要了解mapping裏面的各類特性,也能夠很方便的使用ES的各類搜索功能,這也是ES推薦的——開箱即用。對初學者來講是十分友好的。數組
可是對於一個系統開發人員,必需要保證對系統很是熟悉,同時也要對數據的處理進行優化,這就須要進階學習(若是你還在初級入門階段,本文章中的內容你能夠直接忽略,以後有興趣再來閱讀)。瀏覽器
言歸正傳,咱們分如下幾個部分來學習ES的mapping是怎麼玩耍的。網絡
ES的mapping很是相似於靜態語言中的數據類型:聲明一個變量爲int類型的變量, 之後這個變量都只能存儲int類型的數據。一樣的, 一個number類型的mapping字段只能存儲number類型的數據。數據結構
同語言的數據類型相比,mapping還有一些其餘的含義,mapping不只告訴ES一個field中是什麼類型的值, 它還告訴ES如何索引數據以及數據是否能被搜索到。app
當你的查詢沒有返回相應的數據, 你的mapping頗有可能有問題。當你拿不許的時候, 直接檢查你的mapping。elasticsearch
如何查看當前數據庫裏面的mapping(你能夠用postman或者瀏覽器訪問如下連接):post
http://127.0.0.1:9200/{index}/{type}/_mapping?pretty性能
若是index爲: b2bware, type爲:commerical_sku
http://127.0.0.1:9200/b2bware/commercial_sku/_mapping?pretty
以上是看某個type下的mapping結構,若是你要看整個庫的mapping,URL請去掉type斷便可,如:
http://127.0.0.1:9200/b2bware/_mapping?pretty
返回結果如:
{ "b2bware" : { "mappings" : { "commercial_sku" : { "properties" : { "message" : { "type" : "string" }, "price" : { "type" : "string" }, "tid" : { "type" : "string" }, "user" : { "type" : "string" } } } } } }
第一種建立方式
就是直接插入數據,而後ES根據插入數據格式自動識別建立mapping,這種傻瓜式的方式很是簡便,適合初學者。
如,建立一個ID爲1 的新對象: http://127.0.0.1:9200/b2bware/newtable/1
{ "name":"test info ", "content":"簡單的json對象" }
第二種建立方式
建index的時候,直接指定mappings,能夠一次性建立多個mapping,以下面的代碼所示:
URL:
參數body(放在post或者put請求的body部分)
{ "settings": { "index": { "number_of_shards": "10", //分10個片 "number_of_replicas": "1" //1個備份 } }, "mappings": { "commercial_sku": { //這是其中一個mapping,你還能夠建立其餘mapping "_timestamp": { //這個配置能夠刪掉 "enabled": true }, "properties": { "message": { "type": "string" }, "price": { "type": "string" }, "tid": { "type": "string" }, "user": { "type": "string" } } } } }
第三種建立方式
已經建立了index(庫已經建立),新增一個mapping
URL:http://127.0.0.1:9200/b2bware/_mapping/article PUT方式
注意,這種建立方式type[表名]是在URL中指定的,BODY部分只是指定了表結構:
{ "properties": { "message": { "type": "string" }, "price": { "type": "string" }, "tid": { "type": "string" }, "user": { "type": "string" } } }
由於mapping只能進行追加修改,因此在建type的時候,最好清晰的知道表結構,不然數據變動起來比較麻煩,就像MySQL中已經有一個age存儲的是字符串,忽然有一天想改成int,由於存在歷史數據,要變動就不那麼容易。
因此ES的mapping調整隻能追加字段,以下,新增一個 visitCount字段:
URL:http://127.0.0.1:9200/b2bware/article/_mapping PUT方式
{ "properties": { "visitCount": { "type": "integer" } } }
mapping一旦建立以後,就沒法修改,只能追加,若是要修改,就須要刪除掉整個文檔進行重建。
mappings : 在index(庫)下建立時使用,下面能夠有多個mapping 如下數據結構主要針對每一個mapping進行說明:
一級屬性 | 二級屬性 | 三級屬性 | 說明 |
---|---|---|---|
dynamic | 新增字段自動模式;true:表示自動識別新字段並建立索引,false:不自動索引新字段,strict:遇到未知字段,拋異常,不能存入 | ||
_timestamp | 是否使用時間戳,ES會自動加時間戳,使用的話請百度 | ||
properties | 屬性列表(相似數據庫多個字段定義) | ||
{字段名} | 某個字段的定義 | ||
type | 數據類型,參見數據類型說明 | ||
index | 映射選型,參見映射選型說明 | ||
doc_values | 布爾值, 對not_analyzed字段,默認都是開啓,分詞字段不能使用,對排序和聚合能提高較大性能,節約內存 | ||
format | 若是數據類型爲日期格式,傳入值得時候是字符串,ES須要一個格式進行識別,如:yyyy-MM-dd HH:mm: ss | ||
analyzer | 分詞器,如ik,ansj(中文分詞) | ||
boost | 浮點型,字段級別的分數加權(權重) | ||
ignore_above | 超過多少字符,就不處理,分詞性能損耗較大,對字符串較長的可不分詞 | ||
null_value | 設置一些缺失字段的初始化值,只有string可使用,分詞字段的null值也會被分詞 | ||
store | 是否單獨設置此字段的是否存儲而從_source字段中分離,默認是false,只能搜索,不能獲取值 | ||
search_analyzer | 設置搜索時的分詞器,默認跟ananlyzer是一致的,好比index時用standard+ngram,搜索時用standard用來完成自動提示功能 | ||
其它 | similarity,term_vector,norms,include_in_all,index_options,fielddata,ignore_malformed,precision_step |
一個典型的mapping對象的屬性有:
{ "mappings": { "my_type": { //true:表示自動識別新字段並建立索引,false:不自動索引新字段,strict:遇到未知字段,拋異常,不能存入 "dynamic": "strict", //動態模板 "dynamic_templates": [ { "stash_template": { "path_match": "stash.*", "mapping": { "type": "string", "index": "not_analyzed" } }} ], //屬性列表 "properties": { //一個strign類型的字段 "title": { "type": "string"}, "stash": { "type": "object", "dynamic": true } } } } }
Elasticsearch自帶的數據類型是Lucene索引的依據,也是咱們作手動映射調整到依據。 映射中主要就是針對字段設置類型以及類型相關參數。
JSON基礎類型以下:
字符串:string
數字:byte、short、integer、long、float、double、
時間:date
布爾值: true、false
數組: array
對象: object
Elasticsearch獨有的類型:
多重: multi
經緯度: geo_point
網絡地址: ip
堆疊對象: nested object
二進制: binary
附件: attachment
(3)複合類型
數組類型:沒有明顯的字段類型設置,任何一個字段的值,均可以被添加0個到多個,要求,他們的類型必須一致: 對象類型:存儲相似json具備層級的數據 嵌套類型:支持數組類型的對象Aarray[Object],可層層嵌套
(4)地理類型
geo-point類型: 支持經緯度存儲和距離範圍檢索
geo-shape類型:支持任意圖形範圍的檢索,例如矩形和平面多邊形
(5)專用類型 ipv4類型:用來存儲IP地址,es內部會轉換成long存儲
completion類型:使用fst有限狀態機來提供suggest前綴查詢功能
token_count類型:提供token級別的計數功能
mapper-murmur3類型:安裝sudo bin/plugin install mapper-size插件,可支持_size統計_source數據的大小
注意點:
Elasticsearch映射雖然有idnex和type兩層關係,可是實際索引時是以index爲基礎的。 若是同一個index下不一樣type的字段出現mapping不一致的狀況 雖然數據依然能夠成功寫入並生成並生成各自的mapping, 但實際上fielddata中的索引結果卻依然是以index內第一個mapping類型來生成的。
某個屬性(字段)的index可選值有:
analyzed:默認選項,以標準的全文索引方式,分析字符串,完成索引。
not_analyzed:精確索引,不對字符串作分析,直接索引字段數據的精確內容。
no:不索引該字段。