1、ES Mapping
在lucene中,索引中每个字段都需要指定很多属性,例如:是否分词、采用哪个分词器、是否存储等。
在ES中,其实索引中每个字段也需要指定这些属性,我们有时候并没有对这些属性进行设置,这得益于ES的动态映射(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"
}
}
}
]
}
}
}
参考: