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可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
7月前
|
存储 搜索推荐 Java
|
1月前
|
存储 SQL 监控
|
3月前
|
存储 自然语言处理 关系型数据库
ElasticSearch基础3——聚合、补全、集群。黑马旅游检索高亮+自定义分词器+自动补全+前后端消息同步
聚合、补全、RabbitMQ消息同步、集群、脑裂问题、集群分布式存储、黑马旅游实现过滤和搜索补全功能
ElasticSearch基础3——聚合、补全、集群。黑马旅游检索高亮+自定义分词器+自动补全+前后端消息同步
|
4月前
|
自然语言处理 Java 关系型数据库
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
148 1
|
6月前
|
SQL 安全 数据挖掘
Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的?
Elasticsearch聚合查询用于复杂数据分析,包括统计空值率。示例展示了如何计算字段`my_field`非空非零文档的百分比。查询分为三步:总文档数计数、符合条件文档数计数及计算百分比。聚合概念涵盖度量、桶和管道聚合。脚本在聚合中用于动态计算。常见聚合类型如`sum`、`avg`、`date_histogram`等。组合使用可实现多值统计、嵌套聚合和空值率计算。[阅读更多](https://zhangfeidezhu.com/?p=515)
301 0
Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的?
|
6月前
|
搜索推荐 开发者
如何在 Elasticsearch 中选择精确 kNN 搜索和近似 kNN 搜索
【6月更文挑战第8天】Elasticsearch 是一款强大的搜索引擎,支持精确和近似 kNN 搜索。精确 kNN 搜索保证高准确性但计算成本高,适用于对精度要求极高的场景。近似 kNN 搜索则通过牺牲部分精度来提升搜索效率,适合大数据量和实时性要求高的情况。开发者应根据业务需求和数据特性权衡选择。随着技术发展,kNN 搜索将在更多领域发挥关键作用。
187 4
|
6月前
|
存储 缓存 自然语言处理
elasticsearch 聚合 : 指标聚合、桶聚合、管道聚合解析使用总结
elasticsearch 聚合 : 指标聚合、桶聚合、管道聚合解析使用总结
|
6月前
|
缓存 Java API
在生产环境中部署Elasticsearch:最佳实践和故障排除技巧——聚合与搜索(三)
在生产环境中部署Elasticsearch:最佳实践和故障排除技巧——聚合与搜索(三)
|
7月前
|
存储 缓存 Java
Elasticsearch 8.X 聚合查询下的精度问题及其解决方案
Elasticsearch 8.X 聚合查询下的精度问题及其解决方案
191 0
|
7月前
|
存储 SQL Java
聚合在Elasticsearch中的使用及示例验证
聚合在Elasticsearch中的使用及示例验证
99 0