最近想写一篇es的索引的一个设计,由于设计的东西特别多,当然,elasticsearch的模板和动态映射也是其中的一个设计点,所以干脆先来聊聊索引的模板和动态映射,模板,听这个名字就相当于一些公共可用的东西可以作为所有索引的一个设置,

本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/

一、elasticsearch模板

2.1、elasticsearch模板介绍

这里说明下,elasticsearch7.8的模板接口发生了一些变化,_template接口将在后期被废弃(虽然还能使用,不推荐),所以本文不介绍这个接口。既然有废弃的那肯定有新的方式来玩模板了。

最详细接介绍看官网:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/index-templates.html

现在模板分为两种模板,一个索引模板(index templates ),一个是组件模板(component templates),索引模板是告诉Elasticsearch如何在创建索引时配置索引的一种方法。模板是在创建索引之前配置的,当手动或通过索引文档创建索引时,模板的基础设置将用作创建索引。组件模板是可重用的构建块,用于配置映射、设置和别名。使用组件模板来构造索引模板,组件模板不能直接应用于索引。索引模板可以包含组件模板的集合,也可以直接指定设置、映射和别名。组件模板的接口是:_component_template,而索引模板的接口是:_index_template,下面来个官方的例子,可以明显的看出来组件模板component_template1和other_component_template被索引模板通过参数composed_of被引用,所以索引模板template_1既包括自己的设置,又包括了两个组件模板的设置,这样就可以轻松灵活的做组合,降低耦合性。

  1. PUT _component_template/component_template1
  2. {
  3. "template": {
  4. "mappings": {
  5. "properties": {
  6. "@timestamp": {
  7. "type": "date"
  8. }
  9. }
  10. }
  11. }
  12. }
  13.  
  14. PUT _component_template/other_component_template
  15. {
  16. "template": {
  17. "mappings": {
  18. "properties": {
  19. "ip_address": {
  20. "type": "ip"
  21. }
  22. }
  23. }
  24. }
  25. }
  26.  
  27. PUT _index_template/template_1
  28. {
  29. "index_patterns": ["te*", "bar*"],
  30. "template": {
  31. "settings": {
  32. "number_of_shards": 1
  33. },
  34. "mappings": {
  35. "_source": {
  36. "enabled": false
  37. },
  38. "properties": {
  39. "host_name": {
  40. "type": "keyword"
  41. },
  42. "created_at": {
  43. "type": "date",
  44. "format": "EEE MMM dd HH:mm:ss Z yyyy"
  45. }
  46. }
  47. },
  48. "aliases": {
  49. "mydata": { }
  50. }
  51. },
  52. "priority": 10,
  53. "composed_of": ["component_template1", "other_component_template"],
  54. "version": 3,
  55. "_meta": {
  56. "description": "my custom"
  57. }
  58. }

通过上面的接收,应该就清楚了这两个模板之间的关系,可以用来干嘛了。接下来一一介绍下这两个模板。

2.2、Component templates(组件模板)

先上官网:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/indices-templates-v1.html

组件模板是构建索引模板的构建块。比如指定索引映射、设置和别名等。

使用语法:

  1. PUT /_component_template/<component-template>

索引模板可以由多个组件模板组成。要使用组件模板,请在索引模板通过参数composed_of指定。组件模板仅作为匹配索引模板的一部分。在任何的索引或者索引模板中定义的一些内容(设置,mapping等)都会覆盖组件模板中与之相同的内容,也就是说组件模板等级最低了,容易被取代。组件模板的只会在索引创建的时候生效,修改组件模板不会对现有的索引有影响。下面介绍下组件模板请求体的一些参数:

参数名 参数介绍
template 必须配置,表名是要应用的模板,可以选择包括映射、设置或别名配置
aliases 配置可选,配置index的别名
mappings 配置可选,配置index的mapping
settings 配置可选,配置index的一些通用配置
version 配置可选,用于外部管理组件模板的版本号
_meta  配置可选,用于配置一些介绍信息,比如用户元数据

举个例子,一看就懂:

  1. PUT _component_template/template_1
  2. {
  3. "template": {
  4. "settings": {
  5. "number_of_shards": 1
  6. },
  7. "aliases": {
  8. "alias1": {},
  9. "alias2": {
  10. "filter": {
  11. "term": {
  12. "user.id": "kimchy"
  13. }
  14. },
  15. "routing": "shard-1"
  16. },
  17. "{index}-alias": {}
  18. }
  19. },
  20. "version": 123,
  21. "_meta": {
  22. "description": "set number of shards to one",
  23. "serialization": {
  24. "class": "MyComponentTemplate",
  25. "id": 10
  26. }
  27. }
  28. }

