Elasticseach Mapping

258 阅读4分钟

1. 什么是mapping

  • mapping 类似数据库中的schema的定义,作用如下

    • 定义索引中字段的名称

    • 定义字段的类型,例如字符串,数字,布尔...

    • 字段,倒排索引的相关配置,(analyzed or not analyzed,analyzer)

  • mapping会把json文档映射成Lucene所需要的扁平格式

    • 一个mapping 属于一个索引的type

    • 一个type有一个mapping定义

    • 7.0开始,不需要在mapping中指定type的信息

  • 查看mapping 信息

    • GET movies/_mappings

2. mapping中字段类型

  • 简单类型

    • Text/Keyword

    • Date

    • Integer/Floating

    • Boolean

    • Ipv4/Ipv6

  • 复杂类型-对象和嵌套对象

    • 对象类型/嵌套类型
  • 特殊类型

    • geo_point & geo_shape / percolator (地理信息)

3. 什么是dynamic mapping

  • 在写入文档时,如果索引不存在,会自动创建索引

  • dynamic mapping 的机制,使得我们无需手动创建mappings,es会根据文档信息,推算出字段的类型

  • 有时候推算的不对,比如地理位置

  • 当类型设置不对时,会导致一些功能无法使用,比如range查询

4. 能否修改mapping类型

  • 两种情况
    • 新增加字段

      • 当dynamic 设为true时,一旦有新增字段的文档写入时,mapping也同时被更新

      • 当dynamic 设为false时,mapping不会被更新,新增字段的数据无法被索引,但是信息会出现在_source中

      • 当dynamic设为strict时,文档写入失败

    • 对已有字段,一旦有数据写入,就不在支持修改字段定义

      • lucene 实现的倒排索引,一旦生成后,就不允许呗修改
    • 如果希望改变字段类型,必须reindex api,重建索引

  • 原因
    • 如果修改了字段的数据类型,会导致被索引的数据无法被搜索

    • 但是是如果新增加的字段,就不会有这样的影响

image.png

  1. mapping参数的设置
  • 控制当前字段是否被索引,默认是true,如果设置为false,则不可被索引"name":{"type":"text","index":false}

  • 四种不同级别的 index options配置,可以控制倒排索引记录的内容

    • docs -记录文档id

    • freqs -记录文档id 和term frequencies

    • positions -记录文档id/ term frequencies/ term position

    • offsets -记录文档id/ term freqencies/ term position /character offects

    • Text 类型默认positions,其他默认为docs

    • 记录内容越多,占用存储空间越大

  • null_value

    • 需要对null值实现搜索

    • 只有keyword类型支持设定 Null_Value

    • "name":{"type":"keyword","null_value":"NULL"}

  • copy_to 设置

    • _all 在7中已被copy_to所代替

    • 满足一些特定的搜索需求

    • copy_to将字段的数值copy到目标字段,实现类似_all的作用

    • copy_to的目标字段不会出现在_source中

      • "firstName":{"type":"text","copy_to":"fullName"}

      • "lastName":{"type":"text","copy_to":"fullName"}

      • GET users/_serach?q=fullName:(sun jianlei)

  • 数组类型

    • es中不提供专门的数组类型,但是任何字段都可以包含多个相同类型的数据

6. index template

  • index template-帮助你设定mappings和settings,并按照一定的规则,自动匹配到新建的索引之上

    • 模板仅在一个索引被新创建时,才会产生作用。修改模板不会影响已创建的索引。

    • 可以设定多个索引模板,这些设置会被“merge”到一起

    • 可以指定“order” 的数值,控制“merging” 过程

  • PUT _template/template_default {"index_patterns":["*"],"order":0,"version":1,"settings":{ "number_of_shards":1,"number_of_replicas":1, "mappings":{"date_detection":false,"numeric_detection":true} }}---转换日期为false,转换为int为true

  • 查看template信息

    • GET /_template/template_default

    • GET /_template/temp*

    • GET testtemplate/_mapping

    • GET testtemplate/_setting

7. dynamic template

  • 根据es识别数据类型,结合字段名称,来动态设定字段类型

    • 所有字符串类型都设定为keyword,或者关闭keyword字段

    • is开头的字段都设置成boolean

    • long_开头的都设置成long类型

image.png

8. 什么是聚合(aggregation)

  • es除搜索以外,提供的针对es数据进行统计分析的功能

    • 实时性高

    • hadoop(T+1)

  • 通过聚合,我们会得到一个数据的概览,是分析和总结全套的数据,而不是寻找单个文档

    • 尖沙咀和香港岛的客房数量

    • 不同的价格区间,可预订的经济型酒店和五星级酒店的数量

  • 高性能,只需要一个语句,就可以从es中得到分析结果

    • 无需在客户端自己实现逻辑去分析

9. 集合的分类

  • bucket aggergation -一些列满足特定条件 文档的集合,相当于group

  • metric aggergation -一些数学运算,可以对文档字段进行统计分析,可以算出最大值,最小值和平均值,相当于count

  • pipeline aggergation -对其它聚合结果进行二次聚合

  • matrix aggergation -支持多个字段的操作并提供一个结果矩阵

image.png

image.png

image.png