为什么 Elasticsearch 中高基数字段上的聚合是一个坏主意以及如何优化它

这篇具有很好参考价值的文章主要介绍了为什么 Elasticsearch 中高基数字段上的聚合是一个坏主意以及如何优化它。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

为什么 Elasticsearch 中高基数字段上的聚合是一个坏主意以及如何优化它,Elasticsearch,Elastic,elasticsearch,大数据,搜索引擎,全文检索

Elasticsearch 是分布式搜索和分析引擎,是满足搜索和聚合需求的最受欢迎的选择。

Elasticsearch 提供了 2 种数据类型来存储字符串值:

  • Text:- 在存储到倒排索引之前对这些内容进行分析,并针对全文搜索进行优化。 文本字段不允许聚合
  • Keyword:- 它们按原样存储在倒排索引中,如果需要,可以在查询期间进行分析。 这些针对聚合进行了优化,因为它们也以柱状方式存储(称为 doc values),以便可以引用单个字段,而无需在内存中加载完整文档

有关 text 及 keyword 搜索的更多比较,请参阅我之前的文章 “Elasticsearch:Text vs. Keyword - 它们之间的差异以及它们的行为方式”。

Elasticsearch 将 keyword 存储为 doc values 中的序数,以获得更紧凑的表示。 这种映射的工作原理是根据每个术语的字典顺序为每个术语分配一个增量整数或“序数(ordinal)”。 该字段的 doc values 仅存储每个文档的序数而不是原始术语,并具有单独的查找结构来在序数和术语之间进行转换。

在聚合期间使用时,序数可以极大地提高性能。 作为术语(terms)聚合的示例,依赖于序数将文档分组到分片级别的存储桶中,然后在跨分片组合结果时将序数转换回其原始术语值。

每个分片包含多个 “段(segements)”,其中一个段就是一个倒排索引。 分片中的搜索将依次搜索每个片段,然后将其结果合并到该分片的最终结果中。 当你为文档建立索引时,Elasticsearch 将它们收集在内存中(为了安全起见,收集在 trasaction log 中),然后每隔一秒左右将一个新的小段写入磁盘,并 “刷新” 搜索。这使得新段中的数据对搜索可见(即它们是 “可搜索的”)

每个段都定义自己的序数映射,但聚合会跨整个分片收集数据。 因此,为了能够使用序数(ordinals)进行聚合等分片级操作,Elasticsearch 创建了一个称为全局序数(global ordinals)的统一映射。 全局序数映射建立在段序数之上,并通过维护每个段的从全局序数到局部序数的映射来工作。

必须先构建全局序数映射,然后才能在搜索过程中使用序数。 默认情况下,第一次需要全局序数时会在搜索过程中加载映射。 通常,全局序数在加载时间和内存使用方面不会产生很大的开销。 但是,对于具有大分片的索引,或者如果字段包含大量唯一术语值,则加载全局序数可能会很昂贵。 由于全局序号为分片上的所有段提供了统一的映射,因此当新段可见时,它们也需要完全重建。

解决方案

聚合提供了一个参数 execution_hint,有助于控制存储桶的收集方式。 它默认为 global_ordinals,但可以设置为 map 来直接使用术语值。 这避免了创建全局序数的麻烦并提高了性能,但仅当很少有文档与查询匹配时才应考虑,否则基于序数的执行模式会明显更快。 默认情况下,仅在对脚本运行聚合时使用 map,因为它们没有序数。它可以指定如下:

"aggs": {
    "make": {
      "terms": {
        "field": "make",
        "execution_hint": "map", 
        "size": 10
      }
    }
  }

我们还可以使用 eager_global_ordinals,在这种情况下,全局序数是在刷新分片时构建的。 Elasticsearch 总是在公开索引内容的更改之前加载它们。 这将构建全局序数的成本从搜索时间转移到索引时间。 可以为字段启用它,如下所示:

PUT my-index-000001/_mapping
{
  "properties": {
    "tags": {
      "type": "keyword",
      "eager_global_ordinals": true
    }
  }
}

可以通过更新 eager_global_ordinals 设置随时禁用预加载:文章来源地址https://www.toymoban.com/news/detail-721261.html

PUT my-index-000001/_mapping
{
  "properties": {
    "tags": {
      "type": "keyword",
      "eager_global_ordinals": false
    }
  }
}

