如何在 Elasticsearch Ruby 客户端中使用 ES|QL Helper

作者:来自 Elastic Fernando Briano

了解如何使用 Elasticsearch Ruby 客户端编写 ES|QL 查询并处理其结果。

简介

Elasticsearch Ruby 客户端可用于编写 EQ|QL 查询,使处理从 esql.query 返回的数据更加容易。ES|QL 允许开发人员通过查询过滤、转换和分析存储在 Elasticsearch 中的数据。它使用 “管道”(|) 逐步处理数据。

自版本 8.11.0 中作为实验性版本推出以来,esql.query API 一直受 Elasticsearch Ruby 客户端支持。

你可以使用以下代码执行 ES|QL 请求:

client = Elasticsearch::Client.new
query = <<ESQLFROM sample_data| EVAL duration_ms = ROUND(event.duration / 1000000.0, 1)
ESQLresponse = client.esql.query(body: { query: query })

默认响应是从 JSON 解析的(你也可以通过传入格式参数来获取 CSV 或文本),它看起来像这样:

puts response{"columns"=>[{"name"=>"@timestamp", "type"=>"date"},{"name"=>"client.ip", "type"=>"ip"},{"name"=>"event.duration", "type"=>"long"},{"name"=>"message", "type"=>"keyword"},{"name"=>"duration_ms", "type"=>"double"}
],
"values"=>[["2023-10-23T12:15:03.360Z", "172.21.2.162", 3450233, "Connected to 10.1.0.3", 3.5],["2023-10-23T12:27:28.948Z", "172.21.2.113", 2764889, "Connected to 10.1.0.2", 2.8],["2023-10-23T13:33:34.937Z", "172.21.0.5", 1232382, "Disconnected", 1.2],["2023-10-23T13:51:54.732Z", "172.21.3.15", 725448, "Connection error", 0.7],["2023-10-23T13:52:55.015Z", "172.21.3.15", 8268153, "Connection error", 8.3],["2023-10-23T13:53:55.832Z", "172.21.3.15", 5033755, "Connection error", 5.0],["2023-10-23T13:55:01.543Z", "172.21.3.15", 1756467, "Connected to 10.1.0.1", 1.8]
]}

ES|QL 助手

在 Elasticsearch Ruby v8.13.0 中,客户端为 esql.query API 引入了 ES|QL 助手。助手返回的不是默认响应,而是以列作为键并返回相应值的哈希数组,而不是默认的 JSON 值。

此外,你可以遍历响应值并通过传入列 => Proc 值的哈希来转换数据。例如,你可以使用它将 @timestamp 列值转换为 DateTime 对象。我们将通过示例数据了解如何使用它。

设置和提取数据

在此示例中,我们使用来自 TheGamesDB(一个社区驱动的众包游戏信息网站)的 JSON dump。下载 JSON 文件后,我们可以使用 Ruby 客户端的另一个助手 Bulk Helper 将其提取到 Elasticsearch 中。

数据中包含数据库中所有游戏的列表,位于 data.games 键中。数据还包括平台和封面信息,但在本示例中,我们只使用游戏数据。BulkHelper 提供了一种将 JSON 文件直接导入到 Elasticsearch 的方法。

要使用该助手,我们需要在代码中 require 它,并使用客户端和索引对其进行实例化,以便执行批量操作(我们可以稍后在已实例化的助手上更改索引)。我们可以使用 ingest_json 并传入 JSON 文件、它可以找到数据的键,然后切片以将文档分批分离,然后再将它们发送到 Elasticsearch:

require 'elasticsearch/helpers/bulk_helper'
file = './database-latest.json'
index = 'videogames'bulk_helper = Elasticsearch::Helpers::BulkHelper.new(client, index)
bulk_helper.ingest_json(file, keys: ['data', 'games'], slice: 100)

这会将所有游戏标题及其各自的信息纳入视频游戏索引中。

使用 ES|QL 助手

加载数据后,我们现在可以使用 ES|QL 进行查询:

