ES 11 - 配置Elasticsearch的映射(mapping)
目录
1 映射的相关概念
1.1 什么是映射
(1) 映射(mapping): 定义index的元数据, 指定要索引并存储的文档的字段类型.
也就是说映射决定了elasticsearch在建立倒排索引、进行检索时对文档采取的相关策略, 如数字类型、日期类型、文本类型等等.
需要注意的是: 检索时用到的分析策略, 要和建立索引时的分析策略相同, 否则将导致数据不准确.
(2) es对不同的类型有不同的存储和检索策略.
① 比如: 对full text型的数据类型(如text), 在索引时, 会经过各类处理 (包括分词、normalization(时态转换、同义词转换、大小写转换)等处理), 才会建立到索引数据中.
② 再比如: 对exact value(如date), 在索引的分词阶段, 会将整个value作为一个关键词建立到倒排索引中.
1.2 映射的组成
每个index都有一 (至多) 个type, 每个type对应一个mapping.
在elasticsearch 6.x版本开始, 1个index只能有1个type.
每个mapping都由下述部分组成:
① 元字段:
_index
、_type
、_id
和_source
.
② field/properties(字段或属性): 同一index中, 同名的field的映射配置必须相同a) 因为index是根据
_type
元字段来区分type的, 也就是存储的每个文档中都有_type
等元字段, 如果相同名称的field的映射(_type
字段的值)不同, elasticsearch在解析时就会出现冲突.b) 这些参数可以例外:
copy_to、dynamic、enabled、ignore_above、include_in_all
.
关于type的处理方法, 可以参考博客: es xx - elasticsearch对type的处理(type的底层结构).
1.3 元字段
每个文档都有与之关联的元数据 —— es内部为所有的文档配备的field, 都是以下划线_
开头的内置字段.
具体的内容请参考博文 es xx - elasticsearch的元字段 中详细讲解.
1.4 字段的类型
elasticsearch中每个field都对应一至多个数据类型.
详细的内容请参考博文 es xx - elasticsearch中字段的类型 中详细讲解.
2 如何配置mapping
2.1 创建mapping
(1) 必读说明:
① 创建mapping时, 可以指定每个field是否需要:
索 引:
"index": true
—— 默认配置
不索引:"index": false
② mapping root object
:
每个type对应的mapping的json串, 包括properties, metadata(_id, _source, _type) , settings(analyzer) , 其他settings(如include_in_all)
(2) 创建mapping的示例:
需求: 创建名为website的索引, 包含一个user类型. user类型中禁用元字段_all
.
put website { "mappings": { "user": { // 这就是一个root object "_all": { "enabled": false }, // 禁用_all字段 "properties": { "user_id": { "type": "text" }, "name": { "type": "text", "analyzer": "english" }, "age": { "type": "integer" }, "sex": { "type": "keyword" }, "birthday": { "type": "date", "format": "strict_date_optional_time||epoch_millis" }, "address": { "type": "text", "index": false // 不分词 } } } } }
(3) 过期提示说明 —— 这里使用的是elasticsearch 6.6.10版本:
① 是否索引的api已经做了修改, 若使用"analyzed" | "not_analyzed" | "yes" | "no"等, 将抛出如下警告:
#! deprecation: expected a boolean [true/false] for property [index] but got [not_analyzed] #! deprecation: expected a boolean [true/false] for property [index] but got [no]②
_all
元字段也将在7.0版本中移除, 它建议我们使用copy_to
定制自己的all field
:#! deprecation: [_all] is deprecated in 6.0+ and will be removed in 7.0. as a replacement, you can use [copy_to] on mapping fields to create your own catch all field.
2.2 更新mapping
(1) 必读说明:
-
映射一旦创建完成, 就不允许修改:
—— elasticsearch对文档的分析、存储、检索等过程, 都是严格按照mapping中的配置进行的. 如果允许后期修改mapping, 在检索时对索引的处理将存在不一致的情况, 导致数据检索行为不准确.
只能在创建index的时候手动配置mapping, 或者新增field mapping, 但是不能update field mapping.
(2) 更新mapping出现异常:
-
修改已经创建好的mapping
put website { "mappings": { "user": { "properties": { "author_id": { "type": "text" } } } } }
-
抛出如下错误 —— 索引已经存在的异常:
{ "error": { "root_cause": [ { "type": "resource_already_exists_exception", "reason": "index [website/mvyk4-a7rmozbkccp2avfw] already exists", "index_uuid": "mvyk4-a7rmozbkccp2avfw", "index": "website" } ], "type": "resource_already_exists_exception", "reason": "index [website/mvyk4-a7rmozbkccp2avfw] already exists", "index_uuid": "mvyk4-a7rmozbkccp2avfw", "index": "website" }, "status": 400 }
(3) 向mapping中添加新type:
-
向已有mapping中添加字段及其映射信息:
put website/_mapping/user // 修改user类型的_mapping, 注意api的顺序 { "properties": { "new_field": { "type": "text", "index": false } } }
2.3 查看mapping
(1) 查看mapping的api:
get website/_mapping
(2) 查看的结果信息如下:
{ "website" : { "mappings" : { "user" : { "_all" : { "enabled" : false // 禁用元字段_all }, "properties" : { "address" : { "type" : "text", "index" : false // 不索引 }, "age" : { "type" : "integer" }, "birthday" : { "type" : "date" }, "name" : { "type" : "text", "analyzer" : "english" }, "new_field" : { // 后期添加的新字段 "type" : "text", "index" : false // 不索引 }, "sex" : { "type" : "keyword" }, "user_id" : { "type" : "text" } } } } } }
版权声明
作者: ma_shoufeng(马瘦风)
出处: 博客园
您的支持是对博主的极大鼓励, 感谢您的阅读.
本文版权归博主所有, 欢迎转载, 但请保留此段声明, 并在文章页面明显位置给出原文链接, 否则博主保留追究相关人员法律责任的权利.
上一篇: 假牙是什么时候出现的?200年前的黄金假牙是怎么样的?
下一篇: 国际化了!厉害!
推荐阅读
-
ES 11 - 配置Elasticsearch的映射(mapping)
-
Elasticsearch系列7.5--ES中字段的动态映射
-
Elasticsearch 7.x 映射(Mapping)中的字段类型
-
Elasticsearch索引(index)、映射(mapping)等相关的创建
-
ES 12 - 配置使用Elasticsearch的动态映射(dynamic mapping)
-
[es7]在往elasticsearch插数据之前,mapping和setting要怎么配置呢?
-
如何禁用elasticsearch(ES)的自动创建mapping
-
Elasticsearch(017):es常见的字段映射类型之嵌套类型(nested)
-
Elasticsearch(023):es常见的字段映射类型之IP类型
-
Elasticsearch(021):es常见的字段映射类型之地理点类型(geo-point)