一、動態(tài)mapping
在我們最開始使用ES的時候颠区,可能還不太了解mapping棵帽,也沒有添加過mapping為什么我們還是能夠正常的添加文檔。
那是因為ES可以動態(tài)映射旺矾,添加文檔的時候遇到?jīng)]有的字段蔑鹦,可以動態(tài)的添加到mapping中,下面是一些默認的mapping方式宠漩。
| 數(shù)值 | 如果缺失在mapping中添加類型 |
| null | 空值不添加類型到mapping |
| true举反、false | 添加一個boolean類型 |
| 浮點數(shù) | 添加一個floating類型 |
| 整數(shù) | 添加一個long類型|
| object | 添加一個object類型 |
| array | 根據(jù)數(shù)組第一個元素決定類型 |
|字符串 | 可能被映射為date、double扒吁、long火鼻、text室囊、keyword類型 |
注意:
數(shù)字類型默認的是被映射為long而不是integer
字符串可以被映射為多種類型,主要看內(nèi)容
我們可以自定義字符串映射為日期的格式
"mappings": {
"date_detection": true,
"dynamic_date_formats": ["MM/dd/yyyy"],
"numeric_detection": true
}
二魁索、自定義動態(tài)mapping
如果覺得ES默認的mapping方式對于自己的業(yè)務(wù)來說還有優(yōu)化空間融撞,我們就可以自定義的動態(tài)mapping方式定制映射方式。
自定義三種方式
1粗蔚、 根據(jù)字段類型mapping
根據(jù)字段類型匹配通過 match_mapping_type 屬性來控制尝偎,當添加文檔的時候,ES的JsonParser解析出來的類型是match_mapping_type指定的類型鹏控,就會使用對應(yīng)的mapping
{
"mappings": {
"dynamic_templates": [
{
"dt_name_one": {
"match_mapping_type": "long",
"mapping": {
"type": "integer"
}
}
},
{
"dt_name_two": {
"match_mapping_type": "string",
"mapping": {
"type": "text",
"fields": {
"raw": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
]
}
}
2致扯、 根據(jù)字段名稱mapping
根據(jù)字段名稱映射使用的是 match、unmatch当辐、match_pattern 屬性來控制抖僵。
{
"mappings": {
"dynamic_templates": [
{
"longs_as_strings": {
"match_mapping_type": "string",
"match": "long_*",
"unmatch": "*_text",
"mapping": {
"type": "long",
"enable": false
}
}
},
{
"longs_as_strings": {
"match_pattern": "regex",
"match": "^profit_\\d+$",
"mapping": {
"type": "long",
"index": false,
"norms": false,
"doc_values": false
}
}
}
]
}
}
3、根據(jù)字段路徑mapping
按路徑匹配使用的是 path_match缘揪、path_unmatch 屬性來指定耍群。
{
"mappings": {
"dynamic_templates": [
{
"dt_path_name": {
"path_unmatch": "user.*",
"path_match": "*.conceal",
"mapping": {
"type": "text",
"enable": false
}
}
}
]
}
}
三、動態(tài)mapping的添加方式
添加動態(tài)索引有2種方式:
第一種就是為索引添加mapping的時候同時指定動態(tài)映射的mapping找筝。
第二種就是在索引模板中指定蹈垢。
前面我們已經(jīng)看了在添加索引mapping的時候指定,下面我們就來看一下在設(shè)置索引模板的時候指定袖裕。
四曹抬、索引模板
{
"order": 0, // 模板優(yōu)先級,數(shù)字越大優(yōu)先級越高
"index_patterns": ["test*,user*"], // 匹配該模板的索引名稱正則
"settings": {}, // 索引設(shè)置
"mappings": {}, // 索引中各字段的映射定義
"aliases": {} // 索引的別名
}
如上所示急鳄,就是在索引模板中最常見的屬性了:
order:當索引名稱匹配到多個索引模板的時候沐祷,換選擇order值大的
index_patterns:索引名稱匹配表達式,例如攒岛,所用以名稱以test開頭的都可以匹配到test*
settings:索引配置
mappings:默認的mapping
{
"order": 1,
"index_patterns": [
"test*",
"user*"
],
"settings": {
"number_of_shards": 1
},
"mappings": {
"_source": {
"enabled": false
},
"dynamic_templates": [
{
"string_as_keyword": {
"match_mapping_type": "long",
"mapping": {
"type": "integer"
}
}
}
],
"properties": {
"host_name": {
"type": "keyword"
},
"created_at": {
"type": "date",
"format": "yyyy-MM-dd"
}
}
},
"aliases": {
"alias_name": {
"filter": {
"term": {
"user": "tim"
}
},
"routing": "tim"
}
}
}