Elasticsearch7.X 入门学习第五课笔记---- - Mapping设定介绍
原文:Elasticsearch7.X 入门学习第五课笔记---- - Mapping设定介绍
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
Elasticsearch的Mapping,定义了索引的结构,类似于关系型数据库的Schema。Elasticsearch的Setting定义中定义分片和副本数以及搜索的最关键组件,即:Analyzer,也就是分析器。
一、Dynamic Mapping及常用字段类型
mapping 的定义
Mapping类似于关系型数据库的Schema,主要包含以下内容:
- 定义索引中字段的名称
- 定义字段的数据类型,如:字符串、数字、boolean等
- 可对字段设置倒排索引的相关配置,如是否需要分词,使用什么分词器
从7.x开始,一个Mapping只属于一个索引的type
- 每个文档属于一个type
- 一个type有且仅有一个Mapping定义
- 从7.x开始,不需要在Mapping中指定type信息,默认type为
_doc
常用字段类型
在Elasticsearch中,字段数据类型有以下常用的类型:
- 简单类型
- Text / Keyword - 文本 / 关键字
- Date - 日期
- Integer / Float - 数字 / 浮点
- Boolean - 布尔值
- IPv4 / IPv6 - ip地址
- 复杂类型,包括对象和数组
- 对象
- 数组
- 特殊类型,如地理信息
- geo_point / ...
Dynamic Mapping
Dynamic Mapping 翻译为动态Mapping:
- 在写入文档时,如果索引不存在,会自动创建索引
- 这种机制,使得我们无需手动定义mappings。Elasticsearch会自动根据文档信息,推算出字段的类型
- 有的时候,Elasticsearch可能会推算不对,如:地理位置信息
- 当类型推算得不对时,可能导致一些功能无法正常运行,如Range查询。
常用类型的自动识别规则
| 类型 | 规则 |
|---|---|
| 字符串 | 匹配到日期格式,设置成Date。 字符串为数字时,当成字符串处理,但我们设置转换为数字。 其他情况,类型就是Text,并且会增加keyword的子字段 |
| 布尔值 | Boolean |
| 浮点数 | Float |
| 整数 | Long |
| 对象 | Object |
| 数组 | 由第一个非空数值的类型决定 |
| 空值 | 忽略 |
下面是具体推断 demo
-
# 写入文档,查看 Mapping
-
PUT mapping_test/_doc/1
-
{
-
"firstName": "Chan", -- Text
-
"lastName": "Jackie", -- Text
-
"loginDate": "2018-07-24T10:29:48.103Z" -- Date
-
}
-
-
# Dynamic Mapping,推断字段的类型
-
PUT mapping_test/_doc/1
-
{
-
"uid": "123", -- Text
-
"isVip": false, -- Boolean
-
"isAdmin": "true", -- Text
-
"age": 19, -- Long
-
"heigh": 180 -- Long
-
}
-
-
# 查看 Dynamic Mapping
-
GET mapping_test/_mapping
能否更改mapping的字段类型
分两种情况:
1、新增加的字段
- dynamic设为true时,新增字段的文档写入时,Mapping同时被更新
- dynamic设为false时,Mapping不会被更新,新增字段的数据无法被索引,但是会出现在_source中
- dynamic设为strict,文档将写入失败
2、已存在的字段,一旦数据被写入,就不再支持修改字段定义
- Lucene本身的限制
- 如果希望更改字段类型,必须Reindex api,即:重建索引。在数据量多的时候,开销将非常大
-
# dynamic设置为false
-
PUT idx1
-
{
-
"mapping": {
-
"_doc": {
-
"dynamic": "false"
-
}
-
}
-
}
-
-
# 修改为dynamic为false
-
PUT idx1/_mapping
-
{
-
"dynamic": false
-
}
-
-
# 查看索引
-
GET idx1/_mapping
dynamic属性和索引字段可变性的规则,我们可以总结如下:
| \ | true | false | strict |
|---|---|---|---|
| 文档可索引 | yes | yes | no |
| 字段可索引 | yes | no | no |
| Mapping被更新 | yes | no | no |
显式Mapping及常见参数
在本文的上一段落,我们的Mapping都是自动生成的。自动生成机制虽然方便,但是也可能导致一些问题。比如:生成的字段类型不正确,字段的附加属性不满足我们的需求,等等。这时,我们可以通过显式Mapping的方式来解决。
那么,我们如何进行显式Mapping的设置呢?

