一、ES Mappinghtml
在lucene中,索引中每一個字段都須要指定不少屬性,例如:是否分詞、採用哪一個分詞器、是否存儲等。正則表達式
在ES中,其實索引中每一個字段也須要指定這些屬性,咱們有時候並無對這些屬性進行設置,這得益於ES的動態映射(Dynamic Mapping)。app
參考:Dynamic Mappingelasticsearch
Dynamic Mapping能夠解決一部分場景,但有時候ES並不能很好的理解咱們的業務數據,這時就須要咱們本身指定這些屬性(Explicit Mapping)。ide
例如:ui
PUT my_index
{
"mappings": {
"doc": {
"properties": {
"title": { "type": "text" },
"name": { "type": "text" },
"age": { "type": "integer" },
"created": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
}
}
}
}
}
參考:Put Mappingspa
二、Dynamic templatescode
以前咱們簡單聊過Dynamic field mapping,這種方式下字段的映射規則基本都是ES本身決定的。 orm
若是咱們不想徹底受ES的「控制」,又不想每一個字段都本身指定,有什麼辦法呢?htm
Dynamic template可讓咱們制定一些規則,知足這個需求。
"dynamic_templates": [
{
"my_template_name": {
... match conditions ...
"mapping": { ... }
}
},
...
]
a)my_template_name:模板的名稱
b)match conditions:匹配規則
c)mapping:匹配後的mapping規則
2.1 匹配規則
2.1.1 match_mapping_type
這裏能夠改變ES的想法!原本ES以爲這個字段應該映射成long,那麼咱們能夠修改爲integer。
例如:
PUT my_index
{
"mappings": {
"_doc": {
"dynamic_templates": [
{
"integers": {
"match_mapping_type": "long",
"mapping": {
"type": "integer"
}
}
},
{
"strings": {
"match_mapping_type": "string",
"mapping": {
"type": "text",
"fields": {
"raw": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
]
}
}
}
2.1.2 match and unmatch
這裏主要是對字段名稱進行匹配處理。
例如咱們想對全部string類型、以long開頭、並不以text結尾的字段改爲long類型,以下:
PUT my_index
{
"mappings": {
"_doc": {
"dynamic_templates": [
{
"longs_as_strings": {
"match_mapping_type": "string",
"match": "long_*",
"unmatch": "*_text",
"mapping": {
"type": "long"
}
}
}
]
}
}
}
這裏match還支持正則表達式,例如:
"match_pattern": "regex",
"match": "^profit_\d+$"
2.1.3 path_match and path_unmatch
這裏主要是針對對象類型(object)的匹配規則。詳細內容參見官方文檔。
三、實例說明
3.1 ES默認string類型字段會被映射成text和keyword(sub_field),若是咱們想只映射成keyword(用來過濾、排序、統計等),該如何處理?
PUT my_index
{
"mappings": {
"_doc": {
"dynamic_templates": [
{
"strings_as_keywords": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
]
}
}
}
參考: