elasticsearch映射
阅读说明:
- 如果有排版格式问题,请移步www.yuque.com/mrhuang-ire… 《elasticsearch映射》,选择宽屏模式效果更佳。
- 本文为原创文章,转发请注明出处。
Mapping也叫映射,是elasticsearch中定义文档极其包含的字段如何存储和如何索引的流程。类似于Mysql中的表结构中字段定义(字段名、字段类型等)以及索引。在Mapping中,定义字段名,字段类型,字段所用分词器、索引等属性。
映射基础操作
下面有一个简单的设置和查看mapping的例子。
创建映射
PUT /my-index //对my-index显示建立映射
{
"mappings": {
"properties": {
"age": { "type": "integer" }, //包含字段age, 类型为integer
"email": { "type": "keyword" }, //包含字段email, 类型为keyword, 不进行分词
"name": { "type": "text" } //包含字段name, 类型为text
}
}
}
更新映射
支持新增映射字段。
PUT /my-index/_mapping
{
"properties": {
"employee-id": { //新增employee-id
"type": "keyword",
"index": false
}
}
}
因为更新现有字段可能导致索引无效,所以不支持更新现有字段。如果只是想要更改字段名,可以使用alias参数设置别名指向原始字段。
PUT /my-index/_mapping
{
"properties": {
"name_alias": {
"type": "alias",
"path": "name"
}
}
}
如果确实需要更改现有字段,需要新建索引设置映射,使用reindex指令在新索引上进行重建。
POST _reindex
{
"source": {
"index": "twitter"
},
"dest": {
"index": "new_twitter"
}
}
查看映射
GET /my-index/_mapping
返回映射配置
{"my-index":{"mappings":{"properties":{"age":{"type":"integer"},"email":{"type":"keyword"},"employee-id":{"type":"keyword","index":false},"name":{"type":"text"},"name_alias":{"type":"alias","path":"name"}}}}}
查看指定字段
GET /my-index/_mapping/field/employee-id
返回
{"my-index":{"mappings":{"employee-id":{"full_name":"employee-id","mapping":{"employee-id":{"type":"keyword","index":false}}}}}}
字段数据类型
在映射配置中,type定义了字段的类型。elasticsearch定义了数字类型,布尔,字符串、时间类型,json对象,除此之外还定义空间数据、文档排名、文本搜索类型。对于字符串类型,有一个点需要注意,,eleasticsearch会进行分词建立索引。
大类 | 类型名称 | 说明 | 对应java类型 |
---|---|---|---|
字符串 | text | 字段内容会被分词,适合match模糊搜索 | String |
keyword | 跟text的区别是keyword保留完整字段,适合term精确查找 | String | |
数值 | long | 64 位有符号整形 | long |
integer | 32 位有符号整形 | int | |
short | 16 位有符号整形 | short | |
byte | 8 位有符号整形。 | byte | |
double | 双精度 64位浮点类型 | double | |
float | 单精度 32位浮点类型 | float | |
half_float | 半精度16位浮点类型, 范围从2-24~65504 | float | |
scaled_float | 缩放类型浮点数, 配合缩放因子scaling_factor一起使用。 | ||
ES索引时,原始值会乘以该缩放因子并四舍五入得到新整形值,ES内部储存的是这个新值,但返回结果仍是原始值,好处是整型比浮点型更易压缩,节省磁盘空间。 | |||
比如:假设scale_factor为100, scaled_float = 10.25, 在es内部存储时为1025 |
| float | | 日期 | date | 存储最高精度为毫秒。 配合format使用: strict_date_optional_time||epoch_millis。 | | | | date_nanos | date的补充,最高精度是纳秒,高精度意味着可存储的日期范围小,即:从大约 1970 到 2262。 | | | 布尔类型 | boolean | 布尔类型。 | boolean | | 二进制 | binary | 存储二级制数据。 | | | 对象类型 | object | 简单json类型。 | json对象 | | | nested | 嵌套类型,解决object下数组内部对象之间没有关联的问题。 比如: {"user":[{"first":"John","last":"Smith"},{"first":"Alice","last":"White"}]} 在object下转换成:{"user.first":["alice","john"],"user.last":["smith","white"]},丢失了John和Smith, Alice和White是配套的关系。 | json对象 | | 地理类型 | geo_point | 纬度和经度点。 | | | | geo_shape | 复杂的形状,例如多边形 | | | | ip | ipv4或者ipv6地址 | |
动态映射
eleasticsearch支持动态mapping, 当插入文档时,不必先创建mapping, 只需建好索引,系统会根据字段自动映射。
字段类型 | 自动映射类型 |
---|---|
true/false | boolean |
小数 | float |
数字 | long |
object | object |
数组 | 取决于数组中的第一个非空元素的类型 |
日期格式字符串 | date |
数字类型字符串 | float/long |
其他字符串 | text + keyword |
除了上述字段类型之外,其他类型都必须显式映射,在映射配置中对字段显示申明要映射的类型。如果希望对符合某类要求的特定字段制定映射,就需要用到动态映射模板。 动态映射模板语法
"dynamic_templates": [
{
"my_template_name": { //模板名
... match conditions ... //匹配参数,支持match_mapping_type, match, match_pattern, unmatch, path_match, path_unmatch
"mapping": { ... } //字段被映射配置
}
},
...
]
动态映射模板参数:
- match_mapping_type:数据类型匹配字段
- match和unmatch:名称匹配字段,支持正则表达式, 支持数组。
- path_match和path_unmatch :路径匹配字段, 支持数组
示例:
PUT my-index-000001
{
"mappings": {
"dynamic_templates": [
{
"integers": {
"match_mapping_type": "long",
"mapping": {
"type": "integer"
}
}
},
{
"strings": {
"match_mapping_type": "string",
"match": "num_*",
"unmatch": "*_text",
"mapping": {
"type": "text",
"fields": {
"raw": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
{
"full_name": {
"path_match": "name.*",
"path_unmatch": "*.middle",
"mapping": {
"type": "text",
"copy_to": "full_name"
}
}
}
]
}
}
//插入数据
PUT my-index-000001/_doc/1
{
"long_num": "5",
"long_text": "foo"
}
//插入数据
PUT my-index/_doc/2
{
"one_ip": "will not match",
"ip_two": "will not match",
"three_ip": "12.12.12.12",
"ip_four": "13.13.13.13"
}
//插入数据
PUT my-index-000001/_doc/3
{
"name": {
"first": "John",
"middle": "Winston",
"last": "Lennon"
}
}
以上代码会产生以下效果:
- 所有 long 类型字段会默认映射为 integer。
- 所有文本字段,如果是以 num_ 开头,并且不以 _text 结尾,会自动映射为 keyword 类型。
- name json对象内的字段,除掉middle之外,其他 都会被映射为text类型。
更多映射参数
前面只简单介绍了type字段,elasticsearch还有很多其他映射参数可以使用。
参数名 | 参数说明 | |
---|---|---|
type | 字段类型 | |
index | 是否索引 | |
alias | 设置别名,path指定要设置别名的字段绝对路径。 | |
index_options | 控制将哪些信息添加到倒排索引中以进行搜索和突出显示。仅用于text字段。包含以下参数:docs:只有文档编号被索引;freqs:文档编号和 term(词条)的频率会被索引;positons:文档编号、term frequencies(词条频率)和term(词条)位置(或顺序)将被索引;offsets:文档编号、term(词条)频率,位置,起始和结尾字符偏移量(用于映射该 term (词条)到原始字符串)将被索引。被分析器分析的字符串字段使用 position 作为默认值,其他的字段使用 docs作为默认值。 | |
index_phrases | 提升 exact_value 查询速度,但是要消耗更多磁盘空间。 | |
index_prefixes | 前缀搜索, 加速查询。min_chars:前缀最小长度> 0,默认 2(包含)max_chars:前缀最大长度< 20,默认 5(包含) | |
analyzer | 文本分析器,对文档内容分词建立倒排索引 | |
search_analyzer | 搜索文本分析器,对传入的搜索词进行分词。如果没有定义search_analyzer,默认使用analyzer。 | |
boost | 对当前字段相关度的评分权重,默认1。仅适用于 term(词条)查询(前缀,范围和模糊查询不能够使用 **boost **). | |
normalizer | 该参数对于keyword字段, 与analyzer相似 | |
meta | 附加元数据 | |
null_value | 为null时设置默认值 | |
store | 设置该字段是否仅查询 | |
ignore_above | 超过长度将被忽略。 | |
format | 格式化。 | |
dynamic | 控制是否可以动态添加新字段。 | |
coerce | 是否允许强制类型转换 | |
ignore_above | 超过长度将被忽略 |
参考:
[1].zhuanlan.zhihu.com/p/433879838
[2].blog.csdn.net/qq_39706570…
[3].www.codebaoku.com/es/es-docum…
[4].www.elastic.co/guide/en/el…
mp.weixin.qq.com/s?__biz=Mzg…
本文来自博客园,作者:扎Zn了老Fe,转载请注明原文链接:https://www.cnblogs.com/itThinking/p/17771119.html