Elasticsearch mapping 概念及自动创建示例

 更新时间:2022年11月04日 10:29:26   作者:AskaJohnny  
这篇文章主要为大家介绍了Elasticsearch mapping 概念及自动创建示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

本篇主要介绍一下 Elasticsearch mapping 的概念, 它是什么 以及如何自定义它, 并且再介绍一下 dynamic 的机制

如果把 Elasticsearch中的mapping 对比到 mysql 中 就是 mysql中的 表的 scheme , 就是表的定义结构,

正常在 关系型数据库mysql中 需要先把表的scheme 定义好 再插入数据, 并且 你无法插入未在scheme 中定义的字段 , 而 es 中 可以在你未给索引定义 mapping 的时候 自动帮你创建 mapping , 并且你也可以通过 dynamic 来控制是否允许灵活动态的 添加 mapping中的属性

1.什么是Mapping

Mapping 类似 mysql 中的 schema 的定义,就是定义索引属性字段的

  • 定义索引中字段的名称
  • 定义索引中字段的数据类型 , 如 text , long , keyword....
  • 定义索引中字段的的倒排索引相关配置 ( Analyzer...)

一个Mapping 属于一个索引的Type

  • 每个文档都属于一个Type
  • 一个Type有一个Mapping 定义
  • es7.0开始, 在Mapping中不需要指定 Type信息, 因为7.0之后只有_doc Type

2.es 自动创建mapping

当我们去创建一个 索引的时候 未指定 mapping , es会默认帮这个索引创建一个 mapping

创建一个 索引并且索引一条数据

PUT blog/_doc/1
{
  "name": "es mapping",
  "type": "es",
  "desc": "es mapping desc",
  "author": "johnny",
  "word_count": 50,
  "create_time": "2022-10-31"
}
GET blog/_mapping  # 查看一个 es自动生成的 mapping

从上面可以看出来 属性都被es 自动创建了 对应的mapping , 包括每个属性的type类型等, 那它为什么会这样转化的,什么时候是 text, 什么时候是 long 下面就来介绍 es 中mapping 的 类型自动识别

3. mapping 类型自动识别

JSON类型Elasticsearch 类型
字符串1.匹配日期格式 会设置成Date 
2.匹配数字 设置成 float 或者 long ,该选项默认关闭的 
3.设置成Text , 并且添加 keyword 子字段
整数long
浮点数float
布尔值boolean
对象object
数组由第一个非空数值的类型所定义 .如 ["jack","johnny"] 则类型为 Text
空值忽略 ??? 
我实验的版本里7.18 , 如果设置null 会被自动定义为Text , 具体不太清楚

4. 自定义创建mapping

除了上面的介绍的 es 自动创建 mapping 外, 还可以自定义 索引的mapping , 更加灵活和符合业务需求等等.

注意以前的版本需要在 mappings 下面还有一层 type , 如 mappings: { "_doc" : { "properties" : {xxx} }} 但是7.0之后 type就不需要了

PUT blog_info
{
  "mappings": {
      "properties": {
        "blog_name": {
          "type": "keyword"
        },
        "blog_desc": {
          "type": "text"
        },
        "blog_word_count": {
          "type": "long"
        },
        "create_time": {
          "type": "date"
        }
      }
    }
}

其中text和keyword类型,text类型的字段在新增或修改文档时会自动分词, 而keyword 不会,它会保存插入的原始文本

索引一条数据

PUT blog_info/_doc/1
{
  "blog_name": "es mapping",
  "blog_desc": "es mapping desc",
  "blog_word_count": 12,
  "blog_auther": "johnny",
  "create_time": "2022-10-31"
}

5. mapping 属性设置analyzer 分词器

默认分词器 standard , 它会把中文一个个拆开,肯定是不适合的,如果是索引中文的信息, 需要设置字段的分词器

PUT blog_info
{
  "mappings": {
      "properties": {
        "blog_desc": {
          "type": "text",
          "analyzer": "ik_smart" //设置这个字段的分词器 
        }
      }
    }
}

大部分分词器是需要以es 中插件的方式 安装的 ,后续会出一篇专门的 analyzer 分词器

6. mapping 属性设置 boost 权重

