原文:Elasticsearch7.X 入门学习第五课笔记---- - Mapping设定介绍

版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

Elasticsearch的Mapping,定义了索引的结构,类似于关系型数据库的Schema。Elasticsearch的Setting定义中定义分片和副本数以及搜索的最关键组件,即:Analyzer,也就是分析器。

一、Dynamic Mapping及常用字段类型

mapping 的定义

Mapping类似于关系型数据库的Schema,主要包含以下内容:

  1. 定义索引中字段的名称
  2. 定义字段的数据类型,如:字符串、数字、boolean等
  3. 可对字段设置倒排索引的相关配置,如是否需要分词,使用什么分词器

从7.x开始,一个Mapping只属于一个索引的type

  1. 每个文档属于一个type
  2. 一个type有且仅有一个Mapping定义
  3. 从7.x开始,不需要在Mapping中指定type信息,默认type为_doc

常用字段类型

在Elasticsearch中,字段数据类型有以下常用的类型:

  1. 简单类型

    • Text / Keyword - 文本 / 关键字
    • Date - 日期
    • Integer / Float - 数字 / 浮点
    • Boolean - 布尔值
    • IPv4 / IPv6 - ip地址
  2. 复杂类型,包括对象和数组
    • 对象
    • 数组
  3. 特殊类型,如地理信息
    • geo_point / ...

Dynamic Mapping

Dynamic Mapping 翻译为动态Mapping:

  1. 在写入文档时,如果索引不存在,会自动创建索引
  2. 这种机制,使得我们无需手动定义mappings。Elasticsearch会自动根据文档信息,推算出字段的类型
  3. 有的时候,Elasticsearch可能会推算不对,如:地理位置信息
  4. 当类型推算得不对时,可能导致一些功能无法正常运行,如Range查询。

常用类型的自动识别规则

类型 规则
字符串 匹配到日期格式,设置成Date。

字符串为数字时,当成字符串处理,但我们设置转换为数字。

其他情况,类型就是Text,并且会增加keyword的子字段
布尔值 Boolean
浮点数 Float
整数 Long
对象 Object
数组 由第一个非空数值的类型决定
空值 忽略

下面是具体推断 demo


  1. # 写入文档,查看 Mapping
  2. PUT mapping_test/_doc/1
  3. {
  4. "firstName": "Chan", -- Text
  5. "lastName": "Jackie", -- Text
  6. "loginDate": "2018-07-24T10:29:48.103Z" -- Date
  7. }
  8. # Dynamic Mapping,推断字段的类型
  9. PUT mapping_test/_doc/1
  10. {
  11. "uid": "123", -- Text
  12. "isVip": false, -- Boolean
  13. "isAdmin": "true", -- Text
  14. "age": 19, -- Long
  15. "heigh": 180 -- Long
  16. }
  17. # 查看 Dynamic Mapping
  18. GET mapping_test/_mapping

能否更改mapping的字段类型

分两种情况:

1、新增加的字段

  • dynamic设为true时,新增字段的文档写入时,Mapping同时被更新
  • dynamic设为false时,Mapping不会被更新,新增字段的数据无法被索引,但是会出现在_source中
  • dynamic设为strict,文档将写入失败

2、已存在的字段,一旦数据被写入,就不再支持修改字段定义

  • Lucene本身的限制
  1. 如果希望更改字段类型,必须Reindex api,即:重建索引。在数据量多的时候,开销将非常大

  1. # dynamic设置为false
  2. PUT idx1
  3. {
  4. "mapping": {
  5. "_doc": {
  6. "dynamic": "false"
  7. }
  8. }
  9. }
  10. # 修改为dynamic为false
  11. PUT idx1/_mapping
  12. {
  13. "dynamic": false
  14. }
  15. # 查看索引
  16. GET idx1/_mapping

dynamic属性和索引字段可变性的规则,我们可以总结如下:

\ true false strict
文档可索引 yes yes no
字段可索引 yes no no
Mapping被更新 yes no no

显式Mapping及常见参数

在本文的上一段落,我们的Mapping都是自动生成的。自动生成机制虽然方便,但是也可能导致一些问题。比如:生成的字段类型不正确,字段的附加属性不满足我们的需求,等等。这时,我们可以通过显式Mapping的方式来解决。

