介紹
本章介紹es中的Dynamic Mapping,主要介紹什么是Dynamic Mapping裁厅,以及Dynamic Mapping的控制搪搏,還是會以demo的例子進(jìn)行示例架诞。
補(bǔ)充知識
字段的數(shù)據(jù)類型
- Text/Keyword
- Date
- Integer/Floating
- Boolean
- IPV4 & IPV6
- 復(fù)雜類型 對象類型
- geo_point & geo_shape
什么是Mapping
- Mapping類似數(shù)據(jù)庫中schema,有以下的作用
-- 定義索引中的字段
-- 定義索引中字段的數(shù)據(jù)類型
-- 字段狗超,倒排索引的相關(guān)配置 - Mapping會把json文件映射成es中的扁平結(jié)構(gòu)
- 一個(gè)Mapping屬于一個(gè)索引的Type
-- 每個(gè)文檔都有一個(gè)type
-- 每個(gè)type都能有一個(gè)Mapping定義
-- 7.0開始弹澎,不需要在Mapping定義中指定type,因?yàn)橐粋€(gè)文件在7.0之后只能有一個(gè)type
這里主要介紹了Mapping的定義和作用場景
什么是Dynamic Mapping
- 在寫入文檔的時(shí)候努咐,如果索引不存在苦蒿,會自動創(chuàng)建索引
- Dynamic Mapping的機(jī)制,使得我們無需手動定義文檔中字段的數(shù)據(jù)類型渗稍,es會根據(jù)文檔的信息佩迟,自動生成推算出文檔字段的類型
- 但是有時(shí)候依然會出現(xiàn)問題
- 當(dāng)文檔類型設(shè)置不符合預(yù)期時(shí),就會出現(xiàn)我們預(yù)期之外的問題
類型的自動識別
json類型 | es |
---|---|
字符創(chuàng) | 匹配日期時(shí):data;匹配數(shù)字時(shí)竿屹,為float或long(默認(rèn)關(guān)閉);會被設(shè)置為text并且增加keyword |
布爾值 | boolean |
浮點(diǎn)數(shù) | float |
整數(shù) | long |
對象 | Ob |
數(shù)組 | 有第一個(gè)非空數(shù)值的類型鎖決定 |
整數(shù) | 忽略 |
Mapping是否可更改
- 新增加字段
- Dynamic被設(shè)置為true時(shí)报强,一旦有新增字段寫入,Mapping也同時(shí)會被更新
- Dynamic被設(shè)置為false時(shí)拱燃,Mapping不會被更新秉溉,字段也不會被索引,但是新增字段能出現(xiàn)在_source中
- Dynamic設(shè)置為strict扼雏,文檔寫入失敗坚嗜,自然也不能被索引和搜索
- 已有字段
- Lucene實(shí)現(xiàn)的倒排索引,一旦生成就無法被修改诗充,除非使用reindex
實(shí)例
{
"name":"Li",
"loginDate":"2020-04-13T10:29:48.103Z"
}
先插入一段數(shù)據(jù)看看Mapping為我們干了啥
GET mapping_test/_mapping
返回結(jié)果
可以看到Name被Mapping成了text苍蔬,而loginDate則被Mapping成了date類型
刪除這個(gè)索引,我們重新再建一個(gè)看看
PUT mapping_test/_doc/1
{
"uid" : "123",
"isVip" : false,
"isAdmin": "true",
"age":19,
"heigh":180
}
返回結(jié)果
我們可以看到 isAdmin因?yàn)橹脼椤皌rue”被Mapping成text類型蝴蜓,isVip得到了正常的boolean類型
#默認(rèn)Mapping支持dynamic碟绑,寫入的文檔中加入新的字段
PUT dynamic_mapping_test/_doc/1
{
"newField":"someValue"
}
POST dynamic_mapping_test/_search
{
"query":{
"match":{
"newField":"someValue"
}
}
}
通過搜索我們能看到的是
返回結(jié)果
改新增字段能被搜索,也能出現(xiàn)在_source中
接下來我們修改dynamic為false茎匠,再新增字段看看
PUT dynamic_mapping_test/_mapping
{
"dynamic": false
}
PUT dynamic_mapping_test/_doc/10
{
"anotherField":"someValue"
}
POST dynamic_mapping_test/_search
{
"query":{
"match":{
"anotherField":"someValue"
}
}
}
返回結(jié)果
這個(gè)就不能被搜索到了
我們再設(shè)置dynamic為strict格仲,再新增字段看看
PUT dynamic_mapping_test/_mapping
{
"dynamic": "strict"
}
PUT dynamic_mapping_test/_doc/12
{
"lastField":"value"
}
返回結(jié)果
這時(shí)候再插入的時(shí)候已經(jīng)報(bào)錯(cuò)了
總結(jié)
本章通過實(shí)例介紹了什么是Dynamic Mapping和Dynamic Mapping的控制