elasticsearch cardinality(近似聚合)与Global ordinals(全局字典)是什么

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 1.cardinality是ES的首个近似聚合语法2.查询优化使用了execution_hint,原理是什么?

cardinality(基数)度量

本质是一个基于HyperLogLog++(HLL)算法的一个近似聚合方案,可以通过precision_threshold参数调整聚合精确度,precision_threshold越大越精准,只接受0–40000之间的数字,更大的值会被当作40000来处理。(HLL只需要字段内容的哈希值)。

GET /zmc_index/_search
{
    "size" : 0,
    "aggs" : {
        "distinct_colors" : {
            "cardinality" : {
              "field" : "color",
              "precision_threshold" : 100 
            }
        }
    }
}

在一定场景中(例如只有少量写入的情况下),可以通过将需求字段改成一个多值字段,来完成优化(牺牲写入,优化查询、聚合)。

PUT new_index/
{
  "mappings": {
    "_doc": {
      "properties": {
        "color": {
          "type": "keyword",
          "fields": {
            "hash": {
              "type": "murmur3" 
            }
          }
        }
      }
    }
  }
}

类似的优化方案还有ES的分词使用场景,一般会选择多种分词器,例如pinyin、ik、ngram,对同一个字段使用不同的分词器索引出多个值,方便搜索时候查询(查准)。

更具体可以参考官方解释:
https://www.elastic.co/guide/cn/elasticsearch/guide/current/cardinality.html

Global ordinals(全局字典)(该映射是shard级别的,所有segment公用一个字典)

默认的模式就是使用Global ordinals,ES(默认)假设会有海量的数据,那么在聚合的时候就不合适全部放到内存,于是有了这个结构。其实就是一个全局的映射,把keyword或者term(词元)映射成一个字典值,然后保证聚合的时候的速度,同时也节省了内存(字典值会比原始的值小很多)。

global ordinals在shard上被触发refresh以后就会失效,下次使用的时候需要再重新构建
可以使用eager_global_ordinals,在每次refresh后即可更新字典,字典常驻内存,减少了查询的时候构建字典的耗时。

PUT zmc_index/_mapping
{
  "properties": {
    "field": {
      "type": "keyword",
      "eager_global_ordinals": true
    }
  }
}

用户使用execution_hint:map效果更快?

有用户在调优的时候调整了execution_hint参数,将其改成了map,即不使用global ordinals模式;

map的模式:聚合的时候在内存里面做分组(分桶)(适用于小数据量)

global ordinals比map慢的原因:字典需要在查询的时候构建(或者调整),所以就慢下来了(相对于内存)

在海量数据的情况下,使用map的方式会对内存造成很大压力,容易被熔断,或者有OOM风险,更推荐使用默认的global ordinals

eager_global_ordinals模式低写高查、数据量不大的index中使用:需要常驻内存,每次refresh以后就会重构,增大了内存以及cpu的消耗;

map模式:
例如:aaaa,bbbb,aaaa,cccc,aaaa 这样的字符串放到内存计算,结果就是
aaaa:3
bbbb:1
cccc:1

Global ordinals模式:

把aaaa映射成1,bbbb映射成2,cccc映射成3
然后计算就是 1,2,1,3,1
最后结果再转化成 aaaa,bbbb,cccc

更多可以参考官方:
https://www.elastic.co/guide/en/elasticsearch/reference/6.8/eager-global-ordinals.html

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
2月前
|
存储 搜索推荐 Java
|
7月前
|
存储 人工智能 自然语言处理
Elasticsearch Relevance Engine---为AI变革提供高级搜索能力[ES向量搜索、常用配置参数、聚合功能等详解]
Elasticsearch Relevance Engine---为AI变革提供高级搜索能力[ES向量搜索、常用配置参数、聚合功能等详解]
Elasticsearch Relevance Engine---为AI变革提供高级搜索能力[ES向量搜索、常用配置参数、聚合功能等详解]
|
8月前
|
自然语言处理 数据可视化 Java
Spring Data Elasticsearch 聚合查询
如需要统计某件商品的数量,最高价格,最低价格等就用到了聚合查询,就像数据库中的group by
123 0
|
3月前
|
存储 SQL Java
聚合在Elasticsearch中的使用及示例验证
聚合在Elasticsearch中的使用及示例验证
71 0
|
3月前
|
存储 JSON 关系型数据库
枯燥无味的Elasticsearch检索参数字典
枯燥无味的Elasticsearch检索参数字典
25 0
|
3月前
|
测试技术 定位技术 API
万字长文:一文彻底搞懂Elasticsearch中Geo数据类型查询、聚合、排序
万字长文:一文彻底搞懂Elasticsearch中Geo数据类型查询、聚合、排序
94620 140
|
3月前
|
iOS开发 索引 MacOS
Elasticsearch 聚合字段aggregate-metric-double
Elasticsearch 聚合字段aggregate-metric-double
23 0
|
3月前
|
缓存 Java API
在生产环境中部署Elasticsearch:最佳实践和故障排除技巧——聚合与搜索(三)
在生产环境中部署Elasticsearch:最佳实践和故障排除技巧——聚合与搜索(三)
|
9月前
|
JSON 数据挖掘 数据格式
|
5月前
|
数据库 Python
Python-ElasticSearch客户端的封装(聚合查询、统计查询、全量数据)
Python-ElasticSearch客户端的封装(聚合查询、统计查询、全量数据)
56 0

热门文章

最新文章