【Elasticsearch 7 探索之路】(六)初识 Mapping
上一篇主要讲解什么是 URL Search 和 Request Body Search 的语法。本篇对 Mapping 的 Dynamic Mapping 以及手动创建 Mapping 进行讲解。
1.什么是 Mapping
- Mapping 类似数据库中的 schema 的定义,作用如下 定义索引中的字段的名称
- 定义字段的数据类型,例如字符串,数值等
- 字段,倒排索引的相关配置,比如可以通过配置字段是否需要被索引(Analyzed or Not Analyzed,Analyzer)
-
一个 Type 有一个 Mapping 定义
2.常用字段的数据类型
- 简单类型 Text / Keyword
- Date
- Integer / float/ double /long
- Boolean
- Ip
-
对象类型/嵌套类型
-
geo_point & geo_shape / percolator
3.1什么是 Dynamic Mapping
Dynamic Mapping 会自动根据文档信息,推算出字段的类型,使得你无需手动创建 Mapping。在写入文档时候,而且如果索引不存在,会自动创建索引。但是有时候推算也会错误,例如地理位置信息。当类型如果设置不对时,会导致一些功能无法正常运行,这点要特别注意。
下面总结 Json 类型到 Elasticsearch 类型的自动识别
3.2.Json 类型和 Elasticsearch 类型转换映射
Json 类型 | Elasticsearch 类型 |
---|---|
字符串 | 1.匹配日期格式,转为 Date 2.数值转为 float 或者 long,默认关闭 3.转为 Text,并且增加 keyword |
布尔值 | boolean |
浮点数 | float |
整 数 | long |
对 象 | Object |
数 组 | 由第一个非空数值的类型所决定 |
空 值 | 忽略 |
PUT mapping_test/_doc/1 { "name":"al", "age":15, "ageStr":"15", "birth":"2019-12-18", "arg":["aaa","1"], "flag":false } GET mapping_test/_mapping
3.3.能否更改 Mapping 字段类型
- 新增字段情况,Dynamic 设置为 true,带有新字段的文档写入,Mapping 会更新。Dynamic 设置为 false,Mapping 不被更新,新增字段不会被索引。Dynamic 设置为 Strict,带有新字段的文档写入会直接报错。
- 对已有字段并且存在数据情况,不支持修改字段定义,因为 ES 通过 Lucene 生成倒排索引,一旦生成就不许与修改
- 如果实在需要修改可以通过 Reindex Api 重建索引
PUT mapping_test/_mapping { "dynamic":"false" } PUT mapping_test/_doc/2 { "name":"al", "age":15, "ageStr":"15", "birth":"2019-12-18", "arg":["aaa","1"], "flag":false, "addCol":"test" } GET mapping_test/_search { "query": { "match": { "addCol": "test" } } }
当前设置 "dynamic":"false"时,新增的字段查询不出结果。
4.1.手动创建 Mapping
上面我们介绍了关于 Dynamic Mapping 功能,现在但我们想要手动创建一个 Mapping 该如何创建。我先看一下下面代码。
PUT student { "mappings":{ "properties": { "firstName":{ "type":"text" }, "lastName":{ "type":"text" }, "password":{ "type":"text", "index":false } } } } PUT student/_doc/1 { "firstName":"AA", "lastName":"BB", "password":"abc" } POST student/_search { "query": { "match_phrase": { "password": { "query": "abc" } } } }
上面这个例子,就是一个比较简单手动创建例子,我们通过为每一个字段创建类型,当指定 index:false 时,ES 将不对这个字段建立倒排索引,从上图结果就可以看出。
4.2.Index Options
ES 有四种不同级别的 Index Options 配置
- docs 记录 doc id
- freqs 记录 doc id 和 term 频次
- positions 记录 doc id 和 term 频次 和 term 位置
- offsets 记录 doc id 和 term 频次 和 term 位置和字符偏移量
Text 类型默认 positions,其他默认为 docs
4.3.copy_to
copy_to 是为瞒足一些特定搜素需求,将多个字段 数值拷贝到目标字段,目标字段不会出现在 _source。在 ES7 中,copy_to 已经替代 copy_to。例如下面这个例子,把 firsetName 和 lastName 合并一起搜素。
PUT student_1 { "mappings":{ "properties": { "firstName":{ "type":"text", "copy_to": "fullName" }, "lastName":{ "type":"text", "copy_to": "fullName" }, "password":{ "type":"text", "index":false } } } } PUT student_1/_doc/1 { "firstName":"AA", "lastName":"BB", "password":"abc" } Get student_1/_search?q=fullName:(AA BB)
5.小结
本篇主要对 Dynamic Mapping 以及手动创建 Mapping 进行讲解,Dynamic Mapping 有好处也有坏处,好处我们无需定义 Mapping,坏处是推算的类型不一定正确,这点要留意。如果手动创建 Mapping 比较推荐先用 Dynamic Mapping 创建生成一个临时索引,查询 Mapping 定义(标题3.2 下面的结果图)修改使用,这样可以减少工作量和出错的概率。
系列文章
【Elasticsearch 7 探索之路】(五)搜索相关 Search-API
【Elasticsearch 7 探索之路】(四)Analyzer 分析
【Elasticsearch 7 探索之路】(三)倒排索引
【Elasticsearch 7 探索之路】(二)文档的 CRUD 和批量操作
【Elasticsearch 7 搜索之路】(一)什么是 Elasticsearch?
- 【Elasticsearch 7 探索之路】(四)Analyzer 分析
- elasticsearch的探索之路
- elasticsearch的探索之路
- 【Elasticsearch】Elasticsearch 6.x 探索之路-安装
- 【Elasticsearch】Elasticsearch 6.x 探索之路-中文分词器IK
- ElasticSearch34:初识搜索引擎_mapping复杂数据类型以及object类型数据底层结构揭秘
- 【Elasticsearch 7 探索之路】(五)搜索相关 Search-API
- 【Elasticsearch 7 探索之路】(三)倒排索引
- 【Java安全技术探索之路系列:Java可扩展安全架构】之十二:JSSE(二):JSSE类和接口
- JVM探索之路之Class文件结构解析(一):Class文件的格式与定义
- elasticsearch中的mapping简介
- CentOS探索之路3---安装python3
- 使用Elasticsearch建索引提高HBase检索速度的探索
- Scrapy 探索之路
- 手机淘宝的客户端架构探索之路
- Python探索之路(五)---打印三角形阵列
- python之路——初识函数
- Elasticsearch 通关教程(二): 索引映射Mapping问题
- TypeScript之路----探索接口(interface)的奥秘
- jquery学习之路 初识jquery!