原文: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. 使用distinct消除重复记录的同时又能选取多个字段值

    需求是:我要消除name字段值重复的记录,同时又要得到id字段的值,其中id是自增字段. select distinct name from t1 能消除重复记录,但只能取一个字段,现在要同时取id, ...

  2. webstorm主题更换和webstorm汉化

    主题更换方式一 主题类型:*.jar 在webstorm程序中选择 : 菜单栏 File -> Setting ->Import Settings  选中下载的.jar文件 主题更换方式二 ...

  3. 【PowerOJ1752&网络流24题】运输问题(费用流)

    题意: 思路: [问题分析] 费用流问题. [建模方法] 把所有仓库看做二分图中顶点Xi,所有零售商店看做二分图中顶点Yi,建立附加源S汇T. 1.从S向每个Xi连一条容量为仓库中货物数量ai,费用为 ...

  4. Gradle教程-w3cschool

    Gradle,这是一个基于 JVM 的富有突破性构建工具.Gradle 正迅速成为许多开源项目和前沿企业构建系统的选择,同时也在挑战遗留的自动化构建项目.本教程主要讲解了如何使用 Gradle 构建系 ...

  5. 重新理解了重定向,利用重定向可以防止用户重复提交表单(兼谈springmvc重定向操作)

    自己用springmvc框架有一段时间了,但是都还一直分不清楚什么时候应该用转发,什么时候应该用重定向.可能用转发的情形太多了,以致于自己都忘记了还有重定向. 当用户提交post请求之后,刷新页面就会 ...

  6. icon组件

    iocn组件,小程序给我们提供了一些小图标,与微信的风格一致 iocn组件的属性: type:类型:string icon的类型: 属性值:success:成功   带背景的 success_no_c ...

  7. windows 2008 gpt

    新服务器,4T硬盘,U盘安装Windows Server 2008 R2. 把2008的镜像用UltraISO写入U盘. 安装到分区那块,主分区200G,剩余分区系统自动给分为: 2T + 剩余 两块 ...

  8. chrome flash 自动暂停问题

    chrome flash 尺寸小于398*298时,只要宽和高某一个值小于对应值就会自动暂停,出现这个圆形的播放按钮.(估计是当广告处理了...) 将尺寸调大即可.

  9. 关于openGL、GPUImage、ios直播相关不错的博客

    http://www.jianshu.com/users/815d10a4bdce/latest_articles

  10. React Native商城项目实战10 - 个人中心中间内容设置

    1.新建一个MineMiddleView.js,专门用于构建中间的内容 /** * 个人中心中间内容设置 */ import React, { Component } from 'react'; im ...