1.Mapping 设计
Mapping 的设计主要设计字段名、字段类型及属性的设定,建议如下:
1.1 字符串类型合理选择 text 和 keyword
对于字符串类型的字段,es 默认会创建 text 类型字段和一个名为 “keyword” 的 keyword 类型的字段。 Text 类型是指这里的字符串会进行分词,即分成多个 term,用于全文检索,比如博客文章、快递地址之类的信息。 Keyword 类型是指这里的字符串作为一个 term 来处理,主要用于精确匹配的数据,比如状态码、标签等。 es 的默认处理虽然同时支持了全文检索和精确匹配,但同时也导致存储成本急剧增加。因此针对字符串类型,不建议采用默认配置,而要明确指定其类型。如果无法明确确定索引的所有字符串类型的字段,那么可以结合 es 动态模板的配置,对字符串类型进行默认设定,如下所示:
PUT my_index
{
"mappings": {
"dynamic_templates": [
{
"strings_as_keywords": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
]
}
}
另外对于一些枚举类型的字段,即便其是数值,需要设置为 keyword 类型,比如 http status code、id、邮政编码、数据库主键等。对于这类可以枚举有限的数值,倒排索引的效率远高于数值类型。如果设定为 number 类型,会导致查询效率极低。
1.2 index 参数设定
默认所有字段都会被索引,index 参数为 true。如果某字段不需要被搜索,只需要在结果里面返回,那么就不必为其创建倒排索引,此时可以将其 index 参数设置为 false,节省存储空间,提升索引性能。
1.3 store 参数设定
默认 _source 字段存储了原始文档,如果你想自定义字段存储,可以将其 store 参数设置为 true,一般此时也会同时将 _source 设置为 false。这样可以节省磁盘空间,提升索引性能。
1.4 enabled 参数设定
对于不需要查询,也不需要单独存储的字段,可以直接设定 enabled 为 false,类似下面:
"session_data": {
"enabled": false
}
等同于
"session_data": {
"type": "text",
"index": false,
"store": false
}
1.5 doc_values 参数设定
对于不需要聚合计算和排序的字段,可以将其 doc_values 设置为 false,节省磁盘空间,提升索引性能。
1.6 norms 参数设定
如果一个 text 类型的字段只需要全文检索,不需要归一化的因子,比如字段提权(field boost)、字段值长度因子等,可以将 norms 设为 false,节省磁盘空间,提升索引性能。 norms 含义可参考如下文档 http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/similarities/TFIDFSimilarity.html#formula_norm
1.7 index_options 参数设定
index_options 用于控制倒排索引记录的内容,有如下 4 种配置
- docs 只记录 doc id
- freqs 记录 doc id 和 term frequencies
- positions 记录 doc id、term frequencies 和 term position
- offsets 记录 doc id、term frequencies、term position 和 character offsets
text 类型默认配置为 positions,其他默认为 docs,记录内容越多,占用空间越大
1.8 null_value 参数设定
null 值不会被索引,也就不能被检索,可以通过该设定给字段一个默认值
1.9 eager_global_ordinals 参数设定
keyword 类型的 terms 聚合分析 会依赖 global ordinals,而其加载是在 terms 聚合查询的时候进行。通过设定 eager_global_ordinals
参数可以将 global ordinal 的加载更新提前到数据写入时,从而牺牲写入的效率以提升查询的效率。
2 Mapping 设定流程图
总结 Mapping 设定流程图如下:
评论区