Elasticsearch:对 Java 对象的 ES|QL 查询

devtools/2024/11/14 19:52:37/

作者:Laura Trotta

ES|QL 是 Elasticsearch 引入的一种新的查询语言,它将简化的语法与管道操作符结合起来,使用户能够直观地推断和操作数据。官方 Java 客户端的新版本 8.13.0 引入了对 ES|QL 查询的支持,提供了一个新的 API,允许轻松执行查询,并自动将结果翻译为 Java 对象。

先决条件

  • Elasticsearch 版本 >= 8.11.0
  • Java 版本 >= 17

摄取数据

在开始查询之前,我们需要有一些可用的数据:我们将使用 Java 客户端中提供的 BulkIngester 实用程序类将此 csv 文件存储到 Elasticsearch 中。 该 csv 列出了 Amazon Books Reviews 数据集中的书籍,并使用以下标题行对它们进行分类:

Title;Description;Author;Year;Publisher;Ratings

首先,我们必须创建索引以正确映射字段:

if (!client.indices().exists(ex -> ex.index("books")).value()) {client.indices().create(c -> c.index("books").mappings(mp -> mp.properties("title", p -> p.text(t -> t)).properties("description", p -> p.text(t -> t)).properties("author", p -> p.text(t -> t)).properties("year", p -> p.short_(s -> s)).properties("publisher", p -> p.text(t -> t)).properties("ratings", p -> p.halfFloat(hf -> hf))));
}

然后是书籍的 Java 类:

public record Book(String title,String description,String author,Integer year,String publisher,Float ratings
){}

我们将使用 Jackson 的 CSV 映射器来读取该文件,所以让我们对其进行配置:

CsvMapper csvMapper = new CsvMapper();
CsvSchema schema = CsvSchema.builder().addColumn("title") // same order as in the csv.addColumn("description").addColumn("author").addColumn("year").addColumn("publisher").addColumn("ratings").setColumnSeparator(';').setSkipFirstDataRow(true).build();MappingIterator<Book> iter = csvMapper.readerFor(Book.class).with(schema).readValues(new FileReader("/path/to/file/books.csv"));

然后我们将逐行读取 csv 文件并使用 BulkIngester 优化摄取:

