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

news2025/1/11 2:47:28

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 设置随时禁用预加载:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1002739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C 风格文件输入/输出---有格式输入/输出--(std::scanf, std::fscanf, std::sscanf)

C 标准库的 C I/O 子集实现 C 风格流输入/输出操作。 <cstdio> 头文件提供通用文件支持并提供有窄和多字节字符输入/输出能力的函数&#xff0c;而 <cwchar>头文件提供有宽字符输入/输出能力的函数。 有格式输入/输出 从 stdin、文件流或缓冲区读取有格式输入 s…

电脑文件删除没有在回收站怎么恢复?可以参考这些方法

“不慎删除了辛苦搜集的资料&#xff0c;可是在回收站里却找不到它们。这可真是让人困扰。恳请大神能否伸出援手&#xff0c;帮我解决这个问题&#xff1f;” ——在使用电脑的过程中&#xff0c;我们常常会不小心删除一些重要的文件&#xff0c;而这些文件并未进入回收站&…

Spring中加密工具类DigestUtils和BCryptPasswordEncoder

spring中的加密工具类DigestUtils Spring中自带了一个加密工具类&#xff0c;所在的位置的是org.springframework.util.DigestUtils&#xff0c;在spring-core模块中。 该工具类中默认只提供了MD5加密相关的静态方法&#xff0c;同时还有一些获取其他加密算法的私有方法&#…

pdf拆分成多个文件的方法以及注意事项

PDF是一种非常流行的文件格式&#xff0c;但有时候我们需要将一个大的PDF文件拆分成多个小的文件&#xff0c;以便于管理和分享。本文将介绍一些拆分PDF文件的方法以及需要注意的事项。 AdobeAcrobat是一款专业的PDF编辑软件&#xff0c;可以轻松地拆分PDF文件。以下是使用Adob…

读取XML的几种方式

一、为什么使用XML 1、便于不同应用程序之间通信。 2、便于不同平台之间通信。 3、便于不同平台之间数据共享。 二、Dom读取 xml文件内容 <?xml version"1.0" encoding"UTF-8"?> <bookstore><book id"1"><name>冰…

Java | 线程的生命周期和安全

不爱生姜不吃醋⭐️ 如果本文有什么错误的话欢迎在评论区中指正 与其明天开始&#xff0c;不如现在行动&#xff01; &#x1f334;线程的生命周期 sleep方法会让线程睡眠&#xff0c;睡眠时间到了之后&#xff0c;立马就会执行下面的代码吗&#xff1f; 答&#xff1a;不会&am…

OSM最新电力数据(2023年9月1日数据)转换总结及与三个月前转换结果对比

sm包含种类繁多&#xff0c;我们这里是只以刚转换的电力设备为例抛砖引玉的进行说明。 首先先看一下转换结果大概368个文件&#xff0c;大约92种类型。当然其中有同一类设备的点、线、面类型&#xff01; 这种带增强的文件&#xff0c;是我在基础规则之外增加的提取规则。是为…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(状态管理 六)

AppStorage&#xff1a;应用全局的UI状态存储 AppStorage是应用全局的UI状态存储&#xff0c;是和应用的进程绑定的&#xff0c;由UI框架在应用程序启动时创建&#xff0c;为应用程序UI状态属性提供中央存储。 和LocalStorage不同的是&#xff0c;LocalStorage是页面级的&…

SG-Former实战:使用SG-Former实现图像分类任务(一)

摘要 SG-Former是一种新型的Transformer模型&#xff0c;它被提出以降低视觉Transformer的计算成本&#xff0c;同时保持其优秀的性能表现。计算成本的降低使得SG-Former能够更有效地处理大规模的特征映射&#xff0c;从而提高了模型的效率和全局感知能力。 SG-Former的核心思…

算法综合篇专题三:二分法

"寻一颗&#xff0c;未萌的渺小啊&#xff0c;随着青翠未来&#xff0c;升入辽阔云霄~" 现在你有一个"升序"数组&#xff0c;想让你在这个数组里完成查找数字n&#xff0c;在这个数组内的下标&#xff0c;你可以怎么做&#xff1f;这也许是不少友子们初遇…

内存卡中毒了格式化能解决吗?这样清除病毒更有效

内存卡被广泛应用于手机、相机、MP3等数码产品&#xff0c;并且可以存储各种媒体文件&#xff0c;如视频、图片等。然而&#xff0c;在我们使用过程中&#xff0c;您是否因内存卡格式化而导致重要数据丢失感到困扰。对于“内存卡中毒了格式化能解决吗&#xff1f;“的疑惑&…

用于非线性多载波卫星信道的多输入多输出符号速率信号数字预失真器DPD(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【LeetCode刷题篇零】一些基础算法知识和前置技能(下)

数组常用技巧 使用数组代替Map 使用另一个数组来统计每个数字出现的次数&#xff0c;数组的下标作为key, 数组的值作为value&#xff0c; 将数字作为数组的下标索引&#xff0c;数组里的值存储该数字出现的次数&#xff0c;原理有点类似桶排序中使用的计数数组。 比如这里如…

tensorboard可视化文件:events.out.tfevents.

跑了一个开源代码&#xff0c;跑完之后看到生成的文件夹里&#xff0c;出现了events.out.thevents.xxx的格式文件&#xff0c;比较好奇&#xff0c;进行了一番学习~   首先说明文件作用&#xff1a;用于tensorboard显示的可视化文件 使用方法 首先要安装tensorboard&#x…

mvn打包:依赖包和启动包分离

简述 依赖插件&#xff1a; maven-jar-plugin maven-assembly-plugin项目目录结构 assembly.xml <assembly xmlns"http://maven.apache.org/ASSEMBLY/2.1.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://…

zookeeper可视化界面zkui

获取zkui github地址&#xff1a;https://github.com/DeemOpen/zkui 可以使用客户端clone&#xff0c;我这里直接下载zip 解压 编译 如果将包下载到了linux&#xff0c;需要在linux中编译&#xff0c;我的linux没有maven&#xff0c;所以在window编译好&#xff0c;然后复制…

Win10显卡驱动安装失败怎么办

在更新Win10系统的过程中&#xff0c;显卡驱动也要跟着更新&#xff0c;近期有小伙伴反映在安装的过程中显示Win10显卡驱动安装失败&#xff0c;这是怎么回事&#xff0c;遇到这种问题应该怎么解决呢&#xff0c;下面小编就给大家详细介绍一下Win10显卡驱动安装失败的解决方法&…

一文说清mmap内存映射底层原理(以LCD中的Framebuffer为例)

一文说清mmap内存映射底层原理 【目录】 一、宏观解释内存映射 二、进程虚拟地址空间 三、虚拟内存区域描述符 四、内存映射的实现 五、mmap在Framebuffer中的应用 前几天的一场面试中&#xff0c;面试官问&#xff1a;为什么可以通过mmap直接操作LCD&#xff1f; 当…

上海亚商投顾:沪指放量反弹 医药、AI概念股集体走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数早间震荡反弹&#xff0c;午后集体拉升涨超1%&#xff0c;深成指一度涨超1.5%&#xff0c;随后涨幅略…

CSP 202104-1 灰度直方图

答题 就是记录每个数出现的次数&#xff0c;用C的map就行 #include<iostream> #include<map> using namespace std; int main(){map<int,int>h;int n,m,L,a;cin>>n>>m>>L;for(int i0;i<L;i){h[i]0;}while(n--){for(int i0;i<m;i){…