栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

es-聚合性能优化

es-聚合性能优化

优化方案:

    启用 eager global ordinals 提升高基数聚合性能
    应用场景:
    ● 基于 keyword,ip 等字段的分桶聚合,包含:terms聚合、composite 聚合等。
    ● 基于text 字段的分桶聚合(前提条件是:fielddata 开启)。
    ● 基于父子文档 Join 类型的 has_child 查询和 父聚合。
    global ordinals 使用一个数值代表字段中的字符串值,然后为每一个数值分配一个 bucket(分桶)插入数据时对索引进行预排序
    ● ndex sorting (索引排序)可用于在插入时对索引进行预排序,而不是在查询时再对索引进行排序,这将提高范围查询(range query)和排序操作的性能。
    ● 在 Elasticsearch 中创建新索引时,可以配置如何对每个分片内的段进行排序。
    ● 这是 Elasticsearch 6.X 之后版本才有的特性。
PUT my-index-000001
{
  "settings": {
    "index": {
      "sort.field": "cur_time",
      "sort.order": "desc"
    }
  },
  "mappings": {
    "properties": {
      "cur_time": {
        "type": "date"
      }
    }
  }
}

本质也是已时间换时间的概念,以写入时间换查询时间的概念

    使用分片请求缓存
    聚合语句中,设置:size:0,就会使用分片请求缓存缓存结果。
    global ordinals 的本质是:启用 eager_global_ordinals 时,会在刷新(refresh)分片时构建全局序号。这将构建全局序号的成本从搜索阶段转移到了数据索引化(写入)阶段。
    创建索引的同时开启:eager_global_ordinals。
    启 eager_global_ordinals 会影响写入性能,因为每次刷新时都会创建新的全局序号。为了最大程度地减少由于频繁刷新建立全局序号而导致的额外开销,请调大刷新间隔 refresh_interval。该招数的本质是:以空间换时间。
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "tags": {
        "type": "keyword",
        "eager_global_ordinals": true
      }
    }
  }
}

size = 0 的含义是:只返回聚合结果,不返回查询结果

GET /my_index/_search
{
  "size": 0,
  "aggs": {
    "popular_colors": {
      "terms": {
        "field": "colors"
      }
    }
  }
}
    拆分聚合,使聚合并行化
    Elasticsearch 查询条件中同时有多个条件聚合,这个时候的多个聚合不是并行运行的。
    这里就有疑问:是不是可以通过 msearch 拆解多个聚合为单个子语句来改善响应时间?答案是可行的
将方式一改成方式二可以提高查询速度
方式一:
POST toy_demo_003/_search
{
  "size": 0,
  "aggs": {
    "hole_terms_agg": {
      "terms": {
        "field": "has_hole"
      }
    },
    "max_aggs":{
      "max":{
        "field":"size"
      }
    }
  }
}
方式二:
POST _msearch
{"index" : "toy_demo_003"}
{"size":0,"aggs":{"hole_terms_agg":{"terms":{"field":"has_hole"}}}}
{"index" : "toy_demo_003"}
{"size":0,"aggs":{"max_aggs":{"max":{"field":"size"}}}}
    “execution_hint”: “map”
    Map方式的结论可简要概括如下:
    1)查询结果直接放入内存中构建map,在查询结果集小的场景下,速度极快;
    2)但如果待结果集合很大的情况,map方式不一定也快。
    参考链接:https://www.yuque.com/books/share/69ed7241-26ee-4784-983a-c4eaf56469db/yt90ku
    使用案例:
POST lsm-kibana_sample_data_flights/_search
{
  "size": 0, 
  "aggs": {
    "count_agg": {
      "terms": {
        "field": "DestWeather",
        "size": 3,
        "execution_hint": "map"
      }
    }
  }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/700561.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号