在es搜索的时候 会有一个相关性算分的过程 , 如果不设置 每个字段的默认boost 权重为1.0 , 如果希望加大 按照广告投放金额的分 那么可以设置boost 以提高搜索 自然就排在前面了

PUT blog_info
{
  "mappings": {
      "properties": {
        "put_amount": {
          "type": "text",
          "boost": "5" 
        }
      }
    }
}

7. mapping 属性设置 copy_to

该属性允许多个字段 copy 到指定的字段, 可以进行搜索这个字段,但是_source 中是不显示的

PUT peope
{
  "mappings": {
    "properties": {
      "first_name": {
        "type": "text",
        "copy_to": "full_name"
      },
      "last_name":{
        "type": "text",
        "copy_to": "full_name" // copy_to 指定字段
      },
      "full_name":{
        "type": "text"
      }
    }
  }
}
GET peope/_search?q=full_name:johnny  //使用 full_name 去搜索
//可以看到 并没有 full_name 的返回 但是可以通过它去搜索
"_source" : {
   "first_name" : "johnny",
   "last_name" : "qiang"
}

8. mapping 属性设置 index

通过给 属性设置 index 来控制该 字段是否 参与 索引, 默认 true , 如果index 设置为false 那么 不能记录索引 并且不可以搜索

PUT peope
{
  "mappings": {
    "properties": {
      "first_name": {
        "type": "text",
        "index": false //设置 index false
      },
      "last_name":{
        "type": "text"
      }
    }
  }
}
POST peope/_doc
{
  "first_name": "johnny is good name",
  "last_name": "qiang"
}

注意 url-search 搜不到但是不报错, 而 requestbody 查询 index false 的字段 会报错

GET peope/_search?q=first_name:johnny //搜索不到数据 因为 
//"hits" : [ ] 
GET peope/_search?q=last_name:johnny // 可以看到由于 last_name 默认index 了 所以可以搜索到
//    "hits" : [
//      {
//        "_index" : "peope",
//        "_type" : "_doc",
//        "_id" : "vobiMYQB4x9Wk60f2F21",
//        "_score" : 0.2876821,
//        "_source" : {
//          "first_name" : "johnny is good name",
//          "last_name" : "johnny is good name"
//        }
//      }
//    ]
GET peope/_search
{
  "query": {
    "match": {
      "first_name": "johnny"
    }
  }
}
// 抛错400 Cannot search on field [first_name] since it is not indexed.

9. mapping 设置 属性 null_value 默认值

null_value:当字段遇到null值时候的处理策略(字段为null时候是不能被搜索的,也就是说,text类型的字段不能使用该属性,可以使用在keyword 字段上),设置该值后可以用你设置的值替换null值,这点可类比mysql中的"default"设置默认值, 但是也有点不一样, 后续就可以使用你设置的这个 null_value 去搜索, 但是检索出来的数据_source 中 还是展示 null

PUT peope
{
  "mappings": {
    "properties": {
      "first_name": {
        "type": "keyword",
        "null_value": "default" // 设置当 文档的first_name 字段为null时候 转成default 去创建倒排索引
      },
      "last_name":{
        "type": "text"
      }
    }
  }
}
POST peope/_doc
{
  "first_name": null, //设置null值
  "last_name": "johnny is good name",
  "full_name": "johnny is good name"
}
GET peope/_search?q=first_name:default //根据 null_value 设置的值去搜索,查询出来还是原来的null
// {
//        "_index" : "peope",
//        "_type" : "_doc",
//        "_id" : "xob-MYQB4x9Wk60fVF1_",
//        "_score" : 0.2876821,
//        "_source" : {
//          "first_name" : null,  
//          "last_name" : "johnny is good name",
//          "full_name" : "johnny is good name"
//        }
// }

10. mapping 设置 dynamic

dynamic 是否允许动态新增字段

  • true : 允许动态新增字段 同时mapping 被更新 文档可被索引
  • false: 不允许动态新增字段 , mapping 不会被更新, 字段不能被索引, 但是数据可以入库并且信息会出现在 _source 中
  • strict : 不允许写入, 直接报错

对于已经存在的字段 一旦又数据写入,就不能进行修改字段定义了,因为 底层Lucene不允许修改, 如果希望修改字段类型,必须 reindex 重建索引

