什么是Mapping
- Mapping類似數(shù)據(jù)庫中的schema的定義,作用如下
- 定義索引中的字段的名稱
- 定義字段的數(shù)據(jù)類型瞄勾,例如字符串,數(shù)字鲸郊,布爾
- 字段丰榴,倒排索引的相關配置,(Analyzed or Not Analyzed, Analyzer)
- Mapping會把JSON文檔映射成Lucene所需要的扁平格式
- 一個Mapping屬于一個索引的Type
- 7.0開始秆撮,不需要再Mapping中指定type信息
字段的數(shù)據(jù)類型
- 簡單類型
- Text / Keyword
- Date
- Integer / Floating
- Boolean
- IPV4 & IPV6
- 復雜類型:對象和嵌套類型
- 對象類型 / 嵌套類型
- 特殊類型
- geo_point
- geo_shape
- percolator
什么是Dynamic Mapping
- 在寫入文檔時候四濒,如果索引不存在,會自動創(chuàng)建索引
- Dynamic Mapping的機制职辨,使得我們無需手動定義Mappings盗蟆。Elasticsearch會自動根據(jù)文檔信息,推算出字段的類型
- 但是有時候會推算的不對舒裤,例如地理位置信息
- 當類型如果設置不對時喳资,會導致一些功能無法正常運行,例如Range查詢
類型自動識別
JSON類型 | Elasticsearch類型 |
---|---|
字符串 | 1. 匹配日期格式腾供,設置成Date 2. 匹配數(shù)字設置為float或者long仆邓,該選項默認關閉 3. 設置為Text,并且增加keyword子字段 |
布爾值 | boolean |
浮點數(shù) | float |
整數(shù) | long |
對象 | Object |
數(shù)組 | 由第一個非空數(shù)值的類型所決定 |
空值 | 忽略 |
能否更改Mapping的字段類型
- 兩種情況
- 新增加字段
- Dynamic設置為true時伴鳖,一旦有新增字段的文檔寫入节值,Mapping也同時被更新
- Dynamic設置為false時,Mapping不會被更新榜聂,新增字段的數(shù)據(jù)無法被索引搞疗,但是信息會出現(xiàn)在_source中
- 對已有字段,一旦已經(jīng)有數(shù)據(jù)寫入须肆,就不再支持修改字段的定義
- Lucene實現(xiàn)的倒排索引匿乃,一旦生成后,就不允許修改
- 如果希望改變字段類型豌汇,必須Reindex API幢炸,重建索引
- 新增加字段
- 原因
- 如果修改了字段的數(shù)據(jù)類型,會導致已經(jīng)被索引的屬性無法被搜索
- 但是如果是增加新的字段瘤礁,就不會有這樣的影響
控制Dynamic Mapings
"true" | "false" | "strict" | |
---|---|---|---|
文檔可索引 | YES | YES | NO |
字段可索引 | YES | NO | NO |
Mapping被更新 | YES | NO | NO |
- 當dynamic被設置成false時候阳懂,存在新增字段的數(shù)據(jù)寫入,該數(shù)據(jù)可以被索引
- 當設置成Strict模式的時候,數(shù)據(jù)寫入直接報錯