ElasticSearch-Mapping

一、什么是Mapping

  • Mapping类似数据库中的schema的定义,作用如下
    • 定义索引中的字段的名称
    • 定义字段的数据类型,例如字符串,数字,布尔..
    • 字段的索引设置
    • 字段的分词器设置
  • Mapping会把JSON文档映射成Lucene所需要的扁平格式

字段的数据类型

  • 简单类型
    • Text/Keyword
    • Date
    • Integer/Floating/long
    • Boolean
    • IPv4 & IPv6
  • 复杂类型
    • 对象类型
    • 嵌套类型
  • 特殊类型
    • 地理坐标

 

二、什么是Dynamic Mapping

  • 在写入文档的时候,如果索引不存在会自动创建索引
  • Dynamic Mapping的机制,使得我们无需手动定义Mappings,Elasticsearch会自动根据文档信息,推算出字段的类型
  • 但是有时候会推算得不对,例如地理位置信息
  • 当类型如果设置不对时,会导致一些功能无法正常运行,例如Range查询

自动推到数据类型会出现的特殊情况:

  • 数字用引号,默认当TEXT
  • 日期格式会推导成Date
  • 有一些类型会推导出错,例如地理位置信息

 

三、能否更改Mapping的字段类型

  • 两种情况
    • 新增加字段
      • Dynamic设为true时,一旦有新增字段的文档写入,Mapping也同时被更新
      • Dynamic设为false时,Mapping不会被更新,新增字段的数据无法被索引,但是信息会出现在_source中(即新增字段成功被索引进es)
      • Dynamic设置成Strict,文档写入失败
    • 对已有字段,一旦已经有数据写入,就不会支持修改字段定义
      • Lucene实现的倒排索引,一旦生效后,就不允许修改
    • 如果希望修改字段类型,必须用Reindex API 重建索引
  • 修改已存在字段需Reindex原因
    • 如果修改了字段的数据类型,会导致已被索引的数据无法被搜索
    • 如果是增加新的字段,就不会有这样的影响

为什么修改了字段的数据类型,会导致已被索引的数据无法被索引?

 

 

 

四、显示Mapping设置与常见参数介绍

  • index:控制当前字段是否被索引。默认为true,如果设置成false,改字段不可被搜索

Index Options

  • 四种不同级别的Index Options配置,可以控制倒排索引记录的内容
    • docs:记录doc id
    • freqs(出现频率):记录doc id和term frequencies
    • postions: 记录doc id/ term frequencies/ term position
    • offsets: 记录doc id/ term frequencies/ term position/ character offsets
  • Text类型默认记录postions,其它默认为docs
  • 记录内容越多,占用存储空间越大
  • Elasticsearch中不提供专门的数组类型。但是任何字段,都可以包含多个相同类型的数值

 

  • 多字段特性
    • 如某个text类型的字段要实现精确匹配
      • 增加一个keyword字段
    • 使用不同的analyzer
      • 不同语言
      • pinyin字段的搜索
      • 还支持为搜索和索引指定不同的analyzer

 

五、Exact Values & Full Text

  • Exact Value:包括数字、日期、具体一个字符串
    • Elasticsearch中的keyword
  • 全文本,非结构化的文本数据
    • Elasticsearch中的text
  • keyword不需要做分词处理

 

posted @ 2020-10-29 14:17  下山打老虎i  阅读(92)  评论(0)    收藏  举报