原文: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. django快速搭建blog

    python版本:3.5.4: Django版本:2.0 创建项目 创建mysite项目和 blog应用: django-admin startproject mysite # 创建mysite项目 ...

  2. 2017乌鲁木齐网络赛 J题 Our Journey of Dalian Ends ( 最小费用最大流 )

    题目链接 题意 : 给出一副图,大连是起点,终点是西安,要求你求出从起点到终点且经过中转点上海的最小花费是多少? 分析 : 最短路是最小费用最大流的一个特例,所以有些包含中转限制或者经过点次数有限制的 ...

  3. Conturbatio

    Conturbatio Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  4. [BZOJ2244]:拦截导弹(DP+CDQ分治+树状数组)

    题目传送门 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度.并且能够拦截任意速度的导弹,但是以后每一发炮弹都不能高于 ...

  5. websocket 无需通过轮询服务器的方式以获得响应 同步在线用户数 上线下线 抓包 3-way-handshake web-linux-shell 开发

    https://code.google.com/archive/p/phpwebsocket/source/default/source The WebSocket API (WebSockets) ...

  6. ScheduledThreadPoolExecutor 源码分析

    ScheduledThreadPoolExecutor ScheduledThreadPoolExecutor 是能够在给定的延时之后.或周期性执行被提交任务的线程池 创建实例 /** * 线程池关闭 ...

  7. Vultr CentOS下后台跑node

    在Mac或者Windows下简直易如反掌.几行命令搞定的事情,但因为使用的是远程SSH连接纯命令行处理,所以需要记录下来怎么弄. 比如, 1. 怎么在什么都没有的CentOS里下载Node安装包? 2 ...

  8. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_9_字节输入流读取字节数据

    硬盘读取到内存   read值会读一个字节 a.txt里面a变成整数就是97   读取到末尾,返回-1 再读一次还是-1 读取的代码是重复的.可以使用循环去读取.while循环. 转行成char类型的 ...

  9. Week3 - 397. Integer Replacement

    Week3 - 397. Integer Replacement 397.Integer Replacement - Medium Given a positive integer n and you ...

  10. 修改JAVA_HOME失效

    在修改JDK的安装目录的情况下会出现失效的时候,因为jdk在安装的时候自己在path中添加了 C:\ProgramData\Oracle\Java\javapath 这个路径. 解决: 删除 path ...