Elasticsearch7.X 入门学习第五课笔记---- - Mapping设定介绍
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
原文地址:https://www.cnblogs.com/lonelyxmas/p/11612454.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R语言实现:混合正态分布EM最大期望估计法
- MongoDB 指令
- 硬件设计之 Distributed Arithmetic 一例
- JavaScript 框架学习(JQuery)
- MongoDB 部署
- 结构体对齐原则在自定义协议解析时的妙用之法
- Spring JDBC 框架一个最简单的Hello World级别的例子
- Celery 分布式框架 学习
- .NET Core + K8S + Loki 玩转日志聚合
- varint是啥你真的知道么?
- 一篇文章带你入门移动安全
- Could not load JDBC driver class [com.mysql.jdbc.Driver]
- [Bazel]自定义规则实现将多个静态库合并为一个动态库或静态库
- [Golang]包管理
- Power Query中避免出错的几种情况