Fork me on GitHub

Elasticsearch中Mapping总结

目录

  • 背景
  • 第一部分 版本升级指引
  • 第二部分 升级方法和具体步骤
  • 总结
  • 参考文献及资料

背景

第一部分 Mapping

Mapping在Elasticsearch中作用类似于传统数据库中的表结构定义(schema),即Index的元数据信息。主要作用有:

  • 定义索引(Index)中字段名称;
  • 定义字段的数据类型;
  • 定义倒排索引的配置;

Elasticsearch 7.x版本前,单个index中支持多个type。每个index都会对应有自己的mapping。这时候index可以类比关系型数据库中库,而不同type类比库中表。

在索引中定义太多字段可能会导致索引膨胀,出现内存不足和难以恢复的情况,下面有几个设置:

  • index.mapping.total_fields.limit:一个索引中能定义的字段的最大数量,默认是 1000
  • index.mapping.depth.limit:字段的最大深度,以内部对象的数量来计算,默认是20
  • index.mapping.nested_fields.limit:索引中嵌套字段的最大数量,默认是50

1.1 Elasticsearch中数据类型

1.1.1 基本类型

  • text类型

    该类型的字段将经过分词器分词,用于全文检索;

  • keyword类型

    不经过分词器,用于精确检索(只能检索该字段的完整值),用于过滤(filtering)

  • 数值类型

    和编程语言相同,主要有:

    long:有符号64-bit integer:-2^63 ~ 2^63 - 1

    integer:有符号32-bit integer,-2^31 ~ 2^31 - 1

    short:有符号16-bit integer,-32768 ~ 32767

    byte: 有符号8-bit integer,-128 ~ 127

    double:64-bit IEEE 754 浮点数

    float:32-bit IEEE 754 浮点数

    half_float:16-bit IEEE 754 浮点数

    scaled_float

  • 布尔类型

    逻辑型,即true/false

  • 日期类型

    由于Json没有date类型,所以es通过识别字符串是否符合format定义的格式来判断是否为date类型。ormat默认为:strict_date_optional_time||epoch_millis

    https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html

  • 二进制类型

    该类型的字段把值当做经过 base64 编码的字符串,默认不存储,且不可搜索

  • 范围类型

    范围类型表示值是一个范围,而不是一个具体的值

    譬如 age 的类型是 integer_range,那么值可以是 {“gte” : 10, “lte” : 20};搜索 “term” : {“age”: 15} 可以搜索该值;搜索 “range”: {“age”: {“gte”:11, “lte”: 15}} 也可以搜索到

    range参数 relation 设置匹配模式

    • INTERSECTS :默认的匹配模式,只要搜索值与字段值有交集即可匹配到
    • WITHIN:字段值需要完全包含在搜索值之内,也就是字段值是搜索值的子集才能匹配
    • CONTAINS:与WITHIN相反,只搜索字段值包含搜索值的文档

    integer_range

    float_range

    long_range

    double_range

    date_range:64-bit 无符号整数,时间戳(单位:毫秒)

    ip_range:IPV4 或 IPV6 格式的字符串

1.1.2 复杂类型

  • 数组类型

    字符串数组 [ “one”, “two” ]

    整数数组 [ 1, 2 ]

    数组的数组 [ 1, [ 2, 3 ]],相当于 [ 1, 2, 3 ]

    Object对象数组 [ { “name”: “Mary”, “age”: 12 }, { “name”: “John”, “age”: 10 }]

    同一个数组只能存同类型的数据,不能混存,譬如 [ 10, “some string” ] 是错误的

    数组中的 null 值将被 null_value 属性设置的值代替或者被忽略

    空数组 [] 被当做 missing field 处理

  • 对象类型

    对象类型可能有内部对象

    被索引的形式为:manager.name.first

  • 嵌套类型

  • 地理位置数据类型

  • 专用数据类型

    • 记录IP地址 ip
    • 实现自动补全 completion
    • 记录分词数 token_count
    • 记录字符串hash值 murmur3
    • Percolator

1.2 多字段特性(multi-fields)

  • 允许对同一个字段采用不同的配置,比如分词,常见例子如对人名实现拼音搜索,只需要在人名中新增一个子字段为 pinyin 即可
  • 通过参数 fields 设置

1.3 不可修改性

Mapping中的字段类型一旦设定后,禁止直接修改,原因是Lucence实现的倒排索引生成后不允许修改,除非重新建立新的索引,然后做reindex操作。但是允许新增字段。通过dynamic参数来控制字段的新增:

  • true(默认)允许自动新增字段
  • false不允许自动新增字段,但是文档可以正常写入,但无法对字段进行查询等操作
  • strict 文档不能写入,报错

第二部分 设置Mapping

在创建一个索引的时候,可以对 dynamic 进行设置,可以设成 falsetrue 或者 strict

第三部分 Dynamic Mapping

Dynamic Mapping 机制使我们不需要手动定义 Mapping,ES 会自动根据文档信息来判断字段合适的类型,但是有时候也会推算的不对,比如地理位置信息有可能会判断为 Text,当类型如果设置不对时,会导致一些功能无法正常工作,比如 Range 查询。

3.1 类型自动推断

3.2 更新mapping

如果是新增加的字段,根据 Dynamic 的设置分为以下三种状况:

  • 当 Dynamic 设置为 true 时,一旦有新增字段的文档写入,Mapping 也同时被更新。
  • 当 Dynamic 设置为 false 时,索引的 Mapping 是不会被更新的,新增字段的数据无法被索引,也就是无法被搜索,但是信息会出现在 _source 中。
  • 当 Dynamic 设置为 strict 时,文档写入会失败。

另外一种是字段已经存在,这种情况下,ES 是不允许修改字段的类型的,因为 ES 是根据 Lucene 实现的倒排索引,一旦生成后就不允许修改,如果希望改变字段类型,必须使用 Reindex API 重建索引。

不能修改的原因是如果修改了字段的数据类型,会导致已被索引的无法被搜索,但是如果是增加新的字段,就不会有这样的影响。

  • 动态映射(dynamic:true):动态添加新的字段(或缺省)。
  • 静态映射(dynamic:false):忽略新的字段。在原有的映射基础上,当有新的字段时,不会主动的添加新的映射关系,只作为查询结果出现在查询中。
  • 严格模式(dynamic: strict):如果遇到新的字段,就抛出异常。

第四部分 Index Template

###

参考材料

1、Elasticsearch官网 链接:https://www.elastic.co/cn/

https://www.cnblogs.com/wupeixuan/p/12514843.html

本文标题:Elasticsearch中Mapping总结

文章作者:rong xiang

发布时间:2021年04月12日 - 22:04

最后更新:2022年10月25日 - 23:10

原始链接:https://zjrongxiang.github.io/posts/8c1a7b52/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%