require 'elasticsearch/helpers/esql_helper'query = <<~ESQLFROM videogames| WHERE game_title LIKE "*Turrican*"| LIMIT 100| SORT release_date
ESQL

如果我们直接使用 esql.query API 运行此查询,我们将获得列/值结果:

response = client.esql.query(body: { query: query })
response['columns']
[{"name"=>"alternates", "type"=>"text"},{"name"=>"alternates.keyword", "type"=>"keyword"},{"name"=>"coop", "type"=>"text"},{"name"=>"coop.keyword", "type"=>"keyword"},{"name"=>"country_id", "type"=>"long"},{"name"=>"developers", "type"=>"long"},{"name"=>"game_title", "type"=>"text"},...
]response['values']
[[nil, nil, "No", "No", 0, 6970, "Turrican",  ...],[nil, nil, "No", "No", 0, nil, "Turrican II: The Final Fight", ...]

但是,助手会返回一个哈希数组,其中列作为键,并带有相应的值。因此,我们可以使用响应,并以列的名称作为键来访问数组中每个哈希的值:

response = Elasticsearch::Helpers::ESQLHelper.query(client, query)
[{"alternates"=>nil,"alternates.keyword"=>nil,"coop"=>"No","coop.keyword"=>"No","country_id"=>0,"developers"=>6970,"game_title"=>"Turrican",...},...
]response.map { |game| "#{game['game_title']} - 📅 #{game['release_date']}" }
["Turrican - 📅 1990-01-01T00:00:00.000Z","Turrican II: The Final Fight - 📅 1990-01-01T00:00:00.000Z",...
]

ESQLHelper 还提供了转换响应中的数据的功能。我们可以通过传入 column => Proc 值的哈希来实现这一点。例如,假设我们想要格式化上一个查询中的发布日期以显示更人性化的日期。我们可以运行以下命令:

parser = proc do |t|DateTime.parse(t).strftime('%B %d, %Y')
endresponse = Elasticsearch::Helpers::ESQLHelper.query(client, query, parser: { 'release_date' => parser })

如果我们运行之前相同的代码,我们将得到以下结果:

response.map { |game| "#{game['game_title']} - 📅 #{game['release_date']}" }
["Turrican - 📅 January 01, 1990","Turrican II: The Final Fight - 📅 January 01, 1990",...
]

你可以传入与响应中的列数相同的 Procs。例如,数据包含一个 youtube 字段,其中有时存储 YouTube 视频的 URL,有时仅存储视频哈希(例如 U4bKxcV5hsg)。YouTube 视频的 URL 遵循惯例 https://youtube.com/watch?v=VIDEOHASH。因此,我们还可以添加一个解析器,将 URL 添加到仅包含哈希的值的前面:

parser = {'release_date' => proc { |t| DateTime.parse(t).strftime('%B %d, %Y') },'youtube' => proc do |video|if video =~ URI::DEFAULT_PARSER.make_regexpvideoelsif video.nil? || video.empty?nilelse"https://www.youtube.com/watch?v=#{video}"endend
}
# We run the query again and pass the new parser to the helper:
response = Elasticsearch::Helpers::ESQLHelper.query(client, query, parser: parser)

如果我们随后运行 response.map { |a| a['youtube'] }.compact,我们将获得我们正在寻找的视频游戏的 YouTube 视频的 URL。

结论

如你所见,ESQLHelper 类可以更轻松地处理从 esql.query 返回的数据。你可以在官方文档中了解有关 Elasticsearch Ruby 客户端及其帮助程序的更多信息。如果你有任何反馈、问题或请求,请随时在客户端的存储库中创建新问题。

准备好自己尝试一下了吗?开始免费试用。

想要获得 Elastic 认证?了解下一次 Elasticsearch 工程师培训何时举行!

原文:How to use the ES|QL Helper in the Elasticsearch Ruby Client - Search Labs

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

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

相关文章

【elkb】ELKB安装token过期

问题 elastic启动时候生成的token 有效期只有30分钟。 30分钟后提示&#xff1a; Couldnt configure Elastic Generate a new enrollment token or configure manually. 相关版本信息 elasticsearch&#xff1a;8.8.1kibana&#xff1a;8.8.1logstash&#xff1a;8.8.1file…

交易所开发:开启数字金融新时代

当今数字化高速发展的时代&#xff0c;交易所作为金融市场的核心枢纽&#xff0c;发挥着至关重要的作用。而随着区块链技术的兴起&#xff0c;数字货币交易所的开发更是为金融领域带来了全新的变革与机遇。 一、数字货币交易所的重要性 数字货币交易所是连接数字货币世界与传统…

企业内训|LLM大模型在服务器和IT网络运维中的应用-某日企IT运维部门

本课程是为某在华日资企业集团的IT运维部门专门定制开发的企业培训课程&#xff0c;本课程旨在深入探讨大型语言模型&#xff08;LLM&#xff09;在服务器及IT网络运维中的应用&#xff0c;结合当前技术趋势与行业需求&#xff0c;帮助学员掌握LLM如何为运维工作赋能。通过系统…

网上商城设计小程序ssm+论文源码调试讲解

2相关技术 2.1微信小程序 小程序是一种新的开放能力&#xff0c;开发者可以快速地开发一个小程序。小程序可以在微信内被便捷地获取和传播&#xff0c;同时具有出色的使用体验。尤其拥抱微信生态圈&#xff0c;让微信小程序更加的如虎添翼&#xff0c;发展迅猛。 2.2 MYSQL数据…

大贤3D家谱——让修家谱不再困难

修家谱作为一种文化传统&#xff0c;承载着家族的历史和文化记忆&#xff0c;但近年来确实面临一些困难&#xff0c;导致很多人不愿意修家谱。以下是一些主要原因&#xff1a; 1、信息获取难度&#xff1a; 家谱的修订需要大量的历史资料和族谱记录。许多家庭的老谱由于时间久…

Node + HTML搭建自己的ChatGPT [基础版]

文章目录 明明外面的ChatGPT产品那么多了&#xff0c;为什么要在本地搭建自己的ChatGPT呢&#xff1f;整体架构流程1. 获取APIKey1.1 常见的AI模型1.2 为什么选DeepSeek1.3 怎么获取DeepSeek的APIKey1.3.1 注册并登录DeepSeek开放平台1.3.2 选择API keys1.3.3 创建API key1.3.4…

【Linux学习】(8)第一个Linux编程进度条程序|git三板斧

前言 第一个Linux编程——进度条git的简单使用 一、第一个Linux编程——进度条 在写进度条之前我们需要两个基础知识&#xff1a; 回车换行缓冲区 1. 回车换行 首先我们需要知道回车换行它是两个概念&#xff0c;回车是回车&#xff0c;换行是换行换行&#xff1a;光标从上往下…

DEVOPS: 认证与调度

概述 不知道大家有没有意识到一个现实&#xff0c;就是大部分时候&#xff0c;我们已经不像以前一样通过命令行&#xff0c;或者可视窗口来使用一个系统了现在我们上微博、或者网购&#xff0c;操作的其实不是眼前这台设备&#xff0c;而是一个又一个集群 通常&#xff0c;这样…

MUX VLAN 实验配置

MUX VLAN&#xff08;Multiplex VLAN&#xff09;是一种高级的VLAN技术&#xff0c;通过在交换机上实现二层流量隔离和灵活的网络资源控制&#xff0c;提供了一种更为细致的网络管理方式 MUX VLAN通过定义主VLAN&#xff08;Principal VLAN&#xff09;和多个子VLAN&#xff0…

海外云手机怎样助力亚马逊店铺运营?

随着全球化的发展&#xff0c;越来越多的企业开始重视海外市场的拓展&#xff0c;尤其是出海企业和B2B外贸企业。亚马逊作为全球最大的电商平台之一&#xff0c;成为了许多企业争夺国际市场的重点战场。本文将深入分析海外云手机在优化亚马逊店铺引流中的作用和优势&#xff0c…

优惠券项目的设计与实现,完结!

你好 我是田哥 我的充电桩项目中&#xff0c;优惠券相关功能已基本完成。另外&#xff0c;关于充电桩项目&#xff0c;我之前分享过一些相关文章&#xff1a; 充电桩项目&#xff0c;开源啦&#xff01; 充电桩项目实战&#xff1a;消息丢失和重复消费问题 用充电桩项目面试&am…

【electron8】electron实现“图片”的另存为

注&#xff1a;该列出的代码&#xff0c;都在文章内示例出 1. 另存为按钮事件&#xff1a; const saveAsHandler async () > {const { path, sessionId } recordInfoif(typeof message ! string) return;// 因为我的图片是加密的&#xff0c;所以我需要根据接口返回的路…

使用vue+kkFileview组件实现各种类型文件预览

关于kkFileView 【参考】&#xff1a;https://kkfileview.keking.cn/zh-cn/docs/home.html 文档在线预览项目解决方案&#xff0c;项目使用流行的spring boot搭建&#xff0c;易上手和部署。万能的文件预览开源项目&#xff0c;基本支持主流文档格式预览 本项目介绍 项目使用…

低空经济产业链、政策、延伸品调研笔记

文章目录 1 低空经济市场1.1 政策摘要1.2 市场规模预测 3 涉及产业链与核心产品3.1 产业链3.2 原材料3.2.1 上游3.2.2 中游3.2.3下游 3.3 无人机3.4 eVTOL3.5 空管系统 4 应用场景4.1 城市空中出行(UAM)4.2 低空物流4.3 低空旅游与体验4.4 农林植保与监测4.5 基础设施巡检与维护…

JVM基础(内存结构)

文章目录 内存结构JAVA堆方法区 &#xff08;Method Area&#xff09;运行时常量池&#xff08;Runtime Constant Pool&#xff09; 虚拟机栈 &#xff08;Java Virtual Machine Stack&#xff09;本地方法摘栈&#xff08;Native Method Stacks&#xff09;程序计数器&#xf…

Matlab 车牌识别技术

1.1设计内容及要求&#xff1a; 课题研究的主要内容是对数码相机拍摄的车牌&#xff0c;进行基于数字图像处理技术的车牌定位技术和车牌字符分割技术的研究与开发&#xff0c;涉及到图像预处理、车牌定位、倾斜校正、字符分割等方面的知识,总流程图如图1-1所示。 图1-1系统总…

智慧共享空间解决方案是什么

一、智慧共享空间解决方案的定义 智慧共享空间解决方案是一种综合性的策略和技术手段&#xff0c;旨在通过整合智慧技术与共享空间的概念&#xff0c;为公众共同使用的空间提供高效、智能、可持续的运营和管理模式&#xff0c;以满足人们在不同环境下的各种需求&#xff0c;并…

C++基于opencv的视频质量检测--画面冻结检测

文章目录 0.引言1. 原始代码分析2. 优化方案3. 优化后的代码4. 代码详细解读 0.引言 视频质量画面冻结检测已在C基于opencv4的视频质量检测中有所介绍&#xff0c;本文将详细介绍其优化版本。 1. 原始代码分析 图像抖动检测的原始代码&#xff1a; bool ScreenFreezeDetect…

AI驱动的低代码未来:加速应用开发的智能解决方案

引言 随着数字化转型的浪潮席卷全球&#xff0c;企业对快速构建应用程序的需求愈发强烈。然而&#xff0c;传统的软件开发周期冗长、成本高昂&#xff0c;往往无法满足快速变化的市场需求。在此背景下&#xff0c;低代码平台逐渐成为开发者和企业的优选方案&#xff0c;以其“低…

【蓝桥杯选拔赛真题77】python计算小球 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析

目录 python计算小球 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python计算小球 第十五届蓝桥杯青少年组python比赛选拔赛真题 一、题目要…