3.3、index templates(索引模板)

先看官网:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/indices-put-template.html

使用语法:

  1. PUT /_index_template/<index-template>

索引模板定义可以定义设置、映射和别名等,然后通过匹配自动应用于新建的索引。Elasticsearch基于与索引名称匹配的通配符模式将模板应用于新索引,也就是说通过索引进行匹配,看看新建的索引是否符合索引模板,如果符合,就将索引模板的相关设置应用到新的索引,如果同时符合多个索引模板呢,这里需要对参数priority进行比较,这样会选择priority大的那个模板进行创建索引。在创建索引模板时,如果匹配有包含的关系,或者相同,则必须设置priority为不同的值,否则会报错。索引模板也是只有在新创建的时候起到作用,修改索引模板对现有的索引没有影响。同样如果在索引中设置了一些设置或者mapping都会覆盖索引模板中相同的设置或者mapping。接下来看看创建索引模板请求体的一些参数:

参数名称 参数介绍
index_patterns   必须配置,用于在创建期间匹配索引名称的通配符(*)表达式数组
template 可选配置,可以选择包括别名、映射或设置配置
composed_of 可选配置,组件模板名称的有序列表。组件模板按指定的顺序合并,这意味着最后指定的组件模板具有最高的优先级
priority 可选配置,创建新索引时确定索引模板优先级的优先级。选择具有最高优先级的索引模板。如果未指定优先级,则将模板视为优先级为0(最低优先级)
version 可选配置,用于外部管理索引模板的版本号
_meta 可选配置,关于索引模板的可选用户元数据。可能有任何内容

看这些,好像很复杂,举个例子就容易了:(匹配所有te开头的新建索引,分片为1,优先级为10)

  1. PUT /_index_template/template_1
  2. {
  3. "index_patterns": [
  4. "te*"
  5. ],
  6. "template": {
  7. "settings": {
  8. "number_of_shards": 1
  9. },
  10. "aliases": {
  11. "alias1": {},
  12. "alias2": {
  13. "filter": {
  14. "term": {
  15. "user.id": "kimchy"
  16. }
  17. },
  18. "routing": "shard-1"
  19. },
  20. "{index}-alias": {}
  21. },
  22. "mappings": {
  23. "_source": {
  24. "enabled": true
  25. }
  26. }
  27. },
  28. "version": 123,
  29. "priority": 10,
  30. "_meta": {
  31. "description": "set number of shards to three",
  32. "serialization": {
  33. "class": "MyIndexTemplate",
  34. "id": 17
  35. }
  36. }
  37. } 

这里没有说组合索引的使用,请看第一节介绍部分,这两种索引的关系,还有就是组合索引被引用顺序,后者更具有更高的优先级,会覆盖前面的一些组合索引的一些相同的设置,然而组件索引不同的部分将会叠加在一起成为索引模板的设置。语法确实不难,但是怎么应用好呢,比如在elk中使用索引模板写数据到es,比如索引设计,怎么把索引自动滚动呢,这块后期会有文章介绍,尽请期待。当然还有动态模板没有介绍,继续往下走。

二、Dynamic Mapping(动态映射)

注意:其实个人觉得把动态模板写这里是为了区分索引模板和动态模板,因为个人混淆过,所以写这里比较好区别,其实动态模板不是索引模板,这里不要误会,其实动态模板就是可以配置在索引中或者配置在索引模板中,作用是elasticsearch对数据探索自发现添加,可以指定匹配,并映射成指定类型。这里要记住elasticsearch只有组合模板和索引模板,动态模板时动态映射的一种实现。动态模板定义了索引创建后新添加字段的映射规则,而索引模板是在创建索引时默认为索引添加的别名、配置和映射等信息。索引模板包含该模板适用索引的模式或规则,以及索引创建时默认包含的别名、配置和映射关系等。它们分别通过index_patterns、aliases、settings和mappings等四个参数设置

在说动态模板之前,先要说说动态映射。

Elasticsearch最重要的功能之一就是可以自动探索数据。要为文档编制索引,不必首先创建索引、定义映射类型和定义字段,只需为文档编制索引,索引、类型和字段就会自动生成。