那么,我们如何进行显式Mapping的设置呢?

  1. 参考官网api,纯手写
  2. 为减少工作量,减少出错概率,可如下进行:
    1. 创建一个临时index,写入一些样本数据
    2. 通过访问Mapping API获取该临时文件的动态Mapping定义
    3. 修改后,再使用此配置创建自己的索引
    4. 删除临时索引

我们推荐使用第二种方式,效率高,且不容易出错。

控制当前字段是否被索引———index

index,可用于设置字段是否被索引,默认为true,false即为不可搜索。在下述例子中,mobile字段将不能被搜索到。


  1. # index属性控制 字段是否可以被索引
  2. PUT user_test
  3. {
  4. "mappings": {
  5. "properties": {
  6. "firstName":{
  7. "type": "text"
  8. },
  9. "lastName":{
  10. "type": "text"
  11. },
  12. "mobile" :{
  13. "type": "text",
  14. "index": false
  15. }
  16. }
  17. }
  18. }

常见参数 - index_options

记录索引级别。Text类型默认为positions,其他类型默认为docs。我们需要记住一条准则。

记录的内容越多,占用的存储空间就越大。

索引级别有以下几种,更细节的内容可参考官网

  1. docs
  2. freqs
  3. positions
  4. offsets

null_value设置

需要对Null值实现搜索时使用。只有keyword类型才支持设定null_value


  1. # 设定Null_value
  2. DELETE users
  3. PUT users
  4. {
  5. "mappings" : {
  6. "properties" : {
  7. "firstName" : {
  8. "type" : "text"
  9. },
  10. "lastName" : {
  11. "type" : "text"
  12. },
  13. "mobile" : {
  14. "type" : "keyword",
  15. "null_value": "NULL"
  16. }
  17. }
  18. }
  19. }
  20. PUT users/_doc/1
  21. {
  22. "firstName":"Zhang",
  23. "lastName": "Fubing",
  24. "mobile": null
  25. }
  26. PUT users/_doc/2
  27. {
  28. "firstName":"Zhang",
  29. "lastName": "Fubing2"
  30. }
  31. # 查看结果,有且仅有_id为2的记录
  32. GET users/_search
  33. {
  34. "query": {
  35. "match": {
  36. "mobile":"NULL"
  37. }
  38. }
  39. }

copy_to

这个属性用于将当前字段拷贝到指定字段。

  1. _all在7.x版本已经被copy_to所代替
  2. 可用于满足特定场景
  3. copy_to将字段数值拷贝到目标字段,实现类似_all的作用
  4. copy_to的目标字段不出现在_source中

  1. DELETE user_test
  2. #设置 Copy to
  3. PUT user_test
  4. {
  5. "mappings": {
  6. "properties": {
  7. "firstName":{
  8. "type": "text",
  9. "copy_to": "fullName"
  10. },
  11. "lastName":{
  12. "type": "text",
  13. "copy_to": "fullName"
  14. }
  15. }
  16. }
  17. }
  18. PUT user_test/_doc/1
  19. {
  20. "firstName":"Ruan",
  21. "lastName": "Yiming"
  22. }
  23. POST user_test/_search?q=fullName:(Ruan Yiming)

数组类型

Elasticsearch不提供专门的数组类型。但任何字段,都可以包含多个相同类型的数值。


  1. # 数组类型
  2. PUT users/_doc/1
  3. {
  4. "name":"onebird",
  5. "interests":"reading"
  6. }
  7. PUT users/_doc/1
  8. {
  9. "name":"twobirds",
  10. "interests":["reading","music"]
  11. }
  12. POST users/_search
  13. {
  14. "query": {
  15. "match_all": {}
  16. }
  17. }
  18. # interests字段还是text类型
  19. GET users/_mapping

