博客

介绍用于 Elasticsearch Ruby 客户端的 ES|QL 查询生成器

了解如何使用最近发布的用于 Elasticsearch Ruby 客户端的 ES|QL 查询生成器。这是一款使用 Ruby 代码更轻松地构建 ES|QL 查询的工具。

我们最近发布了elastic-esql ,这是一个根据 Apache 2 许可证发布的 Ruby gem。有了这个 gem,你就可以用惯用的 Ruby 语言创建 Elastic 的ES|QL查询,然后将其用于 ES|QL 查询 API。ES|QL 允许开发人员通过查询过滤、转换和分析存储在 Elasticsearch 中的数据。它使用"管道" (| ) 来逐步处理数据。该 gem 使用 Ruby 函数,你可以将这些函数链入原始对象,以建立更复杂的查询:

ESQL:

FROM sample_data | LIMIT 2 | SORT @timestamp DESC

鲁比

Elastic::ESQL.from('sample_data').limit(2).sort('@timestamp').descending

安装

该 gem 可通过以下方式从 RubyGems 安装:

gem install elastic-esql

或者将其添加到项目的 Gemfile 中:

gem 'elastic-esql'

使用方法

您可以一次性建立一个完整的查询,也可以使用fromrow 等源命令创建一个查询对象,然后使用 ES|QL 方法链在其上建立查询。

query = Elastic::ESQL.from('sample_data')
query.limit(2).sort('@timestamp')

to_s 方法中,gem 将代码转换为 ES|QL,因此在打印输出或转换为字符串时会返回 ES|QL 查询:

query = Elastic::ESQL.from('sample_data').limit(2).sort('@timestamp').descending
query.to_s
# => "FROM sample_data | LIMIT 2 | SORT @timestamp DESC"

您可以使用! 中每个函数的对应函数来实例化查询对象并更改其初始状态:

query = Elastic::ESQL.from('sample_data')
query.to_s
# => "FROM sample_data"
query.limit!(2).sort!('@timestamp')
query.to_s
# => "FROM sample_data | LIMIT 2 | SORT @timestamp"

该工具提供了将额外步骤链入 ES|QL 函数的便捷方法,如enrichsort 。一旦在Elastic::ESQL 对象上调用enrich ,就可以将onwith 与之连锁:

esql.enrich!('policy').on('a').with({ name: 'language_name' })

在使用sort 之后,您还可以将descascnulls_firstnulls_last 链入您的查询:

Elastic::ESQL.from('sample_data').sort('@timestamp').asc.to_s
# => 'FROM sample_data | SORT @timestamp ASC'

Elastic::ESQL.from('sample_data').sort('@timestamp').desc.nulls_first.to_s
# => 'FROM sample_data | SORT @timestamp DESC NULLS FIRST'

它还支持自定义字符串,以备您自己编写 ES|QL 查询或使用尚未添加到库中的功能。custom 会在查询结束时连接字符串。它将在发送到函数时添加这些字符,而不会添加任何管道字符。它们将通过一个空格字符与查询的其余部分合并。

esql = Elastic::ESQL.from('sample_data')
esql.custom('| MY_VALUE = "test value"').to_s
# => 'FROM sample_data | MY_VALUE = "test value"'

您还可以将custom 功能串联起来:

esql.custom('| MY_VALUE = "test value"').custom('| ANOTHER, VALUE')
'FROM sample_data | MY_VALUE = "test value" | ANOTHER, VALUE'

在 Ruby 客户端使用 ES|QL 查询生成器

您可以通过发送查询对象,直接在elasticsearch-rubyesql.query API 中使用查询生成器:

require 'elasticsearch'
require 'elastic/esql'

client = Elasticsearch::Client.new
index = 'sample_data'

query = Elastic::ESQL.from(index)
                     .sort('@timestamp')
                     .desc
                     .where('event_duration > 5000000')
                     .limit(3)
                     .eval({ duration_ms: 'ROUND(event_duration/1000000.0, 1)' })
client.esql.query(body: { query: query })

您还可以将其与 Elasticsearch Ruby 客户端中的 ES|QL Helper 结合使用,了解更多详情

require 'elasticsearch/helpers/esql_helper'

Elasticsearch::Helpers::ESQLHelper.query(client, query)

作为独立工具

该 gem 被设计为一个独立工具,用于以惯用方式构建 ES|QL 查询。它没有运行时依赖性,可以与官方 Elasticsearch Ruby 客户端一起使用,也可以单独使用。

生成的查询可在esql.query API 中使用,无论应用程序以何种方式与 Elasticsearch API 交互(无论是否使用 Ruby)。使用elastic-esql 创建查询后,生成的字符串就可以作为query 请求正文中的参数发送给应用程序接口。

我曾写过一篇关于将 Elasticsearch 与流行的 Ruby 工具结合使用的文章。该 gem 可与任何流行的 Ruby 工具一起使用,以通过 ES|QL 查询 Elasticsearch。

结论

该库正在积极开发中,最终的应用程序接口尚未完成。目前发布的是技术预览版。如果您对当前的应用程序接口或一般使用方法有任何反馈,请随时打开新问题。有关 Ruby ES|QL 查询生成器的更多信息,请参阅README

相关内容

LINQ to Elasticsearch ES|QL:编写 C# 代码,查询 Elasticsearch

Florian Bernd

使用 ES|QL 进行 Elasticsearch 地理空间搜索

Craig Taverner

基于 Swiss 式哈希表实现更快的 ES|QL 统计数据

Chris Hegarty

在 Google MCP Toolbox for Databases 中引入 Elasticsearch 支持

Enrico Zimuel

使用 Kibana 将地理空间数据输入 Elasticsearch,以便在 ES|QL 中使用

Craig Taverner

准备好打造最先进的搜索体验了吗?

足够先进的搜索不是一个人的努力就能实现的。Elasticsearch 由数据科学家、ML 操作员、工程师以及更多和您一样对搜索充满热情的人提供支持。让我们联系起来,共同打造神奇的搜索体验,让您获得想要的结果。

亲自试用