本文基于Elasticsearch6.x,本文大纲
- mapping常见属性
- 动态映射dynamic-mapping
- 动态模板
- 索引模板
ES之Mapping
mapping类似于数据库中的scheme,主要作用如下
- 定义Index下的字段名
- 定义字段的类型
- 定义倒排索引的相关配置(是否索引、记录position等)
获取指定索引的mapping
GET test_index/_mapping
通常Mapping中的字段类型一旦设定,则禁止直接修改,因为Lucene实现的倒排索引生成后不允许修改,可以通过reindex操作重新建立新的倒排索引
es允许新增字段,通过dynamic参数来进行控制
- true:允许新增字段(默认)
- false:不允许新增字段,但文档可以正常写入,无法对字段进行查询等操作
- strict:不能写入,如果有新字段写入则报错
mapping常见属性
-
copy_to
- 将字段值复制到目标字段,类似于_all作用
- 不会出现在_source中,只能用来检索
- 相当于把已有的多个字段组合成一个新字段,然后可以使用这个新字段进行检索,相当于对多个字段进行同时检索
PUT my_index { "mappings":{ "doc":{ "properties":{ "first_name":{ "type":"text", "copy_to":"full_name" }, "last_name":{ "type":"text", "copy_to":"full_name" }, "full_name":{ "type":"text" } } } } } PUT my_index/doc/1 { "first_name":"zhang", "last_name":"lisi" } GET my_index/_search { "query": {"match_all": {}} } 返回结果 { "_index": "my_index", "_type": "doc", "_id": "1", "_score": 1, "_source": { "first_name": "zhang", "last_name": "lisi" }
-
index_options:用来倒排索引记录的内容,有以下4个取值
- docs:只记录doc_id
- freqs:记录doc_id和term frequencis
- positions·:记录doc_id、term frequencis和term position
- offsets: doc_id、term frequencis、term position和offset
text类型默认配置为positions,其他默认为docs,记录的内容越多,占用空间越大
-
null_value
当字段遇到null值时的处理策略,默认为null,即空值,es会忽略该值,可以设定默认值
-
doc_values
- 关于倒排索引的深入理解
- 注意,text默认不支持doc_values
- 简而言之,倒排索引构建了词条到文档列表的映射,使得检索非常快,但对于排序和聚合来讲,却不是这样,它需要我们找到文档及文档对应的词条。
- doc_values在文档index时以面向列的形式构建,这使得他对排序和聚合非常有效,doc_values支持几乎所有的字段类型,并且默认启用,如果你不需要对某个字段进行排序、聚合或者从脚本(script)中访问该字段,可禁用以节省空间
-
fielddata
text类型不支持doc_values属性,因此无法对text类型进行聚合、排序、脚本取值等操作,可以使用fielddata属性设置。
fielddata属性采用延时加载的策略,当首次需要排序、聚合及脚本取值时才进行构建,读取整个倒排索引,抓换词条--文档之间的关系,将结果在内存中排序,一旦构建,将会一直保留在内存中,加载fielddata是非常消耗内存的,因此默认是关闭的
通常来讲,对text类型进行聚合、排序以及脚本取值是没有意义的,我们应该避免,可以通过再设置一个keyword类型的字段进行保存,而不是设置fielddata=true
可以通过设置fielddata_frequency_filter来减少加载进内存的词条数量,从而减少内存占用 -
enabled
默认是true。只用于mapping中的object字段类型。当设置为false时,其作用是使es不去解析该字段,并且该字段不能被查询和store,只有在_source中才能看到(即查询结果中会显示的_source数据)。设置enabled为false,可以不设置字段类型,默认为object
-
index
- index用于记录当前字段是否索引,默认为true,fasle不进行倒排索引的构建,则不可进行搜索
- 可以用于记录一些不需要查询或者不想让查询的字段,比如身份证号等敏感信息
- 默认是true。当设置为false,表明该字段不能被查询,如果查询会报错。但是可以被store。当该文档被查出来时,在_source中也会显示出该字段。
-
store
默认false。store参数的功能和_source有一些相似。我们的数据默认都会在_source中存在。但我们也可以将数据store起来,不过大部分时候这个功能都很鸡肋。不过有一个例外,当我们使用copy_to参数时,copy_to的目标字段并不会在_source中存储,此时store就派上用场了。
index、enable、store三者能否同时存在:
首先设置了enabled为false就不能设置store为true了,这两者冲突。而index和store是不冲突的。最后index和enabled之间的问题:enabled需要字段类型为object,而当字段类型为object时,好像不能设置index参数,试了几次都会报错。 -
format
用于对日期格式的数据进行格式化
-
ignore_above
不会对超过指定长度的字符串构建索引以及store,如果是数组,将会应用到数组中的每一个元素上。这些字符换或者数组元素仍然会在_source中显示。
通常来讲,是对keyword类型使用,而不能对text字段使用
当对该字段进行聚合时,其值不参与聚合
可以通过PUT mapping API更新取值,因此,相同索引的同一字段可以有不同的取值
-
ignore_malformed
可以忽略类型错误,同时设置为true时该字段不会被索引。默认为false,当存入错误类型的数据时会报错
-
fields
常用与对一个字段进行不同方式的处理,用以实现多字段特性
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"city": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
}
-
norms
norms用于计算相关性得分,但会消耗较多的磁盘空间。如果不需要对某个字段进行评分,最好不要开启norms。
-
properties
当数据类型为object或者nested,有子节点的时候,可以使用properties来进行定义
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"manager": {
"properties": {
"age": { "type": "integer" },
"name": { "type": "text" }
}
},
"employees": {
"type": "nested",
"properties": {
"age": { "type": "integer" },
"name": { "type": "text" }
}
}
}
}
}
}
当对内部字段进行查询或聚合事,可以使用点语法
GET my_index/_search
{
"query": {
"match": {
"manager.name": "Alice White"
}
},
"aggs": {
"Employees": {
"nested": {
"path": "employees"
},
"aggs": {
"Employee Ages": {
"histogram": {
"field": "employees.age",
"interval": 5
}
}
}
}
}
}
-
normalizer
normalizer是keyword的属性,其作用类似于analyzer,在index和search之前进行处理(跟analyzer三个组件一样)
-
boost
用于增加指定字段检索时的权重,只对term queries有效,对prefix, range and fuzzy queries等无效。
-
coerce
当有一些脏数据时,可以对字段进行类型转换,比如将5,"5"转为5.0以符合字段类型的要求
动态映射(Dynamic Mapping)
- es能够自动识别字符串里的日期类型,默认是 strict_date_optional_time
- 可以通过dynamic_date_formats自定义日期类型
- date_detection可以关闭日期自动识别机制
- 可以通过numeric_detection来设置是否开启字符串中数字的自动识别
动态模板
允许根据es自动识别的数据类型、字段名等动态设定字段类型,可以实现如下效果
- 所有字符串类型都设定为keyword类型
- 所有以message开头的字段都设为text类型
- 所有识别为double类型的字段都设定为float类型,以节省空间
匹配规则一般有如下几个参数
- match_mapping_type:匹配es自动识别的字段类型,如boolean、long、string等
- match,unmatch:匹配字段名
- path_match、path_unmatch匹配路径(对object类型)
索引模板(Index Template)
主要用于在新建索引时自动应用预先设定的配置,简化索引创建的操作步骤
- 可以设定索引的配置和mapping
- 可以有多个模板,根据order设置,order大的会覆盖小的
PUT _template/ug_push_other_log_template
{
"index_patterns" : [
"ug_error_log*",
"ug_info_log*"
],
"order" : 0,
"settings" : {
"number_of_shards" : "3",
"number_of_replicas": "1"
},
"mappings" : {
"doc" : {
"dynamic":false,
"properties": {
"@timestamp": {
"type": "date"
},
"message": {
"type": "keyword",
"index":false
},
"type": {
"type":"keyword"
},
"ts": {
"type": "keyword",
"index":false
}
}
}
}
}
查看与删除索引模板
GET _template
GET _template/test_template
DELETE _template/test_template