原文网址:ES之API系列--dynamic template(动态模板)的用法(有实例)_IT利刃出鞘的博客-CSDN博客
简介
说明
本文介绍ElasticSearch的dynamic template(动态模板)的用法(有实例)。
官网网址
https://www.elastic.co/guide/en/elasticsearch/reference/8.0/dynamic-templates.html
动态模板的作用
作用概述
动态模板是针对某个具体的索引来设定的,即在创建某个具体的索引时指定。
使用场景
根据ES自动识别字段类型的这个特性,去设置一些特殊字段的名称为某些特定的类型。例如:
- 设置所有字符串类型的字段都为 keyword
- is 开头的字符串都设置成为 boolean 类型
match-mapping-type
概述
在没有设置_mapping时,ES根据文档字段的类型进行动态映射。在这种方式下,会对JSON的数据类型动态定义ES的数据类型。
JSON数据类型 |
ES数据类型 |
null |
不添加字段 |
true / false |
boolean |
double |
float |
long |
long |
object |
object |
array |
根据数组中第一个非null值的类型 |
通过日期检测的string |
date |
通过数字检测的string |
float 或 long |
没有通过上面2个检测的string |
带.keyword子字段的text类型 |
实例
PUT /es-learn-doc-person/_create/1
{
"name":"zhang san",
"age":29
}
动态映射下的mapping:
{
"es-learn-doc-person" : {
"mappings" : {
"properties" : {
"age" : {
"type" : "long"
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
这个文档中age自动映射成了long,但是integer类型完全满足当前数据的存储。假设这样一种场景,对于公司的数据中的整数数值部分,绝大部分integer能够满足存储需求,那么我们可以使用Dynamic Template来动态的映射。 方法是:
PUT es-learn-000002
{
"mappings": {
"dynamic_templates": [
{
"integers": {
"match_mapping_type": "long",
"mapping": {
"type": "integer"
}
}
}
]
}
}
对于索引es-learn-000002使用的动态模板,我们插入同样的用户信息。
PUT es-learn-000002/_doc/1
{
"name":"zhang san",
"age":29
}
查看相应的mapping
match与unmatch
概述
match与unmatch是对字段名称进行匹配处理。
对于嵌套对象,match 和 unmatch 只作用于最后一级字段名。
- match:字段名称匹配某规则
- unmatch :字段名称不匹配某规则
- match_pattern:匹配使用的模式。如果设置为regex,则match 和 unmatch 支持正则表达式。例如:
"match_pattern": "regex", "match": "^profit_\d+$"
示例
需求
- 设置所有字符串类型的字段都为 keyword
- is 开头的字符串都设置成为 boolean 类型
方法
PUT my_index
{
"mappings": {
"dynamic_templates": [{
"strings_as_boolean": {
"match_mapping_type": "string",
"match": "is*",
"mapping": {
"type": "boolean"
}
}
}, {
"strings_as_keywords": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
]
}
}
path_match 和 path_unmatch
概述
match 和 unmatch 只作用于最后一级的字段名,对于一个有多层的内嵌对象,可以用path_match 和 path_unmatch。(ES是支持存储对象的),例如:some_object.*.some_field。
示例
若值是对象类型,以name开头且不以middle结尾则copy到full_name字段中。
设置mapping:
PUT my_index
{
"mappings": {
"dynamic_templates": [
{
"full_name": {
"path_match": "name.*",
"path_unmatch": "*.middle",
"mapping": {
"type": "text",
"copy_to": "full_name"
}
}
}
]
}
}
插入数据
PUT my_index/_doc/1
{
"name": {
"first": "John",
"middle": "Winston",
"last": "Lennon"
}
}
查看数据文章来源:https://www.toymoban.com/news/detail-415636.html
GET my_index/_search?q=full_name:John
索引模板与动态模板结合
本处我没有尝试,但我猜测索引模板与动态模板可以同时使用,例如:文章来源地址https://www.toymoban.com/news/detail-415636.html
PUT _index_template/event_log_template
{
"index_patterns": ["event_log_*"],
"template": {
"settings": {
"number_of_shards": 5,
"number_of_shards": 1
},
"mappings": {
"dynamic_templates": [{
"dynamicFields": {
"match_mapping_type": "string",
"path_match": "dynamicFields.*_sku_attr",
"mapping": {
"type": "keyword"
}
}
}
],
"properties": {
"id": {
"type": "keyword"
},
"category_first_id": {
"type": "keyword"
},
"category_first": {
"type": "keyword"
}
}
}
}
}
到了这里,关于ES之API系列--dynamic template(动态模板)的用法(有实例)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!