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

2024-05-04 13:36

本文主要是介绍Elasticsearch:对 Java 对象的 ES|QL 查询,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者: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

这篇关于Elasticsearch:对 Java 对象的 ES|QL 查询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/959314

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听