10.1 dynamic false

PUT peope
{
  "mappings": {
    "dynamic": false, // 设置在索引上的 而不是对应的字段上的 
    "properties": {
      "first_name": {
        "type": "text"
      },
      "last_name":{
        "type": "text"
      }
    }
  }
}
POST peope/_doc //dynamic false 可以入库文档数据
{
  "first_name": "johnny is good name",
  "last_name": "johnny is good name",
  "full_name": "johnny is good name"
}
GET peope/_search?q=full_name:johnny //尝试通过 新增的字段去搜索
// "hits" : [ ]
GET peope/_search?q=first_name:johnny // 可以搜到数据, 并且_source 中可以看到新增的字段
//
//    "hits" : [
//      {
//        "_index" : "peope",
//        "_type" : "_doc",
//        "_id" : "vobiMYQB4x9Wk60f2F21",
//        "_score" : 0.2876821,
//        "_source" : {
//          "first_name" : "johnny is good name",
//          "last_name" : "johnny is good name",
//          "full_name" : "johnny is good name" 
//        }
//      }
//    ]

10.2 dynamic strict

strict : 严格模式 , 不允许 动态新增字段的

PUT peope
{
  "mappings": {
    "dynamic": "strict",
    "properties": {
      "first_name": {
        "type": "text"
      },
      "last_name":{
        "type": "text"
      }
    }
  }
}
POST peope/_doc //直接抛错
{
  "first_name": "johnny is good name",
  "last_name": "johnny is good name",
  "full_name": "johnny is good name"
}
// 400 mapping set to strict, dynamic introduction of [full_name] within [_doc] is not allowed

总结

本篇非常详细介绍了 Elasticsearch中 mapping , 介绍了mapping它是什么, 自动创建mapping的机制 , 自定义mapping 中各种参数设置. 一起来学习巩固吧.

以上就是Elasticsearch mapping 概念及自动创建示例的详细内容,更多关于Elasticsearch mapping自动创建的资料请关注脚本之家其它相关文章!

相关文章

  • idea中JRebel不生效问题及解决方案

    idea中JRebel不生效问题及解决方案

    这篇文章主要介绍了idea中JRebel不生效问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • java面向国际化项目开发需遵循的命名规范

    java面向国际化项目开发需遵循的命名规范

    这篇文章主要为大家介绍了在参与开发国际化项目时需遵循的java命名规范,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • JAVA熔断和降级真实关系的图文详解

    JAVA熔断和降级真实关系的图文详解

    这篇文章主要介绍了Java熔断和降级的关系,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • java代码规范之不合理命名与重复代码示例详解

    java代码规范之不合理命名与重复代码示例详解

    这篇文章主要为大家介绍了java代码规范之不合理命名与重复代码示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • MyEclipse+Tomcat配置详解(图文)

    MyEclipse+Tomcat配置详解(图文)

    这篇文章主要介绍了MyEclipse+Tomcat配置详解(图文),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Spring Boot如何实现定时任务的动态增删启停详解

    Spring Boot如何实现定时任务的动态增删启停详解

    这篇文章主要给大家介绍了关于Spring Boot如何实现定时任务的动态增删启停的相关资料,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07
  • Java反射机制概念、原理与用法总结

    Java反射机制概念、原理与用法总结

    这篇文章主要介绍了Java反射机制概念、原理与用法,较为详细的分析了java反射机制的概念、原理,并结合实例形式总结分析了java反射机制的具体使用方法与相关注意事项,需要的朋友可以参考下
    2017-11-11
  • SpringMVC中ModelAndView用法小结

    SpringMVC中ModelAndView用法小结

    本文主要介绍了SpringMVC中ModelAndView用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • spring boot配合前端实现跨域请求访问

    spring boot配合前端实现跨域请求访问

    本篇文章主要介绍了spring boot配合前端实现跨域请求访问,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Mybatis中注解@MapKey的使用详解

    Mybatis中注解@MapKey的使用详解

    mybatis的原身是ibatis,现在已经脱离了apache基金会。这篇文章主要介绍了Mybatis中注解@MapKey的使用的相关资料,需要的朋友可以参考下
    2016-10-10

最新评论