0

0

告别繁琐JSON:如何用Composer和SpatieQueryBuilder优雅构建Elasticsearch查询

霞舞

霞舞

发布时间:2025-10-04 10:34:02

|

964人浏览过

|

来源于php中文网

原创

告别繁琐json:如何用composer和spatiequerybuilder优雅构建elasticsearch查询

可以通过一下地址学习composer学习地址

告别 JSON 地狱:Elasticsearch 查询的痛点

如果你曾与 Elasticsearch 打过交道,那么对那些由 mustshouldfilteraggregations 等组成的层层嵌套的 JSON 查询结构一定不陌生。构建一个简单的搜索可能还好,但当你的搜索需求变得复杂,比如需要组合多个条件、进行范围查询、模糊匹配、或者需要统计聚合数据时,手动拼接这些 JSON,不仅耗时耗力,还极易出错,尤其是在查询逻辑复杂时,简直是一场噩梦。

想象一下这样的场景:你需要实现一个商品搜索功能,用户可以根据关键词搜索商品名称,同时可以根据价格区间、商品分类进行筛选,并且还需要展示不同分类下的商品数量。如果直接使用 Elasticsearch PHP 官方客户端,你最终会得到一个庞大而难以阅读的 PHP 数组,它几乎就是 JSON 结构的翻版。每次修改查询,你都需要仔细检查括号和逗号,生怕引入语法错误。这不仅降低了开发效率,也让代码的可维护性变得极差。

救星驾到:Spatie Elasticsearch Query Builder

幸好,PHP 社区不乏优秀的解决方案。今天,我们要介绍的便是 spatie/elasticsearch-query-builder,一个由 Spatie 团队打造的轻量级但功能强大的查询构建器。它将繁琐的 JSON 结构抽象成一套直观的 PHP 对象和方法链,让你可以用编写普通 PHP 代码的方式来构建复杂的 Elasticsearch 查询。

这个库的核心理念是提供一个流畅的 PHP API,让你能够像操作 Laravel 的 Eloquent Query Builder 一样,链式调用方法来定义你的 Elasticsearch 查询。它支持绝大多数常见的 Elasticsearch 查询类型、聚合、排序、分页以及多索引查询,极大地简化了开发流程。

轻松集成:使用 Composer 安装

spatie/elasticsearch-query-builder 是一个标准的 Composer 包,安装过程非常简单:

composer require spatie/elasticsearch-query-builder

小贴士: 如果你的项目还在使用 elasticsearch/elasticsearch v7 版本,那么你需要安装 spatie/elasticsearch-query-builder 的 v1 版本,可以通过 composer require spatie/elasticsearch-query-builder:^1.0 来指定。对于新项目或已升级到 Elasticsearch v8 的项目,直接安装最新版本即可。

实战演练:构建你的第一个 Elasticsearch 查询

安装完成后,你就可以开始使用 Spatie\ElasticsearchQueryBuilder\Builder 类来构建查询了。首先,你需要一个 Elasticsearch 客户端实例(通常通过 Elastic\Elasticsearch\ClientBuilder 创建)。

Viggle AI
Viggle AI

Viggle AI是一个AI驱动的3D动画生成平台,可以帮助用户创建可控角色的3D动画视频。

下载
build();

// 2. 创建查询构建器实例
$builder = (new Builder($client))
    ->index('products'); // 指定要查询的索引

// 3. 添加查询条件:匹配商品名称中包含 'apple' 的文档,并设置模糊度
$builder->addQuery(MatchQuery::create('name', 'apple', fuzziness: 2));

// 4. 添加筛选条件:价格在 500 到 1500 之间
$builder->addQuery(
    RangeQuery::create('price')
        ->gte(500) // 大于等于 500
        ->lte(1500), // 小于等于 1500
    'filter' // 使用 filter 类型,不影响评分
);

// 5. 添加聚合:获取最高价格
$builder->addAggregation(MaxAggregation::create('max_price', 'price'));

// 6. 添加排序:按创建时间降序排列
$builder->addSort(Sort::create('created_at', Sort::DESC));

// 7. 设置分页:每页 10 条,从第 2 页开始 (即跳过前 10 条)
$builder->size(10)->from(10);

// 8. 执行搜索
$response = $builder->search();

