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

时间:2019-09-30
本文章向大家介绍Elasticsearch7.X 入门学习第五课笔记---- - Mapping设定介绍,主要包括Elasticsearch7.X 入门学习第五课笔记---- - Mapping设定介绍使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
原文:Elasticsearch7.X 入门学习第五课笔记---- - Mapping设定介绍

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_36697880/article/details/100660867

         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. # 修改为dynamicfalse
  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

 

原文地址:https://www.cnblogs.com/lonelyxmas/p/11612454.html