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

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

API-环境对象

学习目标: 掌握环境对象 学习内容: 环境对象作用 环境对象: 指的是函数内部特殊的变量this,它代表着当前函数运行时所处的环境。 作用: 弄清楚this的指向,可以让我们代码更简洁。 函数的调用方式不同,this指代的对象也不同。【谁调用,this就是谁】是判断this指向的粗略规则。直接调用函数,其实相当于是window.函数,所以this指代window。

Python分解多重列表对象,isinstance实现

“”“待打印的字符串列表:['ft','bt',['ad',['bm','dz','rc'],'mzd']]分析可知,该列表内既有字符对象,又有列表对象(Python允许列表对象不一致)现将所有字符依次打印并组成新的列表”“”a=['ft','bt',['ad',['bm','dz','rc'],'mzd']]x=[]def func(y):for i in y:if isinst

PHP的基本语法有哪些?

PHP的基本语法包括以下几个方面: PHP标记:PHP脚本以<?php开始,以?>结束。这是PHP文件的默认文件扩展名是.php。 变量和常量:变量以$符号开头,其后是变量的名称。常量使用define()函数定义,例如define("常量名", 常量值);。 数据类型:PHP支持多种数据类型,如整型、浮点型、字符串型等。 注释:PHP支持单行注释(用//表示)和多行注释(用/* */表示

php json_encode 大括号中括号

当array是一个从0开始的连续数组时,json_encode出来的结果是一个由[]括起来的字符串。 而当array是不从0开始或者不连续的数组时,json_encode出来的结果是一个由{}括起来的key-value模式的字符串。 当字符串为[1,1,1] 这种模式时,json_decode默认解析出来的结果是一个数组。 当字符串为{"1":1,"2":1} 这种模式时,json_

PHP序列化用到的构造:__sleep() __wakeup()

串行化serialize可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输. 然后再反串行化还原为原来的数据. 你在反串行化类的对象之前定义的类,PHP可以成功地存储其对象的属性和方法. 有时你可能需要一个对象在反串行化后立即执行. 为了这样的目的,PHP会自动寻找__sleep和__wakeup方法.   当一个对象被串行化,PHP会

PHP生成csv格式Excel,秒级别实现excel导出功能

防止报超内存,兼容中文,兼容科学技术法。 爽。。。。很爽。。。。 /*** 告诉浏览器下载csv文件* @param string $filename*/public static function downloadCsv($data, $filename, $encoding = 'utf-8'){header("Content-type: text/csv");header("Conten

PHP 读取或生成大的Excel

场景,在很多情况下,需要读取Excel文件。 常用的有PHPExcel包或者使用 maatwebsite/excel 包 但是使用这个包读取或生成excel,如果excel文件过大,很容易出现超内存情况。 解决方法: 上传:要求上传者使用.csv 文件上传。然后使用php自带的 fgetcsv()函数来读取文件。http://php.net/manual/zh/function.fgetc

文件权限修改为777,php failed to open stream: Permission denied

记录一次在谷歌云上的异常诡异的事件: 环境 centos7.5 nginx php7.0 mysql 问题: 问题一 我用相同的nginx配置,只是修改了nginx root目录。 打开/var/www/html/ 这个目录就报 2018/06/22 04:35:03 [error] 15840#0: *438 FastCGI sent in stderr: “Primary scr

PHP ODBC:连接数据库的桥梁

PHP ODBC:连接数据库的桥梁 PHP ODBC(Open Database Connectivity)是一个允许PHP应用程序连接到各种数据库管理系统的扩展。它为PHP提供了一个标准的数据库访问接口,使得开发者可以编写不依赖于特定数据库系统的代码。本文将详细介绍PHP ODBC的概念、工作原理、使用方法以及在实际开发中的应用。 什么是PHP ODBC? PHP ODBC扩展使得PHP能