如何在 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 = <<ESQL
        FROM sample_data
        | EVAL duration_ms = ROUND(event.duration / 1000000.0, 1)
ESQL

response = 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 = <<~ESQL
  FROM 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')
end

response = 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_regexp
      video
    elsif video.nil? || video.empty?
      nil
    else
      "https://www.youtube.com/watch?v=#{video}"
    end
  end
}
# 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

redis详细教程(3.ZSet,Bitmap,HyperLogLog)

ZSet Redis 的 ZSet&#xff08;有序集合&#xff09;是一种特殊的数据类型&#xff0c;它允许存储一系列不重复的字符串元素&#xff0c;并为每个元素关联一个分数&#xff08;score&#xff09;。这个分数用于对集合中的元素进行排序。ZSet 的特点是&#xff1a; 唯一性&am…

MYSQL-SQL-03-DQL(Data Query Language,数据查询语言)(单表查询)

DQL&#xff08;数据查询语言&#xff09; DQL英文全称是Data Query Language(数据查询语言)&#xff0c;数据查询语言&#xff0c;用来查询数据库中表的记录。 查询关键字: SELECT 在一个正常的业务系统中&#xff0c;查询操作的频次是要远高于增删改的&#xff0c;当我们去访…

Cisco Packet Tracer 8.0 路由器的基本配置和Telnet设置

文章目录 构建拓扑图配置IP地址配置路由器命令说明测试效果 构建拓扑图 1&#xff0c;添加2811路由器。 2&#xff0c;添加pc0。 3&#xff0c;使用交叉线连接路由器和pc&#xff08;注意线路端口&#xff09;。 4&#xff0c;使用配置线连接路由器和pc&#xff08;注意线路…

优化网站结构提升用户体验的关键要素

内容概要 在数字时代&#xff0c;网站的架构和用户体验密切相关。一个合理的网站结构不仅能帮助用户快速找到所需信息&#xff0c;还能提升整体的访问满意度。为了达到这一目的&#xff0c;网站需要强调几个关键要素。 首先&#xff0c;清晰的导航设计至关重要。导航应当直观…

Android Gradle

#1024程序员节&#xff5c;征文# Gradle 是一款强大的自动化构建工具&#xff0c;广泛应用于 Android 应用开发。它通过灵活的配置和丰富的插件系统&#xff0c;为项目构建提供了极大的便利。本文只是简单的介绍 Gradle 在 Android 开发中的使用&#xff0c;包括其核心概念、构…

微积分复习笔记 Calculus Volume 1 - 3.8 Implicit Differentiation

3.8 Implicit Differentiation - Calculus Volume 1 | OpenStax

Java——lambda表达式和StreamAPI

一、lambda 1. lambda表达式 1.1 Lambda表达式的使用举例: (o1,02)->Integer.compare(o1,o2); 1.2 Lambda表达式的格式举例: Lambda形参列表->lambda 1.3 Lambda表达式的格式 lambda操作符或箭头操作符 的左边:lambda形参列表&#xff0c;对应着要重写的接口中的…

django游戏门户系统

想做毕业设计但还没有头绪&#xff1f;&#x1f64b;‍♂️django游戏门户系统了解一下&#xff01;这个系统不仅功能全面&#xff0c;还能轻松解决你的项目选题难题&#xff01; 我们这个基于Django开发的游戏门户系统提供了用户注册、登录、内容发布以及管理功能&#xff0c…

大数据日志处理框架ELK方案

介绍应用场景大数据ELK日志框架安装部署 一&#xff0c;介绍 大数据日志处理框架ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;是一套完整的日志集中处理方案&#xff0c;以下是对其的详细介绍&#xff1a; 一、Elasticsearch&#xff08;ES&#xff09; 基本…

【SQL实验】表的更新和简单查询

