文章目录
mappings
https://www.elastic.co/guide/en/elasticsearch/reference/8.0/mapping-params.html
- enabled:设置 false,仅作存储不支持搜索和聚合分析(数据保存在_source中 用于type为object)
- index:是否倒排索引;设置 fasle,无法被搜索,但依然支持aggs,sort,并出现在_source中
- norms:用于算分,若字段用来filter过滤和aggs聚合分析,可关闭节约存储
- doc_values:是否启用 doc_values,用于排序和聚合分析
- field_data:若要对text类型启用排序和聚合分析,fielddata需要设置成true
- store:默认false不存储,数据默认存储在_source,若true,额外空间再存储该字段
- coerce:默认 true 开启,是否开启数据类型的自动转换,如字符串转数字
- multifields:多字段特性
- dynamic:true/false/strict 控制mapping的自动更新 字段的自动新增
影响性能的参数:
参数 | 作用 |
---|---|
index | 认true,字段是否analyzed,false不分词,不能被查询 |
enabled | 默认true,字段是否索引,用于type为object,不索引能减少CPU使用,但是不能搜索 |
store | 默认false,如果需要获取的字段只是文档中的小数据,这些字段可以store,减少IO |
doc_values | 默认true,优化字段排序聚合脚本访问,耗用磁盘空间 |
fielddata | 默认false,针对text类型排序、聚合、脚本访问优化,尽量避免,操作昂贵 |
norms | 默认true,如果字段不需要参与评分,设置为false,减少磁盘占用 |
其他参数:
参数 | 作用 |
---|---|
boost | 默认1,评分加权系数 |
analyzer | 字段保存使用的分析器 |
similarity | 评分使用的算法 默认最外层BM25 |
fields | 一个字段多种处理方式,内置字段,可用于多语言 |
null_value | 设置空值的默认值 |
search_analyzer | 搜索使用的分析器 |
ignore_above | 设置索引和store的长度,超过长度的忽略 |
copy_to | 将该字段拷贝到指定字段,方便通过一个字段搜索 |
ignore_malformed | 默认false,添加文档时忽略该字段的异常数据 |
coerce | 默认true,是否允许数据类型强制转换,如字符串转数字,浮点转整型 |
index_option | 倒排索引的内容,docs、freqs、positions、offsets |
dynamic | 默认true,是否允许根据文档动态添加mapping类型,true\false\strict,支持最外层定义即mappings下内层继承即properties下字段下 |
index template & dynamic template
- 根据索引名匹配不同的 mappings 和 settings
- 可在一个 mappings 上动态的设定字段类型(新增字段)
index alias:无需停机,无需修改程序,即可进行修改索引库
update by query & reindex:对已经创建的索引库新增字段或修改字段重建索引
_meta 元信息
# 在Mapping中加入元信息,便于管理
PUT softwares/
{
"mappings": {
"_meta": {
"software_version_mapping": "1.0"
}
}
}
建议:为索引的mappings 加入meta信息
- mappings 设置需要从两个维度考虑
-
- 功能:搜索,聚合,排序
-
- 性能:存储的开销,内存的开销,搜索的性能
- mappings 设置是一个迭代过程
-
- 加入新的字段容易,必要时可 update_by_query
-
- 更新删除的字段不允许,需要 reindex 重建索引导入数据
-
- 最好能对mappings加入meta信息,更好进行版本管理
-
- 可考虑将mappings文件上传git进行管理
如何对字段进行建模:
- 字段类型
-
- text和keyword
text:
用于全文本字段,文本会被 analyzer 分词
默认不支持聚合分析及排序,要设置 fielddata 为 true
keyword:
用于id,枚举及不需要分词的文本,如电话号码,email地址,手机号码,性别,身份证和邮编等
适用于 filter 精确匹配,sort 和 aggs 聚合
设置多字段类型:
默认会为文本类型设置text,并设置一个keyword的子字段
处理自然语言时,通过增加英文,拼音和标准分词器,提高搜索结构
-
- 结构化数据
数值类型:尽量选择位数小的类型,能用byte就不要用long
枚举类型:设置为 keyword,即便是数字也该设置为keyword,获取高性能
其他:日期/布尔/地理
- 是否需要搜索及分词
若不需要检索,排序和聚合分析:enabled 设置为false (字段是否索引 仅用于type为object)
若不需要检索:index 设置 false
对需要检索的字段通过以下配置设定存储粒度:index_options 倒排索引/norms 算分 :不需要归一化数据时可关闭
- 是否需要聚合及排序
若不需要检索,排序和聚合分析:enabled 设置为false
若不需要排序或者聚合分析:doc_values / fielddata 设置false
更新频繁,聚合查询频繁的keyword类型的字段:推荐将 eager_global_ordinals 设置true 建议数据量不大
- 是否需要额外存储
是否需要专门存储当前字段数据:
store 设置 true,可存储该字段的原始内容
一般结合 _source 的 enabled 为 false 使用
disable _source:节约磁盘,适用于指标型数据,无需更新
一般建议先考虑增加压缩比
无法看到 _source 字段,无法做 reindex,无法做 _update 但是能覆盖新增
示例:图书的索引
书名:支持全文和精确匹配
简介:支持全文
作者:精确匹配
发行日期:日期
图书封面:精确值,一般不需要搜索
#优化字段类型
PUT books
{
"mappings" : {
"properties" : {
"author" : {"type" : "keyword"},
"cover_url" : {"type" : "keyword","index": false}, # index false,不支持搜索,支持terms聚合 keyword的倒排索引是 文档id和文档位置的映射
"description" : {"type" : "text"},
"public_date" : {"type" : "date"},
"title" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 100
}
}
}
}
}
}