自动检测和添加新字段以及字段类型称为动态映射,主要分为动态字段和动态模板。这里引出动态字段和动态模板,所以先看看动态字段。

2.1、Dynamic field mapping(动态字段映射)

先看官网:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/dynamic-field-mapping.html

默认情况下,当在文档中找到索引没有定义的字段时,Elasticsearch会将新字段添加到类型映射中。通过将参数dynamic设置为false(忽略新字段)或strict(遇到未知字段时引发异常),可以在文档和对象级别禁用此行为。

假设启用了动态字段映射,则使用一些简单规则来确定字段应具有的数据类型:当然不是所有的类型都可以自动映射的,只有field data types这些可以动态的探索映射,所以其他的数据类型需要显示的指定。例如:

说起来可能比较有点不好理解,那就需要例子说明了:

  1. PUT my-index-000001/_doc/1
  2. {
  3. "create_date": "2015/09/02"
  4. }
  5.  
  6. GET my-index-000001/_mapping

  

这样就自动把create_date在映射中添加了,并且字段类型为date,这就是动态字段映射,也就是elasticsearch的一个特色,这样就不要给所有的字段提前定义好,但是虽然方便了,但是不利于索引的管理,如果出现了一条异常的数据插入到索引中,这样就会导致索引中的mapping中出现很多不必要的字段,动态字段映射可以更具需求对其进行配置。

2.2、Dynamic templates(动态模板)

详情见官网:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/dynamic-templates.html

动态模板(Dynamic Template)用于自定义动态添加字段时的映射规则,可通过索引映射类型的dynamic_templates参数设置。该参数接收一组命名的动态模板,每一个模板由匹配条件和映射规则组成。匹配条件定义了新字段是否可以使用当前模板,可根据新字段的数据类型、名称和路径来定义条件;而映射规则由参数mapping定义,它需要给出新字段要使用哪些参数,可使用type定义新字段数据类型。

使用规则如下:

  • 匹配规则可使用关键字match_mapping_type匹配新字段数据类型,这可以用于将一种默认类型转换为其他类型或者设置其他特性。
  • 还可使用match、match_pattern和unmatch匹配新字段名称。其中match和unmatch可以使用星号“*”做名称匹配,而match_pattern则支持正则表达式
  • 匹配新字段路径可使用path_match和path_unmatch,路径与名称的区别是其中包含点“.”。在mapping参数中,还可以使用{name}和{dynamic_type}代表新字段名称和类型。

使用语法:

  1. "dynamic_templates": [
  2. {
  3. "my_template_name": { //这里可以随便写,便于辨别就好,
  4. ... match conditions ... //这里就是上面说的规则,比如match_mapping_type
  5. "mapping": { ... } //匹配字段使用的映射,意思就是把匹配到的内容映射为你想要设置的内容
  6. }
  7. },
  8. ...
  9. ]

这里只举例说明一个规则或者说是条件:match_mapping_type

  1. PUT my-index-000002
  2. {
  3. "mappings": {
  4. "dynamic_templates": [
  5. {
  6. "integers": {
  7. "match_mapping_type": "long",
  8. "mapping": {
  9. "type": "integer"
  10. }
  11. }
  12. },
  13. {
  14. "strings": {
  15. "match_mapping_type": "string",
  16. "mapping": {
  17. "type": "text",
  18. "fields": {
  19. "raw": {
  20. "type": "keyword",
  21. "ignore_above": 256
  22. }
  23. }
  24. }
  25. }
  26. }
  27. ]
  28. }
  29. }
  30.  
  31. PUT my-index-000002/_doc/1
  32. {
  33. "my_integer": 5,
  34. "my_string": "Some string"
  35. }

查看结果

其实静下心来看也不难,其他的规则可以看官网的例子。

