-
尽量避免使用nested或 parent/child,能不用就不用;
nested query慢, parent/child query 更慢,比nested query慢上百倍;因此能在mapping设计阶段搞定的(大宽表设计或采用比较smart的数据结构),就不要用父子关系的mapping。
-
如果一定要使用nested fields,保证nested fields字段不能过多,目前ES默认限制是50。参考:
index.mapping.nested_fields.limit :50
因为针对1个document, 每一个nested field, 都会生成一个独立的document, 这将使Doc数量剧增,影响查询效率,尤其是Join的效率。
-
避免使用动态值作字段(key),动态递增的mapping,会导致集群崩溃;同样,也需要控制字段的数量,业务中不使用的字段,就不要索引。
控制索引的字段数量、mapping深度、索引字段的类型,对于ES的性能优化是重中之重。以下是ES关于字段数、mapping深度的一些默认设置:
index.mapping.nested_objects.limit :10000 index.mapping.total_fields.limit:1000 index.mapping.depth.limit: 20
-
不需要做模糊检索的字段使用
keyword
类型代替text
类型,这样可以避免在建立索引前对这些文本进行分词。 -
对于那些不需要聚合和排序的索引字段禁用Doc values。
Doc Values 默认对所有字段启用,除了
analyzed strings
。也就是说所有的数字、地理坐标、日期、IP 和不分析(not_analyzed
)字符类型都会默认开启。因为 Doc Values 默认启用,也就是说ES对你数据集里面的大多数字段都可以进行聚合和排序操作。但是如果你知道你永远也不会对某些字段进行聚合、排序或是使用脚本操作, 尽管这并不常见,这时你可以通过禁用特定字段的 Doc Values 。这样不仅节省磁盘空间,也会提升索引的速度。
要禁用 Doc Values ,在字段的映射(mapping)设置
doc_values: false
即可。
转载地址 Elasticsearch 技术分析(七): Elasticsearch 的性能优化 - JaJian - 博客园 (cnblogs.com)