优化方案:

  1. 启用 eager global ordinals 提升高基数聚合性能
    应用场景:
    ● 基于 keyword,ip 等字段的分桶聚合,包含:terms聚合、composite 聚合等。
    ● 基于text 字段的分桶聚合(前提条件是:fielddata 开启)。
    ● 基于父子文档 Join 类型的 has_child 查询和 父聚合。
    global ordinals 使用一个数值代表字段中的字符串值,然后为每一个数值分配一个 bucket(分桶)
  2. 插入数据时对索引进行预排序
    ● 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"
      }
    }
  }
}

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

  1. 使用分片请求缓存
    聚合语句中,设置: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"
      }
    }
  }
}
  1. 拆分聚合,使聚合并行化
    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"}}}}
  1. “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"
      }
    }
  }
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