聊聊elasticsearch7.8的模板和动态映射的更多相关文章

  1. ElasticSearch7.3 学习之定制动态映射(dynamic mapping)

    1.dynamic mapping ElasticSearch中有一个非常重要的特性--动态映射,即索引文档前不需要创建索引.类型等信息,在索引的同时会自动完成索引.类型.映射的创建. 当ES在文档中 ...

  2. Elasticsearch7.X 入门学习第八课笔记-----索引模板和动态模板

    原文:Elasticsearch7.X 入门学习第八课笔记-----索引模板和动态模板 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接: ...

  3. ASP.NET路由系统实现原理:HttpHandler的动态映射

    我们知道一个请求最终通过一个具体的HttpHandler进行处理,而我们熟悉的用于表示一个Web页面的Page对象就是一个HttpHandler,被用于处理基于某个.aspx文件的请求.我们可以通过H ...

  4. ES 12 - 配置使用Elasticsearch的动态映射 (dynamic mapping)

    目录 1 动态映射(dynamic mapping) 1.1 什么是动态映射 1.2 体验动态映射 1.3 搜索结果不一致的原因分析 2 开启dynamic mapping策略 2.1 约束策略 2. ...

  5. 使用Logstash创建ES映射模版并进行数据默认的动态映射规则

    本文配置为 ELK 即(Elasticsearch.Logstash.Kibana)5.5.1. Elasticsearch 能够自动检测字段的类型并进行映射,例如引号内的字段映射为 String,不 ...

  6. elasticsearch 动态映射

    https://www.elastic.co/guide/cn/elasticsearch/guide/current/dynamic-mapping.html#dynamic-mapping当 El ...

  7. elasticsearch自定义动态映射

    https://www.elastic.co/guide/cn/elasticsearch/guide/current/custom-dynamic-mapping.html如果你想在运行时增加新的字 ...

  8. Elasticsearch 动态映射——自动检测

    ES中有一个非常重要的特性——动态映射,即索引文档前不需要创建索引.类型等信息,在索引的同时会自动完成索引.类型.映射的创建. 那么什么是映射呢?映射就是描述字段的类型.如何进行分析.如何进行索引等内 ...

  9. 用MyGeneration模板生成NHibernate映射文件和关系

    用我的MyGeneration模板生成NHibernate映射文件和关系(one-to-one,one-to-many,many-to-many) MyGeneration的几个NHibernate模 ...

随机推荐

  1. LessonStrangeWords7

    capacity 容量 measurement n. 度量 per 每一 analog 模拟的 continuous 连续的 one-lane 单车道 external 外部的 asynchronou ...

  2. 死磕以太坊源码分析之state

    死磕以太坊源码分析之state 配合以下代码进行阅读:https://github.com/blockchainGuide/ 希望读者在阅读过程中发现问题可以及时评论哦,大家一起进步. 源码目录 |- ...

  3. Oracle误删数据的恢复

    Oracle误删数据的恢复,分为两种方法:SCN和时间戳两种方法恢复. 一.通过SCN恢复删除且已提交的数据 1.获得当前数据库的SCN号 select current_scn from v$data ...

  4. 想学Python不知如何入门,教你!

    一.入门引导   想必有很多小伙伴想学习Python,又不知道如何入门,总觉得学习一定要头悬梁,锥刺股!NO,今天给大家分享下如何轻松入门Python!   首先,我们要学习Python,那一定要和你 ...

  5. IPC 经典问题:Sleeping Barber Problem

    完整代码实现: #include <stdio.h> #include <unistd.h> #include <time.h> #include <stdl ...

  6. 使用Jenkins+Pipline 持构建自动化部署之安卓源码打包、测试、邮件通知

    一.引言 Jenkins 2.x的精髓是Pipeline as Code,那为什么要用Pipeline呢?jenkins1.0也能实现自动化构建,但Pipeline能够将以前project中的配置信息 ...

  7. PHP MySQLi extension is not loaded

    PHP MySQLi extension is not loaded 如何解决呢?  yum -y install mysqli.so  huozhe yum -y install php-mysql

  8. 【ASM】介绍Oracle自带的一些ASM维护工具 (kfod/kfed/amdu)

    转自:http://blog.csdn.net/wenzhongyan/article/details/47043253 非常感谢作者的文章,很有价值!至此转载,非常感谢 1.前言 ASM(Autom ...

  9. 鸿蒙的远程交互组件应用及微信小程序的远程交互组件应用

    注:鸿蒙的远程交互组件应用相对复杂 ,访问网络时,首先要配置网络权限,华为官方文档有问题,在此引用我老师配置的模板,见附件 过程:1.导入鸿蒙的网络请求模块fetch 2.发起对服务器的请求(在这过程 ...

  10. uni-app开发经验分享二十一: 图片滑动解锁插件制作解析

    在开发用户模块的时候,相信大家都碰到过一个功能,图片滑动解锁后发送验证码,这里分享我用uni-app制作的一个小控件 效果如下: 需要如下图片资源 template <template> ...