Elasticsearch mapping 概念及自动创建示例

目录
  • 正文
  • 1.什么是Mapping
  • 2.es 自动创建mapping
  • 3. mapping 类型自动识别
  • 4. 自定义创建mapping
  • 5. mapping 属性设置analyzer 分词器
  • 6. mapping 属性设置 boost 权重
  • 7. mapping 属性设置 copy_to
  • 8. mapping 属性设置 index
  • 9. mapping 设置 属性 null_value 默认值
  • 10. mapping 设置 dynamic
    • 10.1 dynamic false
    • 10.2 dynamic strict
  • 总结

正文

本篇主要介绍一下 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自动创建的资料请关注我们其它相关文章!

(0)

相关推荐

  • ElasticSearch事件查询语言EQL操作

    目录 前述 EQL优点 基础语法 数据准备 数据窗口搜索 统计符合条件的事件 事件序列 安全检测 数据准备 获取regsvr32事件的计数 检查命令行参数 检查恶意脚本加载 检查攻击成功可能性 前述 EQL 的全名是 Event Query Language (EQL).事件查询语言(EQL)是一种用于基于事件的时间序列数据(例如日志,指标和跟踪)的查询语言.在 Elastic Security 平台上,当输入有效的 EQL 时,查询会在数据节点上编译,执行查询并返回结果.这一切都快速.并行地发

  • ElasticSearch写入流程实例解析

    目录 一.前言 二.lucence写 2.1 增删改 2.2. 并发模型 2.2.1. 基本操作 2.2.2 更新 2.2.3 删除 2.2.4 flush和commit 2.2.5 merge 小结 三. ElasticSearch的写 3.1. 宏观看ElasticSearch请求 3.2. 详细流程 3.2.1 协调节点内部流程 3.2.2 主分片节点流程* 3.2.3 副本分片节点流程8 四.总结 一.前言 介绍我们在前面已经知道ElasticSearch底层的写入是基于lucence依

  • Elasticsearch Join字段类型简单快速上手教程

    目录 概述 父子关系的限制 Global ordinals 父子文档 总结 阅读本文需要一定的Elasticsearch基础哦,本文深度有,但是不深 概述 Elasticsearch中Join数据类型的字段相信大家也都用过,也就是口中常谈的父子文档.在Elasticsearch中Join不能跨索引和分片,所以保存文档信息时要保证父子文档使用相同的路由参数来保证父文档与子文档保存在同一个索引的同一个分片,那么都有哪些限制呢? 父子关系的限制 每个索引中只能有一个关系字段 父文档与子文档必须在同一个

  • RediSearch加RedisJSON大于Elasticsearch的搜索存储引擎

    目录 RedisMod简介 安装 RediSearch 对比Elasticsearch 索引能力 查询能力 总结 RedisMod简介 Redis是开发中非常常用的内存数据存储中间件,之前基本上用它来做内存存储使用.最近发现Redis推出了很多增强模块,例如通过RedisJSON可以支持原生JSON对象的存储,使用RediSearch可以作为搜索引擎使用,并且支持中文搜索!今天给大家带来RediSearch+RedisJSON作为搜索引擎的使用实践,希望对大家有所帮助! SpringBoot实战

  • Elasticsearch Analyzer 内置分词器使用示例详解

    目录 前置知识 1.Analyzer 2.Elasticsearch 内置分词器 3. Standard Analyzer 3.1 Definition 3.2 Configuration 3.3 实验 4. Simple Analyzer 4.1 Definition 4.2 Configuation 4.3 实验 5. Stop Analyzer 5.1 Definition 5.2 Configuration 5.3 实验 6. Whitespace Analyzer 6.1 Defini

  • 详解如何查看Elasticsearch的Debug日志

    目录 正文 源码分析 apply setting 代码 正文 当我们遇到问题或者需要深入了解 Elasticsearch 的运行机制时,调整日志等级( logging level )到更详细的级别,比如 DEBUG.TRACE ,会是一个有效且必须要掌握的方法. Elasticsearch 提供了如下的接口来支持动态变更 logging level,logger 后面是 package name 或者 class name. PUT _cluster/settings { "persistent

  • Elasticsearch mapping 概念及自动创建示例

    目录 正文 1.什么是Mapping 2.es 自动创建mapping 3. mapping 类型自动识别 4. 自定义创建mapping 5. mapping 属性设置analyzer 分词器 6. mapping 属性设置 boost 权重 7. mapping 属性设置 copy_to 8. mapping 属性设置 index 9. mapping 设置 属性 null_value 默认值 10. mapping 设置 dynamic 10.1 dynamic false 10.2 dy

  • 详解MyBatis Generator自动创建代码(dao,mapping,poji)

    连接的数据库为SQL server2008,所以需要的文件为sqljdbc4.jar 使用的lib库有: 在lib库目录下新建一个src文件夹用来存放生成的文件,然后新建generatorConfig.xml 里面代码为: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis G

  • mysql 设置自动创建时间及修改时间的方法示例

    本文实例讲述了mysql 设置自动创建时间及修改时间的方法.分享给大家供大家参考,具体如下: 第一种,通过ddl进行定义 CREATE TABLE `course` ( `course` varchar(255) DEFAULT NULL, `user` varchar(255) DEFAULT NULL, `score` int(11) DEFAULT NULL, `id` int(11) NOT NULL AUTO_INCREMENT, `create_time` datetime DEFA

  • PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例

    本文实例讲述了PHP检查文件是否存在,不存在自动创建及读取文件内容操作.分享给大家供大家参考,具体如下: <?php $filename = 'a/b.html'; $writetext = 'ssssssssssss'; $result = jwritefile($filename, $writetext); var_dump($result);die; function jwritefile($filename, $writetext) { $position = strrpos($file

  • Elasticsearch的删除映射类型操作示例

    目录 一 前言 二 什么是映射类型? 三 为什么要删除映射类型? 四 映射类型的替代方法 4.1 将映射类型分开存储在索引中 4.2 自定义类型字段回到顶部 五 没有映射类型的父/子 六 删除映射类型的计划 七将多类型索引迁移到单一类型 7.1 每种文档类型的索引 7.2 自定义类型字段 八 总结 一 前言 官方解释:https://www.elastic.co/guide/en/elasticsearch/reference/6.0/removal-of-types.html 在elastic

  • Elasticsearch在应用中常见错误示例解析

    目录 一 read_only_allow_delete" : "true" 二 illegal_argument_exception 三 Result window is too large 一 read_only_allow_delete" : "true" 当我们在向某个索引添加一条数据的时候,可能(极少情况)会碰到下面的报错: { "error": { "root_cause": [ { "

  • Elasticsearch聚合查询及排序操作示例

    目录 1 es排序 2 match和match的区别 3 分页查询 4 es 组合查询 5 结果过滤展示字端 6 结果高亮展示 7 聚合查询avg.max.min.sum.分组 8 mapping和_template模版 9 ik分词 10 term和match的区别 1 es排序 # 1 排序 GET jeff/doc/_search { "query": { "match": { "from": "gu" } }, &qu

  • C#实现通过模板自动创建Word文档的方法

    本文实例讲述了C#实现通过模板自动创建Word文档的方法,是非常实用的技巧.分享给大家供大家参考.具体实现方法如下: 引言:前段时间有项目要用c#生成Word格式的计算报告,通过网络查找到很多内容,但是都很凌乱,于是自己决定将具体的步骤总结整理出来,以便于更好的交流和以后相似问题可以迅速的解决! 现通过具体的示例演示具体的步骤:   第一步,制作模板   1.新建一个文档,设置文档内容. 2.在相应位置插入书签:将鼠标定位到要插入书签的位置,点击"插入">"书签&quo

  • java数据结构之树基本概念解析及代码示例

    Java中树的存储结构实现 一.树 树与线性表.栈.队列等线性结构不同,树是一...节点与节点之间的父子关系,可以为每个节点增加一个parent域,用以记录该节点的父点 树是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点组成一个具有层次关系的集合.把 它叫做"树"是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的. 树定义和基本术语 定义 树(Tree)是n(n≥0)个结点的有限集T,并且当

  • 使用python脚本自动创建pip.ini配置文件代码实例

    这篇文章主要介绍了使用python脚本自动创建pip.ini配置文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 运行一下python代码自动创建pip/pip.ini文件并添加pip源 """ python建立pip.ini.py 2016年4月30日 03:35:11 codegay """ import os ini="""[global] inde

随机推荐