ES - Dynamic templates 动态模板

时间:2022-12-16 12:43:58

1、ES Mapping

在lucene中,索引中每个字段都需要指定很多属性,例如:是否分词、采用哪个分词器、是否存储等。

在ES中,其实索引中每个字段也需要指定这些属性,我们有时候并没有对这些属性进行设置,这得益于ES的动态映射(Dynamic Mapping)。

参考:Dynamic Mapping

Dynamic Mapping可以解决一部分场景,但有时候ES并不能很好的理解我们的业务数据,这时就需要我们自己指定这些属性(Explicit Mapping)。

例如:

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 Mapping

2、Dynamic templates

之前我们简单聊过Dynamic field mapping,这种方式下字段的映射规则基本都是ES自己决定的。

如果我们不想完全受ES的“控制”,又不想每个字段都自己指定,有什么办法呢?

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、实例说明

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"
}
}
}
]
}
}
}

参考:

ES Mapping