BulkIngester ingester = BulkIngester.of(bi -> bi.client(client).maxConcurrentRequests(20).maxOperations(5000));boolean hasNext = true;
while (hasNext) {try {Book book = iter.nextValue();ingester.add(BulkOperation.of(b -> b.index(i -> i.index("books").document(book))));hasNext = iter.hasNextValue();} catch (JsonParseException | InvalidFormatException e) {// ignore malformed data}
}ingester.close();

索引编制大约需要 15 秒,但完成后,我们的图书索引将包含约 80K 文档,可供查询。

ES|QL

现在是时候从书籍数据中提取一些信息了。 假设我们想要找到阿西莫夫作品的最新重印本:

String queryAuthor ="""from books| where author == "Isaac Asimov"| sort year desc| limit 10""";
List<Book> queryRes = (List<Book>) client.esql().query(ObjectsEsqlAdapter.of(Book.class),queryAuthor);

感谢使用 Book.class 作为目标的 ObjectsEsqlAdapter,我们可以忽略 ES|QL 查询的 json 结果是什么,而只关注客户端自动返回的更熟悉的书籍列表。

对于那些习惯 SQL 查询和 JDBC 接口的人来说,客户端还提供了 ResultSetEsqlAdapter,可以以同样的方式使用它,而是返回一个 java.sql.ResultSet。

ResultSet resultSet = esClient.esql().query(ResultSetEsqlAdapter.INSTANCE,queryAuthor);

另一个例子,我们现在想要找出企鹅图书中评分最高的书籍:

String queryPublisher ="""from books| where publisher == "Penguin"| sort ratings desc| limit 10| sort title asc""";queryRes = (List<Book>) client.esql().query(ObjectsEsqlAdapter.of(Book.class), queryPublisher);

用于检索数据的 Java 代码保持不变,因为结果仍然是书籍列表。 当然也有例外,例如,如果查询使用 eval 命令添加新列,则应修改 Java 类以表示新结果。

本文的完整代码可以在官方客户端存储库中找到。 如有任何疑问或问题,请随时通过讨论联系。

准备好将 RAG 构建到您的应用程序中了吗? 想要尝试使用矢量数据库的不同 LLMs?
在 Github 上查看我们的 LangChain、Cohere 等示例 notebooks,并参加即将开始的 Elasticsearch 工程师培训!

原文:ES|QL queries to Java objects — Elastic Search Labs


http://www.ppmy.cn/devtools/31600.html

相关文章

云商城系统,无后门,一站式系统Java源码

云商城系统&#xff0c;无后门&#xff0c;一站式系统Java源码&#xff0c;心权益商品数量不限数量 系统对接 手动发货 自动发货 兑 换 码 订单监控 商品监控 对象存储 邮箱提醒 加价模板 密价功能 三方支付 会员体系 财务明细 交易分析 售后服务 技术支持 建议配置&#xf…

教程:使用JavaScript求绝对值

步骤1&#xff1a;了解绝对值的概念 绝对值指的是一个数不考虑符号的大小&#xff0c;例如&#xff0c;-5和5的绝对值都是5。 步骤2&#xff1a;准备JavaScript环境 你可以在浏览器的控制台中测试JavaScript代码&#xff0c;也可以在任何文本编辑器中编写代码&#xff0c;并…

(代码结构3)项目redis key 管理

场景:项目中到处可见的key&#xff0c;没有统一管理&#xff0c;极其难维护。大佬同事实现了一个。 代码 如图,Redis.php 是对redis的二次封装&#xff0c;对redis key模块的强制校验&#xff0c;FillerKeyTrait.php 是对filler模块的key获取。主要原理是:对redis二次封装&…

Jenkins集成Kubernetes 部署springboot项目

文章目录 准备部署的yml文件Harbor私服配置测试使用效果Jenkins远程调用参考文章 准备部署的yml文件 apiVersion: apps/v1 kind: Deployment metadata:namespace: testname: pipelinelabels:app: pipeline spec:replicas: 2selector:matchLabels:app: pipelinetemplate:metada…

Q1季度家用雾化器行业线上市场销售数据分析

随着人们健康意识的提高&#xff0c;越来越多的家庭开始关注全家人呼吸系统的健康&#xff0c;尤其是中老年人和儿童群体。因此&#xff0c;家用雾化器作为一种方便、有效的家庭保健设备&#xff0c;其市场需求也在不断增长。 根据鲸参谋数据显示&#xff0c;今年Q1季度雾化器…

模版进阶篇章

非类型模版参数 回顾&#xff1a;函数模版 &#xff1a;不用传类型&#xff0c;编译器会自动推导&#xff0c;和普通的函数调用一样 #include<iostream> using namespace std; template<typename T>// T是类型 bool Less(T a, T b)// a,b是T实例化的的对象 {retu…

ResponseHttp

文章目录 HTTP响应详解使用抓包查看响应报文协议内容 Response对象Response继承体系Response设置响应数据功能介绍Response请求重定向概述实现方式重定向特点 请求重定向和请求转发比较路径问题Response响应字符数据步骤实现 Response响应字节数据步骤实现 HTTP响应详解 使用抓…

node.js中path模块-路径处理,语法讲解

node中的path 模块是node.js的基础语法&#xff0c;实际开发中&#xff0c;我们通过使用 path 模块来得到绝对路径&#xff0c;避免因为相对路径带来的找不到资源的问题。 具体来说&#xff1a;Node.js 执行 JS 代码时&#xff0c;代码中的路径都是以终端所在文件夹出发查找相…