动态模板(Dynamic Templates)

动态模板(Dynamic Templates)引言 上节我们留下了这样一个问题 对于 ip 和邮箱的存储 是不是每一次我们创建 mapping 都必须要使用静态映射呢 如果不是 你会用什么方式呢 我想我们的答案一定是否定的 我常常的警戒自己 不要重复造轮子 因此对于 ip 邮箱这样的可能总结出一定的规则的 我们可以使用动态模板

大家好,我是讯享网,很高兴认识大家。

引言

上节我们留下了这样一个问题:对于ip和邮箱的存储,是不是每一次我们创建mapping都必须要使用静态映射呢?如果不是,你会用什么方式呢?我想我们的答案一定是否定的,我常常的警戒自己,不要重复造轮子。因此对于ip、邮箱这样的可能总结出一定的规则的,我们可以使用动态模板来告诉es,一些字段需要动态映射成相关类型,例如根据类型来判断,或者只要是根据字段名称包含ip的,动态的给一个IP的类型,而这种思路就是es提供的动态模板,Dynamic templates

前面我们知道了es可以根据我们插入的文档,来对非空字段,进行一套规则的动态映射(Dynamic Mapping)。动态模板可以让我们在这个基础之上进行扩展映射的功能。es为我们提供了三种规则。

  • match_mapping_type
  • match and unmatch
  • path and path_unmatch

下面我们依次来看看这几种规则,都是怎么运行的。

match_mapping_type

根据文档字段的类型进行动态映射。在这种方式下,会对JSON的数据类型进行动态定义es的数据类型。从前面,我们值JSON的数据是没有类型之分,所以es会动态根据数据本身的类型来进行映射。例如:

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

接口返回创建成功的相关信息

image-20220713091406194.png
讯享网

此时,对于索引es-learn-000002使用的动态模板,我们看一下效果。我们插入同样的用户信息。

讯享网PUT es-learn-000002/_doc/1 { "name":"zhang san", "age":29 } 

接口返回,文档创建成功

image-20220713092034567.png

查看相应的mapping

GET es-learn-000002/_mapping 

image-20220713092211439.png

可以看到之前默认的age字段是long,当我们使用了动态的模板之后,age字段变成了integer的类型。这种情况适用于对自身数据类型、范围比较了解,用来节省一定的存储空间和约束规范一些特定的数据类型

match and unmatch

match_mapping_type是对数据类型进行动态映射,但正如我们担心的那样,数据的特征是繁杂的,我们很少能通过数据的类型来区分一些具体的mapping。

比如说:同样的字符串类型表示:邮箱,姓名,个人介绍,也许对于邮箱来说,不需要进行分词,而姓名、个人介绍这样的字段,我们有可能进行分词,从而进行全文检索,如下表所示。

再比如:我们需要将一次网络请求的相关信息存入进Elasticsearch的索引里,此时信息包含了:入口ip,服务器出口ip,公网ip,内外ip,真实ip,显示ip,在我们插入的时候,这些ip的值可能是172.192.16.101这样的字符串,此时通过值本身的映射,或者根据类型进行动态映射的方式,都不能将这类ip,映射成我们想要的类型。此时该怎么办呢?

其实说到这里,你发现这样的数据,他们有着一定的共通性,例如我们可以将通过字段名称的定义,来区分这样一系列的字段,他们有着的共同特征。例如xxxx_email表示各种邮箱,xxxx_name表示各种名称,xxxx_ip表示各类的ip。此时们就可以根据名称的规则,来定义一些特定的动态映射,这便是动态模板的第二种方式match and unmatch。在这种方式下,字段名称的匹配支持正则表达式。match表示当字段名称符合的规则时应用,unmatch表示当字段符合规则时不应用这个动态映射。让我们举个例子吧:

讯享网PUT es-learn-000003 { "mappings": { "dynamic_templates": [ { "email_keyword": { "match": "*_email", "mapping": { "type": "keyword" } } }, { "ip_rule": { "match": "*_ip", "unmatch": "long_*", "mapping": { "type": "ip" } } } ] } } 

接口返回,创建成功。

image-20220713140209326.png

此时,我们创建一个文档验证一下。

PUT es-learn-000003/_doc/1 { "work_email":"", "origin_ip":"192.168.0.0", "long_to_ip":"192.168.0.0" } 

接口返回

image-20220713140627269.png

此时,我们查看一下动态映射出来的mapping是什么样的?

讯享网GET es-learn-000003/_mapping 

image-20220713140947977.png

可以看到,对于work_email来说自动映射成了keyword的类型。而满足ip的正则的orgin_ip类型映射成了ip,但是满足unmatch的正则的long_to_ip,则没有映射成ip,交由es根据值类型自动映射成了text类型。

可以看到这样的动态模板实用性是比较广的。我们常常有着一套命名的规则。这样的一套规则也可能成为我们划分数据类型的关键。

需要注意的是:当我们插入嵌套的JSON的时候,动态映射的规则是应用在嵌套JSON里的对象。

PUT es-learn-000004 { "mappings": { "dynamic_templates": [ { "email_keyword": { "match": "*_email", "mapping": { "type": "keyword" } } }, { "ip_rule": { "match": "*_ip", "unmatch": "long_*", "mapping": { "type": "ip" } } } ] } } 
讯享网PUT es-learn-000004/_doc/1 { "long_person":{ "work_email":"", "origin_ip":"192.168.0.0", "long_to_ip":"192.168.0.0" } } JSON里嵌套了一个long_person对象 

image-20220713142400307.png

path_match and path_unmatch

我们知道JSON可以保存复杂的嵌套关系,那么如果我们想依据嵌套关系制定相关的动态映射的规则,该怎么处理呢?path_match和path_unmatch的用法同match和unmatch的用法相似,使用正则表达式来进行匹配。只是match匹配的是字段的值,而path_match匹配的是JSON的嵌套关系。

PUT es-learn-000005 { "mappings": { "dynamic_templates": [ { "middle_name_key": { "path_match": "name.*", "path_unmatch": "*.middle", "mapping": { "type": "keyword" } } } ] } } 

这段代码想实现的效果是,name下的嵌套对象,并且不是middle名字的类型都为keyword。

插入文档

讯享网PUT es-learn-000005/_doc/1 { "name": { "first": "John", "middle": "Winston", "last": "Lennon" } } 

image-20220713143604970.png 可以看到first和last的类型都变为了keyword。

总结

今天介绍了动态模板的作用和动态模板定义的语法和三种匹配的方法规则,其实动态模板的用法不仅仅如此。下一节,我们先简单了解一下es的相关API。

小讯
上一篇 2025-03-29 22:51
下一篇 2025-01-08 08:35

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/45289.html