Elasticsearch核心技术(三):Mapping设置
本文从Mapping简介、Dynamic Mapping、自定义Mapping和Mapping常用参数说明4个部分介绍Elasticsearch如何设置Mapping。
3.1 Mapping简介
3.1.1 什么是Mapping
Mapping类似数据库中的表定义,主要作用如下:
- 定义索引下的字段名
- 定义字段的类型,比如数值型、字符串型、布尔型等
- 定义倒排索引相关的配置,比如是否索引、记录position等
使用API获取Mapping:
request:GET /test_index/_mapping
response:
{
"test_index" : {
"mappings" : {
"properties" : {
"age" : {
"type" : "long"
},
"username" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
3.1.2 Mapping支持的数据类型
- 核心数据类型
- 字符串型:text、keyword
- 数值型:long、integer、short、byte、double、float、half_float、scaled_float
- 日期类型:date
- 布尔类型:boolean
- 二进制类型:binary
- 范围类型:integer_range、float_range、long_range、double_range、data_range
- 复杂类型
- 数组类型:array
- 对象类型:object
- 嵌套类型:nested object
- 特殊类型
- 地理位置:geo_point、geo_shape、
- IP地址:IPv4、IPv6
- 自动补全:complete
- percolator
- 多字段特性:multi-fields
- 允许对同一字段采用不同的配置,比如分词,常见例子如对人名实现拼音搜索
- 实现方式:在人名中新增一个子字段为pinyin即可
3.2 Dynamic Mapping
3.2.1 什么是Dynamic Mapping
- 在文档写入的时候,如果索引不存在,会自动创建索引
- Dynamic Mapping的机制,使得无需手动定义Mapping,Elasticsearch会自动识别字段的类型,从而降低用户的使用成本
- 但是有时候会推算的不对,例如地址位置信息
- 当类型如果设置不对时,会导致一些功能无法正常使用,例如Range查询
3.2.2 类型的自动识别
ES依靠JSON文档的字段类型来实现自动识别字段类型,支持的类型如下:
| JSON类型 | ES类型 |
|---|---|
| null | 忽略 |
| boolean | boolean |
| 浮点类型 | float |
| 整数 | long |
| object | object |
| array | 由第一个非null值的类型决定 |
| string | 匹配日期格式,设置为Date(默认开启);匹配数字,设置为float或者long(默认关闭);设置为Text,并且增加keyword子字段 |
3.2.3 Dynamic的设置
当创建Index的时候,dynamic字段可以设置成3种值:true、false、strict。
例如:
PUT movies
{
"mapping":{
"_doc":{
"dynamic":"false"
}
}
}
| true | false | strict | |
|---|---|---|---|
| 文档可索引 | |||
| 字段可索引 | |||
| Mapping被更新 |
说明:
- 当设置成true的时候,文档可以被索引,字段可以被搜索,Mapping文件可以更新。
- 当dynamic被设置成false的时候,新增字段的数据可以写入ES;该数据可以被索引,但是新增字段不可被搜索。
- 当设置成strict的时候,数据写入直接报错。
3.3 自定义Mapping
3.3.1如何自定义Mapping
自定义Mapping的一些建议
- 可以参考API手册,纯手写
- 为了减少工作量,减少出错率,可以参考以下步骤:
- 创建一个临时的index,写入一些样本数据
- 通过访问Mapping API获得该临时文本的动态Mapping定义
- 修改后,使用该配置创建索引
- 删除临时索引
3.3.2 能否更改Mapping的字段类型
ES能否更改Mapping的字段类型,需要分两种情况进行分析。
1. 新增字段
dynamic设置为true(默认值)时,一旦有新增字段的文档写入,Mapping也同时被更新。
dynamic设置为false时,Mapping不会被更新,更新字段的数据无法被索引,但是信息会出现在_source中,换言之,文档可以正常写入,但是无法对字段进行搜索。
dynamic设置为strict时,文档写入失败。
2. 对已有字段,一旦已经有数据写入,就不再支持修改字段定义。因为ES是基于Lucene实现的倒排索引,一旦生成后,就不允许修改。因为如果修改了字段的数据类型,会导致已被索引的数据无法被搜索。如果希望修改字段类型,必须使用Reindex API进行重建索引。
3.4 Mapping常用参数说明
copy_to
将该字段复制到目标字段,实现类似_all的作用;不会出现在_source中,只用来搜索index
控制当前字段是否索引,默认为true,即记录索引,false不记录,即不可搜索。例如某些场景希望敏感信息不用来做搜索,可以将index设置为false,则不可以用来搜索,也可以节省空间。
index_option用于控制倒排索引记录的内容,有4种配置:
- docs只记录doc id
- freqs记录doc id和term frequencies
- positions记录doc id、term frequencies和term position
- offsets记录doc id、term frequencies、term position和character offsets
text类型默认配置为positions。其他默认是docs。当然记录内容越多,占用空间越大。
null_value
当字段遇到null值时的处理策略,默认为null,即空值,此时es会忽略该值;可以通过设定该属性设定字段的默认值。
更多常用参数可以参考:https://www.elastic.co/guide/en/elasticsearch/reference/7.1/mapping-params.html
Elasticsearch核心技术(三):Mapping设置的更多相关文章
- 第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理
第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理 1.映射(mapping)介绍 映射:创建索引的时候,可以预先定义字 ...
- Elasticsearch 6.x版本全文检索学习之倒排索引与分词、Mapping 设置
Beats,Logstash负责数据收集与处理.相当于ETL(Extract Transform Load).Elasticsearch负责数据存储.查询.分析.Kibana负责数据探索与可视化分析. ...
- Elasticsearch核心技术(2)--- 基本概念(Index、Type、Document、集群、节点、分片及副本、倒排索引)
Elasticsearch核心技术(2)--- 基本概念 这篇博客讲到基本概念包括: Index.Type.Document.集群,节点,分片及副本,倒排索引. 一.Index.Type.Docume ...
- Elasticsearch核心技术(五):搜索API和搜索运行机制
本文将从数据存储和搜索的角度简单分析Elasticsearch的搜索运行机制,主要涉及搜索API.搜索机制.存在问题和解决方案. 4.1 Search API Search API允许用户执行一个搜索 ...
- ElasticSearch第三步-中文分词
ElasticSearch系列学习 ElasticSearch第一步-环境配置 ElasticSearch第二步-CRUD之Sense ElasticSearch第三步-中文分词 ElasticS ...
- elasticsearch中的mapping映射配置与查询典型案例
elasticsearch中的mapping映射配置与查询典型案例 elasticsearch中的mapping映射配置示例比如要搭建个中文新闻信息的搜索引擎,新闻有"标题".&q ...
- elasticsearch篇之mapping
2018年05月17日 18:01:37 lyzkks 阅读数:444更多 个人分类: Elastic stack 版权声明:文章内容来自于网络和博主自身学习体会,转载请注明出处,欢迎留言大家一起 ...
- elasticsearch 权威指南Mapping(映射)
什么是映射 类似于数据库中的表结构定义,主要作用如下: 定义Index下字段名(Field Name) 定义字段的类型,比如数值型,字符串型.布尔型等 定义倒排索引的相关配置,比如是否索引.记录pos ...
- ElasticSearch(三):通分词器(Analyzer)进行分词(Analysis)
ElasticSearch(三):通过分词器(Analyzer)进行分词(Analysis) 学习课程链接<Elasticsearch核心技术与实战> Analysis与Analyzer ...
- 关于ElasticSearch的堆内存设置与优化
1.什么是堆内存?Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象.在 Java 中,堆被划分成两个不同的区域:- 新生代 ( Young ).- 老年代 ( Ol ...
随机推荐
- vue 输入框内容控制
只能输入数字 <el-input onkeyup="value=value.replace(/[^\d]/g,'')" v-model.number="a" ...
- 如何高效掌控K8s资源变化?K8s Informer实现机制浅析
作者 王成,腾讯云研发工程师,Kubernetes contributor,从事数据库产品容器化.资源管控等工作,关注 Kubernetes.Go.云原生领域. 概述 进入 K8s 的世界,会发现有很 ...
- pycharm的常规使用
1.修改当前项目的Py版本,是py2还是py3 pycharm-->settings-->选中要运行的项目-->选择py版本(如果你两个py版本都装在本机的话) 2.显示行数 在每行 ...
- JavaScript进行表单提交
表单结构,设置form表单的id属性,method="post/get","action"要跳转的页面(jsp或servlet) <form name=& ...
- vue-自定义指令(directive )的使用方法
前言 在vue项目中我们经常使用到 v-show ,v-if,v-for等内置的指令,除此之外vue还提供了非常方便的自定义指令,供我们对普通的dom元素进行底层的操作.使我们的日常开发变得更加方便快 ...
- PHP多文件上传格式化
文件上传是所有web应用中最常见的功能,而PHP实现这一功能也非常的简单,只需要前端设置表单的 enctype 值为 multipart/form-data 之后,我们就可以通过 $_FILES 获得 ...
- 关于jQ的小案例分享
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>表 ...
- nginx 常用x代码
1.nginx 禁止ip直接访问,只允许域名访问,直接在.conf文件里 server上面再添加一个server 代码,不可以写同一个server里: server { listen 80 defau ...
- asp.net core使用identity+jwt保护你的webapi(一)——identity基础配置
前言 用户模块几乎是每个系统必备的基础功能,如果每次开发一个新项目时都要做个用户模块,确实非常无聊.好在asp.net core给我们提供了Identity,使用起来也是比较方便,如果对用户这块需求不 ...
- RabbitMQ 3.9.7 镜像模式集群的搭建
1. 概述 老话说的好:做人脚踏实地,一步一个脚印,便定能战胜一切困难,最终取得成功!!! 言归正传,之前我们聊了 RabbitMQ 单点服务的安装,今天我们来聊聊 RabbitMQ 3.9.7 镜像 ...