Elasticsearch7.X 入门学习第五课笔记---- - Mapping设定介绍的更多相关文章

  1. Elasticsearch7.X 入门学习第七课笔记-----Mapping多字段与自定义Analyzer

    原文:Elasticsearch7.X 入门学习第七课笔记-----Mapping多字段与自定义Analyzer 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处 ...

  2. Elasticsearch7.X 入门学习第八课笔记-----索引模板和动态模板

    原文:Elasticsearch7.X 入门学习第八课笔记-----索引模板和动态模板 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接: ...

  3. Elasticsearch7.X 入门学习第四课笔记---- Search API之(Request Body Search 和DSL简介)

    原文:Elasticsearch7.X 入门学习第四课笔记---- Search API之(Request Body Search 和DSL简介) 版权声明:本文为博主原创文章,遵循CC 4.0 BY ...

  4. Elasticsearch7.X 入门学习第三课笔记----search api学习(URI Search)

    原文:Elasticsearch7.X 入门学习第三课笔记----search api学习(URI Search) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出 ...

  5. Es学习第五课, 分词器介绍和中文分词器配置

    上课我们介绍了倒排索引,在里面提到了分词的概念,分词器就是用来分词的. 分词器是ES中专门处理分词的组件,英文为Analyzer,定义为:从一串文本中切分出一个一个的词条,并对每个词条进行标准化.它由 ...

  6. Elasticsearch7.X 入门学习第九课笔记-----聚合分析Aggregation

    原文:Elasticsearch7.X 入门学习第九课笔记-----聚合分析Aggregation 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. ...

  7. Elasticsearch7.X 入门学习第二课笔记----基本api操作和CRUD

    原文:Elasticsearch7.X 入门学习第二课笔记----基本api操作和CRUD 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链 ...

  8. Elasticsearch7.X 入门学习第一课笔记----基本概念

    原文:Elasticsearch7.X 入门学习第一课笔记----基本概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https: ...

  9. python学习第五次笔记

    python学习第五次笔记 列表的缺点 1.列表可以存储大量的数据类型,但是如果数据量大的话,他的查询速度比较慢. 2.列表只能按照顺序存储,数据与数据之间关联性不强 数据类型划分 数据类型:可变数据 ...

随机推荐

  1. font-size:0; 消除空白间隙

    使用font-size:0解决设置inline-block引起的空白间隙问题 一.空白间隙问题 在进行页面布局的时候为了页面代码所谓整洁刻度,往往会设置缩进或是换行,但是元素display为inlin ...

  2. 事物 @Transactional

    转载:http://www.cnblogs.com/kristain/articles/2038397.html 一.什么是事务 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库 ...

  3. cookie、session和会话保持

    1.会话 在程序中,会话跟踪是很重要的事情.理论上,一个已登录用户,在这次登录后进行的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆.例如,用户 A 在 ...

  4. web大文件下载+断点续传

    实现原理(1)首先获得下载文件的长度,然后设置本地文件的长度.(2)根据文件长度和线程数计算每条线程下载的数据长度和下载位置.如:文件的长度为6M,线程数为3,那么,每条线程下载的数据长度为2M,每条 ...

  5. windows10 ubuntu子系统 WSL文件位置

    windows10 的linux子系统(windows subsystem for linux)WSL 文件位置 以我的系统为例,WSL的root目录对应windows的: C:\Users\xiao ...

  6. WinSetupFromUSB - 超简单制作多合一系统安装启动U盘的工具 (支持Win/PE/Linux启动盘)

    很多同学都喜欢将电脑凌乱不堪的系统彻底重装以获得一个"全新的开始",但你会发现如今很多电脑都已经没有光驱了,因此制作一个U盘版的系统安装启动盘备用是非常必要的. 我们之前推荐过 I ...

  7. Redis之Java客户端Jedis

    导读 Redis不仅使用命令客户端来操作,而且可以使用程序客户端操作. 现在基本上主流的语言都有客户端支持,比如Java.C.C#.C++.php.Node.js.Go等. 在官方网站里列一些Java ...

  8. HDU6621 K-th Closest Distance 第 k 小绝对值(主席树(统计范围的数有多少个)+ 二分 || 权值线段树+二分)

    题意:给一个数组,每次给 l ,r, p, k,问区间 [l, r] 的数与 p 作差的绝对值的第 k 小,这个绝对值是多少 分析:首先我们先分析单次查询怎么做: 题目给出的数据与多次查询已经在提示着 ...

  9. WAMPSERVER php

    The Apache service named reported the following error:>>> (OS 10013)An attempt was made to ...

  10. CentOS7 安装Kafka

    关闭防火墙 systemctl stop firewalld.service systemctl disable firewalld.service 安装JDK yum install -y http ...