Mapping建模-优化相关

  1. 尽量避免使用nested或 parent/child,能不用就不用;

    nested query慢, parent/child query 更慢,比nested query慢上百倍;因此能在mapping设计阶段搞定的(大宽表设计或采用比较smart的数据结构),就不要用父子关系的mapping。

  2. 如果一定要使用nested fields,保证nested fields字段不能过多,目前ES默认限制是50。参考:

    index.mapping.nested_fields.limit :50
    

    因为针对1个document, 每一个nested field, 都会生成一个独立的document, 这将使Doc数量剧增,影响查询效率,尤其是Join的效率。

  3. 避免使用动态值作字段(key),动态递增的mapping,会导致集群崩溃;同样,也需要控制字段的数量,业务中不使用的字段,就不要索引。

    控制索引的字段数量、mapping深度、索引字段的类型,对于ES的性能优化是重中之重。以下是ES关于字段数、mapping深度的一些默认设置:

    index.mapping.nested_objects.limit :10000
    index.mapping.total_fields.limit:1000
    index.mapping.depth.limit: 20
    
  4. 不需要做模糊检索的字段使用 keyword类型代替 text 类型,这样可以避免在建立索引前对这些文本进行分词。

  5. 对于那些不需要聚合和排序的索引字段禁用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)

posted on 2022-01-26 15:52  MaXianZhe  阅读(150)  评论(0编辑  收藏  举报

导航