Elasticsearch Global Ordinals

news2025/1/11 18:51:53

用于减少字符串字段 fielddata 内存使用的技术之一称为序数(ordinals)。想象一下,我们有十亿个文档,每个文档都有一个状态字段。 只有三种状态:status_pending、status_published、status_deleted。 如果我们要在内存中保存每个文档的完整字符串状态,则每个文档将使用 14 到 16 个字节,即大约 15 GB。

相反,我们可以识别三个唯一的字符串,对它们进行排序并编号:0、1、2。

Ordinal | Term
-------------------
0       | status_deleted
1       | status_pending
2       | status_published

原始字符串在序数列表中仅存储一次,每个文档仅使用编号序数来指向它包含的值。

Doc     | Ordinal
-------------------------
0       | 1  # pending
1       | 1  # pending
2       | 2  # published
3       | 0  # deleted

这将内存使用量从 15 GB 减少到不到 1 GB!

但有一个问题。 请记住,fielddata 缓存是按段进行的。 如果一个段仅包含两个状态(status_deleted 和 status_published),则生成的序号(0 和 1)将与包含所有三个状态的段的序号不同。

如果我们尝试在状态字段上运行 terms 聚合,则需要聚合实际的字符串值,这意味着我们需要在所有段中识别相同的值。 一种简单的方法是在每个段上运行聚合,从每个段返回字符串值,然后将它们更进一步减少为总体结果。 虽然这可行,但速度很慢并且占用大量 CPU 资源。

相反,我们使用一种称为全局序数的结构。 全局序数是构建在 fielddata 之上的小型内存数据结构。 唯一值在所有段中被识别,并存储在序数列表中,就像我们已经描述的那样。

现在,我们的 terms 聚合只能聚合全局序数,并且从序数到实际字符串值的转换仅在聚合结束时发生一次。 这将聚合(和排序)的性能提高了三到四倍。

构建全局序数(ordinals)

当然,生活中没有什么是免费的。 全局序数跨越索引中的所有段,因此如果添加新段或删除旧段,则需要重建全局序数。 重建需要阅读每个部分中的每个独特术语。 基数越高 —— 存在的独特术语越多 —— 这个过程花费的时间越长。

全局序数构建在内存中的字段数据和文档值之上。 事实上,它们是文档值表现良好的主要原因之一。

与字段数据加载一样,默认情况下全局序号是延迟构建的。 需要 fielddata 命中索引的第一个请求将触发全局序数的构建。 根据字段的基数,这可能会导致用户出现显着的延迟峰值。 一旦全局序数被重建,它们将被重复使用,直到索引中的段发生变化:在刷新、刷新或合并之后。

急切(eager)全局序数

各个字符串字段可以配置为预先渴望构建全局序数:

PUT /music/_mapping/_song
{
  "song_title": {
    "type": "string",
    "fielddata": {
      "loading" : "eager_global_ordinals" 
    }
  }
}

在上面, 设置 eager_global_ordinals 也意味着急切地加载字段数据。

就像 fielddata 的急切预加载一样,急切全局序数是在新段对搜索可见之前构建的。

注意:序数仅用于字符串。 数值数据(整数、地理点、日期等)不需要序数映射,因为值本身充当内在序数映射。

因此,你只能为字符串字段启用急切全局序数。

Doc values 也可以急切地构建它们的全局序数:

PUT /music/_mapping/_song
{
  "song_title": {
    "type":       "string",
    "doc_values": true,
    "fielddata": {
      "loading" : "eager_global_ordinals" 
    }
  }
}

在这种情况下,fielddata 不会加载到内存中,但 doc 值会加载到文件系统缓存中。

与 fielddata 预加载不同,全局序数的急切构建可能会对数据的实时性产生影响。 对于非常高的基数字段,构建全局序数可能会将刷新延迟几秒钟。 你可以选择在每次刷新时付出代价,还是在刷新后的第一个查询时付出代价。 如果你经常索引而很少查询,那么最好在查询时付出代价,而不是在每次刷新时付出代价。

提示:让你的全局序号收回成本。 如果你有非常高的基数字段,需要几秒钟才能重建,请增加 refresh_interval,以便全局序数保持更长时间的有效状态。 这也将减少 CPU 使用率,因为你将需要更少地重建全局序数。

测试

全局序数是有效的,除非引入新的段 —— 因为这需要集群重建映射。