// 9. 处理搜索结果
echo "查询耗时: " . $response['took'] . "ms\n";
echo "总命中数: " . $response['hits']['total']['value'] . "\n";

echo "--- 结果列表 ---\n";
foreach ($response['hits']['hits'] as $hit) {
    echo "ID: " . $hit['_id'] . ", 名称: " . $hit['_source']['name'] . ", 价格: " . $hit['_source']['price'] . "\n";
}

echo "--- 聚合结果 ---\n";
if (isset($response['aggregations']['max_price']['value'])) {
    echo "最高价格: " . $response['aggregations']['max_price']['value'] . "\n";
}

在上面的例子中,我们使用了以下关键功能:

  • index(): 指定要查询的 Elasticsearch 索引。
  • addQuery(): 添加各种查询条件。这里我们使用了 MatchQuery 进行关键词匹配,RangeQuery 进行范围筛选。第二个参数可以指定查询的类型(must, should, filter, must_not),默认为 must
  • addAggregation(): 添加聚合查询,例如 MaxAggregation 用于获取最大值。库中还提供了 TermsAggregation (用于分类统计)、FilterAggregation 等多种聚合类型。
  • addSort(): 添加排序规则,Sort::create('field', Sort::DESC) 定义了按字段降序排列。
  • size()from(): 用于实现分页功能,分别设置返回结果的数量和偏移量。
  • search(): 执行构建好的查询,并返回 Elasticsearch 的原始响应。
  • getPayload(): 如果你只是想查看构建的 JSON 结构而不执行查询,可以使用此方法。

更多高级用法

spatie/elasticsearch-query-builder 还支持许多高级功能:

  • MultiMatchQuery: 在多个字段上进行匹配查询。
  • NestedQuery: 处理 Elasticsearch 中的嵌套文档。
  • BoolQuery: 更灵活地组合 mustshouldfiltermust_not 条件。
  • fields(): 仅检索文档的特定字段,而不是整个 _source
  • highlight(): 添加高亮显示设置,用于搜索结果中的关键词高亮。
  • MultiBuilder: 允许在一个请求中执行多个独立的 Elasticsearch 查询,大大减少了网络往返次数。

这些功能都通过直观的 PHP 方法链实现,极大地提升了开发效率和代码的可读性。

Spatie Query Builder 的优势总结

使用 spatie/elasticsearch-query-builder 结合 Composer,为 Elasticsearch 查询带来了诸多好处:

  1. 告别 JSON 地狱:将复杂的 JSON 结构转化为优雅、可读的 PHP 代码,让你专注于业务逻辑而非语法细节。
  2. 提升开发效率:借助 IDE 的自动补全和类型提示,你可以快速构建查询,减少查阅 Elasticsearch 文档的时间。
  3. 增强代码可维护性:查询逻辑清晰明了,便于团队协作和未来的功能扩展。新成员可以更快地理解现有查询,修改也更加安全。
  4. 减少错误:类型安全的 API 设计,有效避免了因手动拼接 JSON 字符串或数组带来的语法错误和逻辑漏洞。
  5. 轻量且灵活:作为一个轻量级库,它不会引入额外的复杂性,同时提供了足够的灵活性来应对各种查询需求。
  6. Spatie 品质保证:Spatie 团队以其高质量的开源 PHP 包而闻名,你可以放心地在生产环境中使用。

结语

如果你也曾被 Elasticsearch 复杂的查询语法所困扰,那么 spatie/elasticsearch-query-builder 绝对值得一试。它不仅能解放你的双手,让你的代码更加优雅,还能显著提升你的开发体验。结合 Composer 的强大包管理能力,你可以轻松地将这个利器集成到你的 PHP 项目中,让 Elasticsearch 的强大功能触手可及,而不再是令人头疼的挑战。赶快尝试一下,体验一下用 PHP 语言流畅构建 Elasticsearch 查询的乐趣吧!

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2737

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1670

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1530

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

975

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1444

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1235

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1549

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1307

2023.11.13

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

9

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
第二十四期_PHP8编程
第二十四期_PHP8编程

共86课时 | 3.4万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 2.4万人学习

第二十三期_PHP编程
第二十三期_PHP编程

共93课时 | 6.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号