完整代码在文章末尾 在上次实验创建的educ数据库基础上&#xff0c;用SQL语句为student表、course表和sc表中添加以下记录 【SQL实验】数据库、表、模式的SQL语句操作_创建一个名为educ数据库,要求如下: (下面三个表中属性的数据类型需要自己设计合适-CSDN博客在这篇博文中已经…

LeetCode反转链表

题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例 3&#…

011:软件卸载工具TotalUninstall安装教程

摘要&#xff1a;本文详细介绍软件卸载工具TotalUninstall安装流程。 一、软件介绍 TotalUninstall是一款功能强大的卸载与清理工具&#xff0c;它能够彻底卸载不需要的应用程序&#xff0c;并清除相关的注册表项、文件残留和临时文件&#xff0c;确保系统干净无残留&#xff…

美畅物联丨视频上云网关如何配置上级联网云平台

在当今的智慧交通与安防监控体系中&#xff0c;视频上云网关发挥着至关重要的作用。以美畅视频上云网关为例&#xff0c;具备强大的兼容性&#xff0c;能够对接来自不同厂家、不同型号的视频设备&#xff0c;将这些设备输出的各异视频流进行汇聚整合。在获取摄像机视频流后&…

深入理解JavaScript:两大编程思想和ES6类以及对象概念解析

文章目录 两大编程思想ES6中的类和对象 两大编程思想 面向过程 &#xff08;Procedural-Oriented Programming&#xff0c;POP&#xff09; 定义&#xff1a;面向过程的编程是一种基于过程调用的编程范式&#xff0c;它将程序看作是一系列函数或过程的集合。每个函数负责完成…

推荐一个好用的VSCode插件

还在花馒头使用 Copilot&#xff1f;别再做大冤种啦&#xff01; 现在有个更好用的AI编程助手--豆包 MarsCode&#xff01;它不仅完全免费&#xff0c;而且功能强大&#xff0c;让你在编程时得心应手&#xff01;再也不用担心高昂的订阅费用&#xff0c;省下来的馒头&#xff…

衡石分析平台系统分析人员手册-图表查询应用

查询应用​ 在业务分析过程中&#xff0c;查询明细数据有时需要满足如下场景&#xff1a; 在自助化的操作界面中用户可以自主选择查询字段及相应的筛选条件进行查询。用户通过简单的鼠标点击能够快速获得所需数据&#xff0c;并提供聚合计算等高级功能。 上述场景可以通过查…

数据结构与算法-21算法专项(中文分词)(END)

中文分词 搜索引擎是如何理解我们的搜索语句的&#xff1f; mysql中使用 【like “%中国%”】&#xff0c;这样的使用方案 缺点1&#xff1a;mysql索引会失效缺点2&#xff1a;不能模糊&#xff0c;比如我搜湖南省 就搜不到湖南相关的 1 trie树 Trie树&#xff0c;又称前缀树…

C++ 中的可调用对象

目录 一.可调用对象简介 1.什么是可调用对象&#xff1f; 2.可调用对象有什么用&#xff1f; 二.函数指针和仿函数 1.函数指针 a.函数指针的使用语法 b.函数指针的应用场景 2.仿函数 a.仿函数的基本概念 b.仿函数的优点 三.lambda表达式和function 1.lambda表达式 …

完全了解一个asp.net core MVC项目模板

当我们使用Visual Studio 2022去新建一个基于asp.net core Web项目的时候&#xff0c;一般有三种选择&#xff0c;一种是空项目&#xff0c;一种是基于MVC的项目、再有一种就是基于包含Razor Pages实例的web应用。如下图&#xff1a; 今天&#xff0c;我们打算选择基于MVC模…

《MYSQL 实战45讲》 慢查询产生的原因

一.查询长时间不返回的原因 首先要执行下show processlist来查看各个线程的状态&#xff08;是否在等待锁&#xff09; 1.DML写锁导致其他线程对改表的读取被阻塞 当一个线程正在持有t表的DML写锁时&#xff0c;其他线程查询语句就会被阻塞&#xff0c;一直等到DML写锁释放才…