到了这里,关于为什么 Elasticsearch 中高基数字段上的聚合是一个坏主意以及如何优化它的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch为什么快?

    概括的说,一个优秀的搜索引擎的设计,至少应该具备以下几点要求: 高效的压缩算法 快速的编码和解码算法 合理的数据结构 通用最小化算法 结合以上几点,后面我将通过一个案例来讲解,倒排索引的基本原理是什么。在了解“倒排索引”之前,我们先来看一下何为“索

    2024年02月04日
    浏览(45)
  • 为什么 Spark UI 上显示的 Executor Cores 与 Yarn 上的 vCore 数量不符?

    你可能会在自己的集群上观察到:Spark UI 上显示的 Executor Cores 与 Yarn 上的 vCore 数量是不符的,本文将会给出详细解释。本文和《为什么我的集群一个 Spark Executor / Yarn Container 只有一个vCore?》一文有比较密切的关系,建议先阅读一下此文,本文可以看作是这篇文章的“补充”

    2024年02月11日
    浏览(56)
  • Elasticsearch:索引状态是红色还是黄色?为什么?

    在我之前文章 “Elasticsearch:如何调试集群状态 - 定位错误信息” 中,我有详细介绍如何调试集群状态。在今天的文章中,我将详细介绍如何故障排除和修复索引状态。 Elasticsearch 是一个伟大而强大的系统,特别是创建一个可扩展性极强的分布式数据存储,并自动跟踪、管理

    2023年04月09日
    浏览(44)
  • Elasticsearch:什么是向量和向量存储数据库,我们为什么关心?

    Elasticsearch 从 7.3 版本开始支持向量搜索。从 8.0 开始支持带有 HNSW 的 ANN 向量搜索。目前 Elasticsearch 已经是全球下载量最多的向量数据库。它允许使用密集向量和向量比较来搜索文档。 向量搜索在人工智能和机器学习领域有许多重要的应用。 有效存储和检索向量的数据库对于

    2024年02月08日
    浏览(53)
  • Java实体类属性和数据库字段都是大写字母,为什么返回给前端会变成小写字母

    最近我在开发系统的过程中发现了一个问题,我数据库中数据表的字段名使用的全是大写字母,Java实体类中属性也都是大写字母,但是返回给前端的时候所有属性名却变成了小写的。 我查阅资料后解决了问题,因此记录下来,避免以后再次踩坑。 数据库字段的字段名是大写

    2024年02月14日
    浏览(52)
  • ElasticSearch(七):ES查询速度为什么那么快

    介绍给大家一个开源SpringCloud项目。整合了大部分开源中间件,详情信息可以查看文档: spring cloud开源组件开发 另外自己以后博客所讲解的代码内容,都会我的Git上同步(GitHub同步)GIT地址 ES使用的数据结构是倒排索引,在对搜索内容进行分词的时候,会根据搜索内容分词结

    2023年04月08日
    浏览(81)
  • 为什么选择elasticsearch分布式搜索引擎

    elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如: 在CSDN上搜索代码 在电商网站搜索商品 在百度搜索答案 elasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK)。被广泛应用在日志数据分析、实时监

    2024年02月12日
    浏览(54)
  • Elasticsearch 为什么会产生文档版本冲突?如何避免?

    先让大家直观的看到 Elasticsearch 文档版本冲突。 1.1 场景1:create 场景 1.2 场景2:批量更新场景模拟 模拟脚本1:循环写入数据 index.sh。 模拟脚本2:循环update_by_query 批量更新数据 update.sh。 由于:写入脚本 index.sh 比更新脚本 update.sh (执行一次,休眠1秒)执行要快,所以更新

    2023年04月08日
    浏览(48)
  • 这个字段我明明传了呀,为什么收不到 - Spring 中首字母小写,第二个字母大写造成的参数问题

    PS:本文首发于微信公众号:技术角落。感兴趣的同学可以查看并关注:https://mp.weixin.qq.com/s/yL1HpgTQdIPVjuFsq2YGFg vSwitchId 、 uShape 、 iPhone ... 这类字段名,有什么特点?很容易看出来吧,首字母小写,第二个字母大写。它们看起来确实是符合 Java 中对字段所推崇的“小驼峰命名法

    2024年02月03日
    浏览(53)
  • ElasticSearch第七讲:ES查询速度为什么那么快

    介绍给大家一个开源SpringCloud项目。整合了大部分开源中间件,详情信息可以查看文档: spring cloud开源组件开发 另外自己以后博客所讲解的代码内容,都会我的Git上同步(GitHub同步)GIT地址 ES使用的数据结构是倒排索引,在对搜索内容进行分词的时候,会根据搜索内容分词结

    2023年04月19日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包