一、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"
}
}
}
]
}
}
}
参考: