Elasticsearch之Mapping
Mapping
- 类似数据库中的表机构定义,主要作用如下:
- 定义Index下的字段名(FieldName)
- 定义字段的类型,比如数值型、字符串型、布尔型等
- 定义倒排索引相关的配置,比如是否索引、记录position等自定义Mapping
- 自定义Mapping的api如下所示
- Mapping 中的字段类型一旦设定后,禁止直接修改,原因如下:
- Lucene 实现的倒排索引生成后不允许修改
- 重新建立新的索引,然后做reidnex操作
dynamic 允许新增字段
- 通过dynamic参数来控制字段的新增
- true (默认)允许自动新增字段
- false 不允许自动新增字段,但是文档可以正常写入,但无法对字段进行查询等操作
- strict 文档不能写入,报错
copy_to
- 将字段的值复制到目标字段,实现类似_all的作用
- 不会出现在_source中,只用来搜索
关键字包含
John
、Smith
的
index
- 控制当前字段是否索引,默认为true,即记录索引,false不记录索引
index_options
- index_options 用于控制倒排索引记录的内容,有如下4中配置
- docs 只记录 doc id
- freqs 记录 doc id 和 term frequencies (词频)
- positions 记录 doc id 、trem frequencies 和 term position (支持词语查询,前后顺序)
- offsets 记录doc id 、trem frequencies 、 term position和 character offsets (高亮) - text 类型默认配置为 positions,其他默认docs
- 记录内容越多,占用空间越大
- index_options 设定如下所示
null_value
- 当子弹遇到null值时的处理策略,默认为null,即空值,此时es会忽略该值。可以通过设定该值设定字段的默认值
数据类型
- 核心数据类型
- 字符串型 text(分词)、keyword(不分词)
- 数值型 long、integer、short、byte、double、float、half_float、scaled_float
- 日期类型 date
- 布尔类型 boolean
- 二进制类型 binary
- 范围类型 integer_range、float_range、long_range、double_range、date_range - 复杂数据类型
- 数组类型 array
- 对象类型 object
- 嵌套类型 nested object - 地理位置数据类型
- geo_point
- geo_shape - 专用类型
- 记录ip地址 ip
- 实现自动补全 completion
- 记录分词数 token_count
- 记录字符串 hash 值 murmur3
- percolator
- join - 多字段特性 multi-fields
- 允许同一个字段采用不同的配置,比如分词,常见列子如对人名实现拼音搜索,只需要在人名中新增一个子字段为 拼音即可
Dynamic Mapping
-
es 可以自动识别文档字段类型,从而降低用户使用成本,如下所示:
-
es 是依靠JSON文档的字段类型来实现自动识别字段类型,支持类型如下:
-
日期的自动识别可以自行匹配日期格式,以满足各种需求
- 默认是[“strict_date_optional_time”,“yyyy/MM/dd HH:mm:ss Z|| yyyy/MM/dd Z”]
- dynamic_date_formats 可以自定义日期类型
- date_datection 可以关闭日期自动识别的机制 -
字符串是数字是,默认不会自动识别为整型,因为字符串中出现数字是完全合理的
- numeric_detection 可以开启字符串中数字的自定识别,如下图:
Dynamic Templates
- 允许根据es自动识别的数据类型、字段名等来动态设定字段类型,可以实现如下效果:
- 所有字符串类型都设定为keyword类型,即默认不分词
- 所有以message开头的字段都设定为text类型,即分词
- 所有以 long_ 开头的字段都设定为 long类型
- 所有自动匹配为double类型的都设定为float类型,以节省空间 - 匹配规则一般有如下几个参数:
- match_mapping_type 匹配es自动识别的自短类型,如 boolean,long,string等
- match, unmatch 匹配字段名
- path_match,path_unmatch 匹配路径 object - 字符串默认使用 keyword类型
- es 默认会为字符串设置为text类型,并添加一个keyword的字词段 - 以 message 开头的字段都设置为text类型
- double 类型设定为float,节省空间
自定义 Mapping 建议
- 自定义 Mapping 的操作步骤如下:
- 1.写入一条文档到es的临时索引中,获取es自动生成的mapping
- 2.修改步骤1得到的 mapping, 自定义相关配置
- 3.使用步骤2的mapping 创建实际所需索引
索引模板
-
索引模板,英文为 Index Template, 主要用于新建索引时自动应用预先设定的配置,
-
简化索引创建的操作步骤
- 可以设定索引的配置和 mapping
- 可以有多个模板,根据order设置,order大的覆盖小的配置 -
索引模板API, endpoint 为 _template,如下所示:
-
获取与删除的API如下: