一口气看完 43 个关于 ElasticSearch 的使用建议( 六 )

39. 避免使用 Norms 。Norm 是索引评分因子 , 如果不用按评分对文档进行排序,设置为“False” 。
参考示例:
"title": {"type": "string","norms": {"enabled": false}}对于 Text 类型的字段而言,默认开启了 Norms,而 Keyword 类型的字段则默认关闭了 Norms 。
开启 Norms 之后,每篇文档的每个字段需要一个字节存储 Norms 。对于 Text 类型的字段而言是默认开启 Norms 的,因此对于不需要评分的 Text 类型的字段,可以禁用 Norms 。
40. 对不需要进行聚合/排序的字段禁用列存 Doc_Values 。面向列的方式存储,主要用户排序、聚合和访问脚本中字段值等数据访问场景 。几乎所有字段类型都支持 Doc_Values,值得注意的是,需要分析的字符串字段除外 。默认情况下 , 所有支持 Doc_Values 的字段都启用了这个功能 。如果确定不需要对字段进行排序或聚合,或从脚本访问字段值,则可以禁用此功能以减少冗余存储成本 。
Keyword和Numeric的选择Keyword 类型的主要缺点是在聚合的时候需要构建全局序数,而数值类型则不用 。但低基数字段通常会命中大量结果集,例如性别,使用 Numeric 则会在构建 Bitset 上产生很高的代价 。
综上所述,在类型选择上可以参考下面的原则:

  • 在仅查询的情况下,如果有 Range 查询需求,使用 Numeric,否则使用 KeyWord 。
  • 在仅聚合的情况下,如果明确字段是低基数的,使用 Keyword 配合 Execution_hint:map,其他情况使用 Numeric 。
  • 剩下 Term 查询+聚合的场景,需要综合考虑 Numeric 类型 Term 查询构建 BitSet 和 Keyword 类型构建全局序数哪个代价更大,需要看实际场景,但是目前所知的最坏情况下,构建 Bitset 会导致 CPU 跑满,构建全局序数的主要问题是带来的查询延迟,也会给 JVM 带来一些压力 。
41. 对于极少使用 Range 查询的数字值,使用 Keyword 类型 。并非所有数值数据都应映射为数值字段数据类型 。Elasticsearch 为查询优化数字字段,例如 Integer or long 。如果不需要范围查找 , 对于 Term 查询而言,Keyword 比 Integer 性能更好 。
42. 对于有频繁且较为固定的 Range 查询字段,增加 Keyword 类型 Pre-Indexing字段 。如果对字段的大多数查询在一个固定的范围上运行 Range 聚合,那么可以增加一个 Keyword 类型的字段 , 通过将范围“Pre-Indexing”到索引中并使用 Terms 聚合来加快聚合速度 。
43. 对需要聚合查询的高基数 Keyword 字段启用 Eager_Global_Ordinals 。参考:eager_global_ordinals序号(Ordinals)用于在 Keyword 字段上运行 Terms 聚合 。序号用一个自增数值表示,ES 维护这个自增数字与实际值的映射关系,并为每一数值分配一个 Bucket , 映射关系是 Segment 级别的 。
但是做聚合操作时往往需要结合多个 Segment 的结果,而每个 Segment 的 Ordinals 映射关系是不一致的,所以 ES 会在每个分片上创建全局序号(Global Ordinals)结构 ,一个全局统一的映射,维护全局的 Ordinal 与每个 Segment 的 Ordinal 的映射关系 。
默认情况下 , Global Ordinals 默认是延时构建,在第一次查询如 Term Aggregation 使用到时才会构建 。因为 ES 不知道哪些字段将用于 Terms 聚合 , 哪些字段不会 。对于基数大的字段,构建成本较大 。
启用 eager_global_ordinals 后,Elasticsearch 会在分片构建时预先计算出全局词项表,以便在查询时能够更快地加载和使用 。但启用 eager_global_ordinals 后,每次执行 Refresh 操作都会构建 Global Ordinals,相当于把搜索时候花费的构建成本转移到写入时,所以会对写入效率有一定的影响 , 可以配合增大索引的 Refresh Interval 来使用 。
参考示例:
PUT index{"mappings": {"type": {"properties": {"foo": {"type": "keyword","eager_global_ordinals" : true}}}}}五、总结最近十年,Elasticsearch 已经成为了最受欢迎的开源检索引擎,并沉淀了大量的实践案例及优化总结 。在本文中,我们尽可能全面地总结了 Elasticsearch 日常开发中的一些重要实践&避坑指南,希望能为大家提供 Elasticsearch 使用上的一些借鉴点,欢迎讨论!
参考文章:
1.《Elasticsearch 源码解析与优化实战》
2.《Elasticsearch权威指南》
3.https://www.easyice.cn/archives/367


推荐阅读