Elasticsearch之Mapping
Mapping的作用
Mapping 类似数据库中的表结构定义 schema ,它有以下几个作用:
- 定义索引中的字段名称
- 定义字段的数据类型,如字符串、数字、布尔等
- 字段,倒排索引的相关配置,如设置某个字段不被索引、记录 position等
字段数据类型
核心类型
字符串类型:
text:适合需要被全文检索的字段,会被分词器处理,不能用于排序
keyword:适合简短、结构化字符串、可以用于过滤、排序、精确查询和聚合检索
数字类型:
long
integer
short
byte
double
float
half_float
scaled_float
日期类型:ES底层采用时间戳的形式存储
date
daate_nanos
布尔类型:
boolean
二进制类型: 默认 store 属性为false,不可以被搜索
binary
范围类型:
integer_range
float_range
long_range
dobule_range
date_range
复杂类型
对象类型:object
嵌套类型:nested
地理类型
经纬度类型:geo_point
地理区域类型:geo_shape
特殊类型
ip类型:ip
join类型:join 主要用于做父子查询
多字段类型
有时候一个字段同时拥有全文类型(text)和关键字类型(keyword)时:一个用于全文搜索,另一个用于聚合和排序。可以通过多字段类型来实现。
例如城市名称:
PUT citys
{
"mappings": {
"properties": {
"cityName": {
"type": "text",
// 多字段设置
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
映射类型
在 Elasticsearch中可以不需要事先定义映射(Mapping),文档写入Elasticsearch时,会根据文档字段自动识别类型,但是通过这种自动识别的字段不是很精确,对于一些复杂的需要分词的就不适合了。
根据是否自动识别映射类型,我们可以将映射分为动态映射和静态映射。
动态映射,即不事先指定映射类型(Mapping),文档写入Elasticsearch时,ES会根据文档字段自动识别类型,这种机制称之为动态映射。
静态映射,即人为事先定义好映射,包含文档的各个字段及其类型等,这种方式称之为静态映射,亦可称为显式映射。
Index Template
Index Template 帮助你设置 Mapping和Settings ,并按照一定的规则,自动匹配到新创建的索引之上
- 模版仅在一个索引被新创建时才会产生作用,修改模版不会影响已创建的索引
- 可以设置多个索引模版,这些设置为被合并在一起
- 可以指定 order 的数值,控制 merging 的过程 ,order 越小越先执行,后执行的会覆盖前面的
- 用户创建索引设置会覆盖 Index Template 设置
PUT _template/template_default
{
// 匹配模式,所有索引都匹配
"index_patterns":[*]
// 执行先后顺序,越小越先执行,后面的会覆盖前面的
"order":0,
// 模版版本
"version":1,
// 设置相关
"settings":{
// 分片数量
"number_of_shards":1,
// 副本数量
"number_of_replicas":1
}
}
PUT _template/template_test
{
// 匹配模式,以 test 开头的索引
"index_patterns":[test*]
// 执行先后顺序,越小越先执行,后面的会覆盖前面的
"order":1,
// 设置相关
"settings":{
// 分片数量
"number_of_shards":1,
// 副本数量
"number_of_replicas":2
},
// 映射
"mappings":{
// 日期检测
"date_detection":false,
// 数字检测
"numeric_detection":true
}
}
动态映射
默认情况下,当在文档中找不到字段的定义时,Elasticsearch会自动将这个新字段添加到类型映射中。我们可以在文档和object级别禁用这项功能,具体操作方式就是通过将 dynamic
参数设置为false
或strict
,设为false是忽略新字段,而设为strict是如果遇到未知字段,就抛出异常。
PUT {索引名}{
"mappings":{
"_doc":{
"dynamic":false
}
}
}
True | False | Strict | |
---|---|---|---|
文档可索引 | ✅ | ✅ | ❎ |
字段可索引 | ✅ | ❎ | ❎ |
Mapping 被更新 | ✅ | ❎ | ❎ |
修改已存在字段类型
ES 是不允许修改字段的类型的,因为 ES 是根据 Lucene 实现的倒排索引,一旦生成后就不允许修改,如果希望改变字段类型,必须使用 Reindex API 重建索引。
不能修改的原因是如果修改了字段的数据类型,会导致已被索引的无法被搜索,但是如果是增加新的字段,就不会有这样的影响。
分类:
Elasticsearch
标签:
Elasticsearch
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)