下面可以看到全局序数映射的示例,假设文档有一个 make 字段,表示车辆的制造商。 假设我们有很多文档,并且所有文档都有五个左右的品牌,那么它看起来类似于:

Ordinal | Field
----------------
0       | Audi
1       | BMW
2       | Honda
3       | Lexus
4       | Toyota
Doc ID | Make
----------------
N       | 0
N + 1   | 0
N + 2   | 1
N + 3   | 2
N + 4   | 2
N + 5   | 3
N + 6   | 4

通过在内存中定义上述映射,Elasticsearch 现在聚合全局序数结构而不是字符串值是一种更简单、更高效的操作。 一旦操作完成,从序数到字符串的转换只需要在最终的归约阶段发生一次。

为了查看急切加载全局序数的影响,我启动了一个索引并生成了约 300K 文档,其中包含文档中的单个字段。 下面是在有或没有预先加载全局序数的情况下在字段上进行术语聚合的结果,基数为 10(make 的 10 个唯一值):

没有急切加载

$ curl -X GET \
  -H "Content-Type: application/json" \
  -d @agg.json \
  http://localhost:9200/cars/_search
{"took":152}

使用急切加载

$ curl -X GET \
  -H "Content-Type: application/json" \
  -d @agg.json \
  http://localhost:9200/cars/_search
{"took":105}

通过对以下映射进行简单更改,术语聚合时间大约减少了 31%:

{
  "properties": {
    "make": {
      "type": "keyword",
      "eager_global_ordinals": true
    }
  }
}

结论

最终,Elasticsearch 无法提前预测或确定性地知道哪些字段将针对它们运行术语聚合。 因此,默认行为是延迟加载 keyword 和 text 字段的全局序数。

通过在映射中明确说明应用程序或客户端中通常聚合的字段,可以实现显着的性能提升。

注意:然而,这会将构建全局序数的成本从搜索时间转移到刷新时间。 对于许多用例来说,这是在搜索时为改进付出的代价是可以接受的。

这是一个简单的示例,因此请分享你的发现以及在 Elasticsearch 集群和配置中进行此更改对性能的影响!

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

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

相关文章

Ubuntu离线安装Telnet服务

通过ssh上传telnet包,下载地址:telnet-0.17-41.2build1-amd64资源-CSDN文库 解压telnet包: tar -xzvf telnet_0.17-41.2build1_amd64.tar.gz 安装telnet服务: dpkg -i telnet_0.17-41.2build1_amd64.deb 安装完毕,测…

2023第三届中国RPA+AI开发者大赛圆满收官获奖名单公示

6月26日,历时三个月的2023「第三届中国RPAAI开发者大赛」在苏州国际博览中心圆满收官。本次大赛以“探索创新智能融合”为主题,旨在寻找并推动中国RPA和AI领域的创新人才和前沿技术。云集来自各大行业与领域的企业、高校等326支优秀团队,共计…

chatgpt赋能python:Python读取xlsx中的超链接

Python读取xlsx中的超链接 xlsx是一种常用的电子表格文件格式,在日常的工作生活中经常使用。xlsx文件中可以包含超链接,作为文件中数据的补充和扩展。而Python作为一门强大的编程语言,可以帮助我们轻松读取xlsx文件中的超链接,进…

HarmonyOS/OpenHarmony应用开发-Stage模型UIAbility组件使用(一)

一、UIAbility组件概述1.概述 UIAbility组件是一种包含UI界面的应用组件,主要用于和用户交互。 UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口;一个UIAbility组件中可以通过多个页面来实现一个功能模块。每一个UIAbility组件实…

督查督办管理系统新旧时代

旧时代: 传统的督办主要是通过督办人员现场调查催办、电话催办提交工作进展情况等方法,加上市面上的成品型督办系统功能固化,无法根据企业个性化业务需求灵活调整,所以在工作督办上存在诸多不足。 数据管理滞后,效率不…

【ASP技术】web杂谈(1)之什么是ASP?

涉及知识点 什么是 ASP,Request和Response的介绍,Application和session的详细讲解,ASP的特点,ASP的编程环境,ASP内嵌对象,Asp的应用范例。深入了解ASP技术。 原创于:CSDN博主-《拄杖盲学轻声码…

npm install执行报错:ENOENT: no such file or directory, open ‘XXXXX\package.json‘

执行 npm install 报错 解决办法: 先执行 npm init -f 再安装 npm install

使用Python+Flask+HTML写一个测试小工具

