松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程
ElasticSearch 系列第十一篇,和大家聊一聊索引的基本操作,前十篇传送门:
- 
打算出一个 ElasticSearch 教程,谁赞成,谁反对? 
 
- 
ElasticSearch 从安装开始 
 
- 
ElasticSearch 第三弹,核心概念介绍 
 
- 
ElasticSearch 中的中文分词器该怎么玩? 
 
- 
ElasticSearch 索引基本操作 
 
- 
ElasticSearch 文档的添加、获取以及更新 
 
- 
ElasticSearch 文档的删除和批量操作 
 
- 
ElasticSearch 文档路由,你的数据到底存在哪一个分片上? 
 
- 
ElasticSearch 并发的处理方式:锁和版本控制 
 
- 
ElasticSearch 中的倒排索引到底是什么? 
 
以下是视频笔记:
注意,笔记只是视频内容的一个简要记录,因此笔记内容比较简单,完整的内容可以查看视频。
映射就是 Mapping,它用来定义一个文档以及文档所包含的字段该如何被存储和索引。所以,它其实有点类似于关系型数据库中表的定义。
9.1 映射分类
动态映射
顾名思义,就是自动创建出来的映射。es 根据存入的文档,自动分析出来文档中字段的类型以及存储方式,这种就是动态映射。
举一个简单例子,新建一个索引,然后查看索引信息:

在创建好的索引信息中,可以看到,mappings 为空,这个 mappings 中保存的就是映射信息。
现在我们向索引中添加一个文档,如下:
PUT blog/_doc/1
{
  "title":"1111",
  "date":"2020-11-11"
}
文档添加成功后,就会自动生成 Mappings:

可以看到,date 字段的类型为 date,title 的类型有两个,text 和 keyword。
默认情况下,文档中如果新增了字段,mappings 中也会自动新增进来。
有的时候,如果希望新增字段时,能够抛出异常来提醒开发者,这个可以通过 mappings 中 dynamic 属性来配置。
dynamic 属性有三种取值:
- 
true,默认即此。自动添加新字段。 
 
- 
false,忽略新字段。 
 
- 
strict,严格模式,发现新字段会抛出异常。 
 
具体配置方式如下,创建索引时指定 mappings(这其实就是静态映射):
PUT blog
{
  "mappings": {
    "dynamic":"strict",
    "properties": {
      "title":{
        "type": "text"
      },
      "age":{
        "type":"long"
      }
    }
  }
}
然后向 blog 中索引中添加数据:
PUT blog/_doc/2
{
  "title":"1111",
  "date":"2020-11-11",
  "age":99
}
在添加的文档中,多出了一个 date 字段,而该字段没有预定义,所以这个添加操作就回报错:
{
  "error" : {
    "root_cause" : [
      {
        "type" : "strict_dynamic_mapping_exception",
        "reason" : "mapping set to strict, dynamic introduction of [date] within [_doc] is not allowed"
      }
    ],
    "type" : "strict_dynamic_mapping_exception",
    "reason" : "mapping set to strict, dynamic introduction of [date] within [_doc] is not allowed"
  },
  "status" : 400
}
动态映射还有一个日期检测的问题。
例如新建一个索引,然后添加一个含有日期的文档,如下:
PUT blog/_doc/1
{
  "remark":"2020-11-11"
}
添加成功后,remark 字段会被推断是一个日期类型。

此时,remark 字段就无法存储其他类型了。
PUT blog/_doc/1
{
  "remark":"javaboy"
}
此时报错如下:
{
  "error" : {
    "root_cause" : [
      {
        "type" : "mapper_parsing_exception",
        "reason" : "failed to parse field [remark] of type [date] in document with id '1'. Preview of field's value: 'javaboy'"
      }
    ],
    "type" : "mapper_parsing_exception",
    "reason" : "failed to parse field [remark] of type [date] in document with id '1'. Preview of field's value: 'javaboy'",
    "caused_by" : {
      "type" : "illegal_argument_exception",
      "reason" : "failed to parse date field [javaboy] with format [strict_date_optional_time||epoch_millis]",
      "caused_by" : {
        "type" : "date_time_parse_exception",
        "reason" : "Failed to parse with all enclosed parsers"
      }
    }
  },
  "status" : 400
}
要解决这个问题,可以使用静态映射,即在索引定义时,将 remark 指定为 text 类型。也可以关闭日期检测。
PUT blog
{
  "mappings": {
    "date_detection": false
  }
}
此时日期类型就回当成文本来处理。
静态映射
略。
9.2 类型推断
es 中动态映射类型推断方式如下:

精彩文章推荐:

喜欢就点个"在看"呗^_^
本文分享自微信公众号 - 江南一点雨(a_javaboy)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
 
                             
                         
                            