Elasticsearch:从 ES|QL 到 PHP 对象

2024-04-11 06:52
文章标签 es php 对象 elasticsearch ql

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

作者:来自 Elastic Enrico Zimuel

从 elasticsearch-php v8.13.0 开始,你可以执行 ES|QL 查询并将结果映射到 stdClass 或自定义类的 PHP 对象。

ES|QL

ES|QL 是 Elasticsearch 8.11.0 中引入的一种新的 Elasticsearch 查询语言。 目前,它在技术预览版中可用。 它提供了一种强大的方法来过滤、转换和分析存储在 Elasticsearch 中的数据。

它利用 “管道” (|) 逐步操作和转换数据。 这种方法允许用户组合一系列操作,其中一个操作的输出成为下一个操作的输入,从而实现复杂的数据转换和分析。

例如,以下查询返回 sample_data 索引的前 3 个文档(行):

FROM sample_data
| LIMIT 3

使用案例

为了说明官方 PHP 客户端中开发的 ES|QL 功能,我们在 Elasticsearch 中存储了包含 81,828 本书 (54.4 MB) 的 CSV 文件,其中包括以下信息:

Title;Descrition;Author;Year;Publisher;Ratings

我们从公开的亚马逊图书评论数据集中提取了此列表。

我们使用以下 Elasticsearch 映射创建了一个 books 索引:

'mappings' : {'properties': {'title': {'type': 'text'},'description': {'type': 'text'},'author': {'type': 'text'},'year': {'type': 'short'},'publisher': {'type': 'keyword'},'rating': {'type': 'half_float'}}
}

rating 值是从 2.9 GB 的 Books_ rating.csv 文件中获取的排名评论的平均值。

在这里您可以找到我们用于批量导入 Elasticsearch 中所有书籍的 PHP 脚本。 使用 PHP 8.2.17 的批量操作需要 7 秒和 28 MB RAM。 根据建议的映射,Elasticsearch 中的索引大小约为 62 MB。

映射到对象或自定义类

我们可以使用 esql()->query() 端点在 PHP 中执行 ES|QL 查询。 该查询的结果是一个表数据结构。 这是使用 columns 和 valuse 字段以 JSON 形式表示的。 在 columns 字段中,我们有 name 和 type 定义。

下面是一个 ES|QL 查询示例,用于检索按用户排名评论排序的 Stephen King 撰写的前 10 本书:

$query = <<<EODFROM books| WHERE author == "Stephen King"| SORT rating DESC| LIMIT 10
EOD;$result = $client->esql()->query(['body' => ['query' => $query]
]);

Elasticsearch 的 JSON 结果如下所示:

{"columns": [{ "name": "author", "type": "text" },{ "name": "description", "type": "text" },{ "name": "publisher", "type": "keyword" },{ "name": "rating", "type": "double" },{ "name": "title", "type": "text" },{ "name": "year", "type": "integer" }],"values": [["Stephen King","The author ...","Turtleback",5.0,"How writers write",2002],["Stephen King","In Blockade Billy, a retired coach...","Simon and Schuster",5.0,"Blockade",2010],["Stephen King","A chilling collection of twenty horror stories.","Signet Book",4.55859375,"Night Shift (Signet)",1979],...]
}

在此示例中,我们有与一本书相关的 6 个属性(作者、描述、出版商、评级、标题、年份)和 10 个结果,所有书籍均由 Stephen King 撰写。

此处报告了 ES|QL 中所有支持的类型的列表。

$result 响应对象可以作为数组、字符串或对象进行访问(请参阅此处了解更多信息)。

使用对象接口,我们可以使用属性和索引来访问值。 例如,$result->values[0][4] 返回列表中第一本书 (0) 的标题 (4),$result->values[1][3] 返回列表中第一本书 (0) 的排名分数 (3)第二本书(1)等 请记住,PHP 中数组的索引从零开始。

这个接口对于某些用例来说已经足够好了,但大多数时候我们希望得到一个对象数组。

要将结果映射到对象数组中,我们可以使用 elasticsearch-php 的新 mapTo() 功能。

该函数可直接在Elasticsearch 响应对象中使用。 这意味着你可以按如下方式访问它:

$books = $result->mapTo(); // Array of stdClass
foreach ($books as $book) {printf("%s, %s, %d, Rating: %.2f\n",$book->author,$book->title,$book->year,$book->rating);
}

如果你有自定义 Book 类,则可以使用它来映射结果,如下所示:

class Book
{public string $author;public string $title;public string $description;public int $year;public float $rating;
}$books = $result->mapTo(Book::class); // Array of Book

如果你的类除了 ES|QL 结果中包含的属性之外还有其他属性,那么这也将起作用。 mapTo() 函数将仅使用作为 ES|QL 结果的列返回的属性。

您可以在此处下载本文中报告的所有示例。

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

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



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

相关文章

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

Java实现Elasticsearch查询当前索引全部数据的完整代码

《Java实现Elasticsearch查询当前索引全部数据的完整代码》:本文主要介绍如何在Java中实现查询Elasticsearch索引中指定条件下的全部数据,通过设置滚动查询参数(scrol... 目录需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后需求背景通常情况下

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.

PHP执行php.exe -v命令报错的解决方案

《PHP执行php.exe-v命令报错的解决方案》:本文主要介绍PHP执行php.exe-v命令报错的解决方案,文中通过图文讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录执行phpandroid.exe -v命令报错解决方案执行php.exe -v命令报错-PHP War