那是因为ES可以动态映射,添加文档的时候遇到没有的字段,可以动态的添加到mapping中,下面是一些默认的mapping方式。
| 数值| 如果缺失在mapping中添加类型 |
| null | 空值不添加类型到mapping |
| true、false| 添加一个boolean类型 |
| 浮点数 | 添加一个floating类型 |
| 整数| 添加一个long类型|
| object| 添加一个object类型 |
| array | 根据数组第一个元素决定类型 |
|字符串| 可能被映射为date、double、long、text、keyword类型 |
注意:
数字类型默认的是被映射为long而不是integer
字符串可以被映射为多种类型,主要看内容
我们可以自定义字符串映射为日期的格式
如果觉得ES默认的mapping方式对于自己的业务来说还有优化空间,我们就可以自定义的动态mapping方式定制映射方式。
根据字段类型匹配通过 match_mapping_type 属性来控制,当添加文档的时候,ES的JsonParser解析出来的类型是match_mapping_type指定的类型,就会使用对应的mapping
根据字段名称映射使用的是 match、unmatch、match_pattern 属性来控制。
按路径匹配使用的是 path_match、path_unmatch 属性来指定。
添加动态索引有2种方式:
第一种就是为索引添加mapping的时候同时指定动态映射的mapping。
第二种就是在索引模板中指定。
前面我们已经看了在添加索引mapping的时候指定,下面我们就来看一下在设置索引模板的时候指定。
如上所示,就是在索引模板中最常见的属性了:
order:当索引名称匹配到多个索引模板的时候,换选择order值大的
index_patterns:索引名称匹配表达式,例如,所用以名称以test开头的都可以匹配到test*
settings:索引配置
mappings:默认的mapping
上一篇文章es 创建动态索引(一) ,通过el表达式 修改 @Document 里 indexName 值,实现 es 动态索引。
https://www.jianshu.com/p/5d170ce6777d
后来使用时候发现如果实体类上有注解@Field
例如
springboot 启动时候创建的mapping为:
而这种动态的方式为创建的mapping为:
不一样,所以就想看看 启动时候是怎么创建的。使用同样的方式创建就可以。
AbstractElasticsearchRepository.java 中,
构造函数初始时候会去判断要不要创建index和mapping
这个值在@Document中,默认值为true
如果要创建就调用 创建index 和 put mapping方法
而创建和映射是调用elasticsearchOperations 的方法实现的
而它的实现类 即是ElasticsearchTemplate
时序图如下:
所以我们可以在保存数据时候,判断索引是否存在,不存在创建和设置mapping
亲测 ok 了。
而之前的时间粒度为秒 来创建动态索引 太细了。
可能索引创建和mapping ok 了,但是保存时候 到了下一秒,es 自己就会去创建 。
所以为了测试 将时间细分到 分来测试。
测试结果如下,索引 和 mapping都没问题。
最近想写一篇es的索引的一个设计,由于设计的东西特别多,当然,elasticsearch的模板和动态映射也是其中的一个设计点,所以干脆先来聊聊索引的模板和动态映射,模板,听这个名字就相当于一些公共可用的东西可以作为所有索引的一个设置,
1.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.2、Component templates(组件模板)
先上官网: https://www.elastic.co/guide/en/elasticsearch/reference/7.8/indices-templates-v1.html
组件模板是构建索引模板的构建块。比如指定索引映射、设置和别名等。
使用语法:
索引模板可以由多个组件模板组成。要使用组件模板,请在索引模板通过参数composed_of指定。组件模板仅作为匹配索引模板的一部分。在任何的索引或者索引模板中定义的一些内容(设置,mapping等)都会覆盖组件模板中与之相同的内容,也就是说组件模板等级最低了,容易被取代。组件模板的只会在索引创建的时候生效,修改组件模板不会对现有的索引有影响。下面介绍下组件模板请求体的一些参数:
举个例子,一看就懂:
1.3、index templates(索引模板)
先看官网: https://www.elastic.co/guide/en/elasticsearch/reference/7.8/indices-put-template.html
使用语法:
索引模板定义可以定义设置、映射和别名等,然后通过匹配自动应用于新建的索引。Elasticsearch基于与索引名称匹配的通配符模式将模板应用于新索引,也就是说通过索引进行匹配,看看新建的索引是否符合索引模板,如果符合,就将索引模板的相关设置应用到新的索引,如果同时符合多个索引模板呢,这里需要对参数priority进行比较,这样会选择priority大的那个模板进行创建索引。在创建索引模板时,如果匹配有包含的关系,或者相同,则必须设置priority为不同的值,否则会报错。索引模板也是只有在新创建的时候起到作用,修改索引模板对现有的索引没有影响。同样如果在索引中设置了一些设置或者mapping都会覆盖索引模板中相同的设置或者mapping。接下来看看创建索引模板请求体的一些参数:
看这些,好像很复杂,举个例子就容易了:(匹配所有te开头的新建索引,分片为1,优先级为10)
这里没有说组合索引的使用,请看第一节介绍部分,这两种索引的关系,还有就是组合索引被引用顺序,后者更具有更高的优先级,会覆盖前面的一些组合索引的一些相同的设置,然而组件索引不同的部分将会叠加在一起成为索引模板的设置。语法确实不难,但是怎么应用好呢,比如在elk中使用索引模板写数据到es,比如索引设计,怎么把索引自动滚动呢,这块后期会有文章介绍,尽请期待。当然还有动态模板没有介绍,继续往下走。
注意:其实个人觉得把动态模板写这里是为了区分索引模板和动态模板,因为个人混淆过,所以写这里比较好区别,其实动态模板不是索引模板,这里不要误会,其实动态模板就是可以配置在索引中或者配置在索引模板中,作用是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这些可以动态的探索映射,所以其他的数据类型需要显示的指定。例如:
说起来可能比较有点不好理解,那就需要例子说明了:
这样就自动把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
查看结果
其实静下心来看也不难,其他的规则可以看官网的例子。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)