背景: 由于公司安全规范限制,我司的测试、预发布、灰度、生产环境,接口间的数据通信通常是加密处理的,给我们日常定位缺陷带来了一定的阻碍,因此我决定使用Python写一个工具,将加密数据转换为正常数据&…

vscode面板菜单字体太大或者太小解决方式【自留记录】

vscode面板菜单字体太大或者太小解决方式【自留记录】 菜单图标 - 设置 - 搜索栏输入 zoom - 输入 0 回车

jasny-bootstrap组件-文件上传

今天和大家分享jasny-bootstrap如何实现文件上传,以及同form表单同时提交处理。 目前各大网站关于jasny-bootstrap上传文件的案例demo少之又少,就连若依也只是一笔带过,只是做了一个纯效果展示。 经过博主的一番查阅文档,查找案例…

【Android安全】Flutter app逆向

使用《Flutter逆向助手》逆向Flutter app 参考:https://www.bilibili.com/video/BV1SM41147g5 flutter app特征: lib/armeabi-v7a/下面有libapp.so和libflutter.so 逆向分析工具: 看雪:Flutter逆向助手 可以解析libapp.so文件…

OpenCV——《直方图操作》和《模版匹配》

1.直方图均衡化 img cv2.imread(clahe.jpg,0) plt.hist(img.ravel(),256) plt.show() #旨在使得图像整体效果均匀,黑与白之间的各个像素级之间的点更均匀一点。 equ cv2.equalizeHist(img) plt.hist(equ.ravel(),256) plt.show() #进行对比,均值化之后…

mapbox图层层级问题

如果在项目之初我们没有设计好图层的问题,那么大概率我们会与到预期图层在别的图层下面的问题,这是需要使用addlayer、movelayer方法来调整图层的位置了。 一般而言先添加的图层在显示的时候在后添加图层的下面,例如下面的代码: …

ChatGPT伪原创文章的应用与发展

ChatGPT是一种基于人工智能技术的自然语言处理模型,它能够生成逼真的、具有上下文连贯性的文本。近年来,ChatGPT在各个领域的应用越来越广泛,其发展潜力也逐渐被人们所认识。本文将从多个方面对ChatGPT的应用与发展进行详细阐述。 ChatGPT在…

人脸考勤签到进阶篇

目录 签到业务流程说明 一、需求介绍 二、如何获取地理信息? 三、如何判定某地区新冠疫情的风险等级? 开通腾讯位置服务 二、腾讯位置服务SDK 把定位坐标转换成真实地址 一、获取定位坐标 uni.authorize(OBJECT) 二、编辑签到页面 在Docker中…

如何在 Spring Boot 中使用反向代理

如何在 Spring Boot 中使用反向代理 介绍 在分布式系统中,反向代理是一项非常重要的技术。通过反向代理,可以将客户端的请求转发到后端的多台服务器上,实现负载均衡和故障转移等功能。本文将介绍如何在 Spring Boot 应用中使用反向代理。 环…

微信小程序判断用户是否授权定位

1、判断用户是否授权定位 checkLocationAuth() {let that thiswx.getSetting({success: (res) > {let authSetting res.authSettingif (authSetting[scope.userLocation]) {that.getCurrentLocation()} else if (authSetting[scope.userLocation] false) {wx.showModal(…

yxcms弱口令至getshell 漏洞复现

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 环境部署02 漏洞配置03 利用方式04 修复方案 01 环境部署 (1)yxcms yxcms 基于 PHPMySQL 开发,这是一个采用轻量级 MVC 设计模式的网站管理系统。轻量级 MVC 设…

【wifi模块应用】基于路由模块SKW92A的4G转WiFi、无线中继、视频传输方案

在家用WiFi,外出用4G,已经成为时下很多人的常规操作,尤其在室内环境中,无论是办公、居家,还是在高铁站、飞机场,亦或是酒店、咖啡馆等公共场所,我们都会下意识地主动连上WiFi。据悉,…

lenovo联想Yoga 13s 2021 AMD平台ACN版(82CY)原厂预装Win11系统镜像原装OEM恢复出厂状态

LENOVO联想笔记本电脑,Yoga 13s 2021 AMD平台ACN版(82CY)原装出厂Windows11系统,恢复原厂OEM预装专用系统 系统自带所有驱动、出厂主题壁纸LOGO、Office办公软件、联想电脑管家等预装程序 所需要工具:16G或以上的U盘 文件格式:…