- 参考官网api,纯手写
- 为减少工作量,减少出错概率,可如下进行:
- 创建一个临时index,写入一些样本数据
- 通过访问Mapping API获取该临时文件的动态Mapping定义
- 修改后,再使用此配置创建自己的索引
- 删除临时索引
我们推荐使用第二种方式,效率高,且不容易出错。
控制当前字段是否被索引———index
index,可用于设置字段是否被索引,默认为true,false即为不可搜索。在下述例子中,mobile字段将不能被搜索到。
-
# index属性控制 字段是否可以被索引
-
PUT user_test
-
{
-
"mappings": {
-
"properties": {
-
"firstName":{
-
"type": "text"
-
},
-
"lastName":{
-
"type": "text"
-
},
-
"mobile" :{
-
"type": "text",
-
"index": false
-
}
-
}
-
}
-
}
常见参数 - index_options
记录索引级别。Text类型默认为positions,其他类型默认为docs。我们需要记住一条准则。
记录的内容越多,占用的存储空间就越大。
索引级别有以下几种,更细节的内容可参考官网
- docs
- freqs
- positions
- offsets

null_value设置
需要对Null值实现搜索时使用。只有keyword类型才支持设定null_value
-
# 设定Null_value
-
DELETE users
-
PUT users
-
{
-
"mappings" : {
-
"properties" : {
-
"firstName" : {
-
"type" : "text"
-
},
-
"lastName" : {
-
"type" : "text"
-
},
-
"mobile" : {
-
"type" : "keyword",
-
"null_value": "NULL"
-
}
-
}
-
}
-
}
-
-
PUT users/_doc/1
-
{
-
"firstName":"Zhang",
-
"lastName": "Fubing",
-
"mobile": null
-
}
-
-
PUT users/_doc/2
-
{
-
"firstName":"Zhang",
-
"lastName": "Fubing2"
-
}
-
-
# 查看结果,有且仅有_id为2的记录
-
GET users/_search
-
{
-
"query": {
-
"match": {
-
"mobile":"NULL"
-
}
-
}
-
}
copy_to
这个属性用于将当前字段拷贝到指定字段。
_all在7.x版本已经被copy_to所代替- 可用于满足特定场景
copy_to将字段数值拷贝到目标字段,实现类似_all的作用copy_to的目标字段不出现在_source中
-
DELETE user_test
-
-
#设置 Copy to
-
PUT user_test
-
{
-
"mappings": {
-
"properties": {
-
"firstName":{
-
"type": "text",
-
"copy_to": "fullName"
-
},
-
"lastName":{
-
"type": "text",
-
"copy_to": "fullName"
-
}
-
}
-
}
-
}
-
-
PUT user_test/_doc/1
-
{
-
"firstName":"Ruan",
-
"lastName": "Yiming"
-
}
-
-
POST user_test/_search?q=fullName:(Ruan Yiming)
数组类型
Elasticsearch不提供专门的数组类型。但任何字段,都可以包含多个相同类型的数值。
-
# 数组类型
-
PUT users/_doc/1
-
{
-
"name":"onebird",
-
"interests":"reading"
-
}
-
-
PUT users/_doc/1
-
{
-
"name":"twobirds",
-
"interests":["reading","music"]
-
}
-
-
POST users/_search
-
{
-
"query": {
-
"match_all": {}
-
}
-
}
-
-
# interests字段还是text类型
-
GET users/_mapping
Elasticsearch7.X 入门学习第五课笔记---- - Mapping设定介绍的更多相关文章
- Elasticsearch7.X 入门学习第七课笔记-----Mapping多字段与自定义Analyzer
原文:Elasticsearch7.X 入门学习第七课笔记-----Mapping多字段与自定义Analyzer 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处 ...
- Elasticsearch7.X 入门学习第八课笔记-----索引模板和动态模板
原文:Elasticsearch7.X 入门学习第八课笔记-----索引模板和动态模板 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接: ...
- Elasticsearch7.X 入门学习第四课笔记---- Search API之(Request Body Search 和DSL简介)
原文:Elasticsearch7.X 入门学习第四课笔记---- Search API之(Request Body Search 和DSL简介) 版权声明:本文为博主原创文章,遵循CC 4.0 BY ...
- Elasticsearch7.X 入门学习第三课笔记----search api学习(URI Search)
原文:Elasticsearch7.X 入门学习第三课笔记----search api学习(URI Search) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出 ...
- Es学习第五课, 分词器介绍和中文分词器配置
上课我们介绍了倒排索引,在里面提到了分词的概念,分词器就是用来分词的. 分词器是ES中专门处理分词的组件,英文为Analyzer,定义为:从一串文本中切分出一个一个的词条,并对每个词条进行标准化.它由 ...
- Elasticsearch7.X 入门学习第九课笔记-----聚合分析Aggregation
原文:Elasticsearch7.X 入门学习第九课笔记-----聚合分析Aggregation 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. ...
- Elasticsearch7.X 入门学习第二课笔记----基本api操作和CRUD
原文:Elasticsearch7.X 入门学习第二课笔记----基本api操作和CRUD 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链 ...
- Elasticsearch7.X 入门学习第一课笔记----基本概念
原文:Elasticsearch7.X 入门学习第一课笔记----基本概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https: ...
- python学习第五次笔记
python学习第五次笔记 列表的缺点 1.列表可以存储大量的数据类型,但是如果数据量大的话,他的查询速度比较慢. 2.列表只能按照顺序存储,数据与数据之间关联性不强 数据类型划分 数据类型:可变数据 ...
随机推荐
- 使用distinct消除重复记录的同时又能选取多个字段值
需求是:我要消除name字段值重复的记录,同时又要得到id字段的值,其中id是自增字段. select distinct name from t1 能消除重复记录,但只能取一个字段,现在要同时取id, ...
- webstorm主题更换和webstorm汉化
主题更换方式一 主题类型:*.jar 在webstorm程序中选择 : 菜单栏 File -> Setting ->Import Settings 选中下载的.jar文件 主题更换方式二 ...
- 【PowerOJ1752&网络流24题】运输问题(费用流)
题意: 思路: [问题分析] 费用流问题. [建模方法] 把所有仓库看做二分图中顶点Xi,所有零售商店看做二分图中顶点Yi,建立附加源S汇T. 1.从S向每个Xi连一条容量为仓库中货物数量ai,费用为 ...
- Gradle教程-w3cschool
Gradle,这是一个基于 JVM 的富有突破性构建工具.Gradle 正迅速成为许多开源项目和前沿企业构建系统的选择,同时也在挑战遗留的自动化构建项目.本教程主要讲解了如何使用 Gradle 构建系 ...
- 重新理解了重定向,利用重定向可以防止用户重复提交表单(兼谈springmvc重定向操作)
自己用springmvc框架有一段时间了,但是都还一直分不清楚什么时候应该用转发,什么时候应该用重定向.可能用转发的情形太多了,以致于自己都忘记了还有重定向. 当用户提交post请求之后,刷新页面就会 ...
- icon组件
iocn组件,小程序给我们提供了一些小图标,与微信的风格一致 iocn组件的属性: type:类型:string icon的类型: 属性值:success:成功 带背景的 success_no_c ...
- windows 2008 gpt
新服务器,4T硬盘,U盘安装Windows Server 2008 R2. 把2008的镜像用UltraISO写入U盘. 安装到分区那块,主分区200G,剩余分区系统自动给分为: 2T + 剩余 两块 ...
- chrome flash 自动暂停问题
chrome flash 尺寸小于398*298时,只要宽和高某一个值小于对应值就会自动暂停,出现这个圆形的播放按钮.(估计是当广告处理了...) 将尺寸调大即可.
- 关于openGL、GPUImage、ios直播相关不错的博客
http://www.jianshu.com/users/815d10a4bdce/latest_articles
- React Native商城项目实战10 - 个人中心中间内容设置
1.新建一个MineMiddleView.js,专门用于构建中间的内容 /** * 个人中心中间内容设置 */ import React, { Component } from 'react'; im ...