
如果你曾与 Elasticsearch 打过交道,那么对那些由 must、should、filter、aggregations 等组成的层层嵌套的 JSON 查询结构一定不陌生。构建一个简单的搜索可能还好,但当你的搜索需求变得复杂,比如需要组合多个条件、进行范围查询、模糊匹配、或者需要统计聚合数据时,手动拼接这些 JSON,不仅耗时耗力,还极易出错,尤其是在查询逻辑复杂时,简直是一场噩梦。
想象一下这样的场景:你需要实现一个商品搜索功能,用户可以根据关键词搜索商品名称,同时可以根据价格区间、商品分类进行筛选,并且还需要展示不同分类下的商品数量。如果直接使用 Elasticsearch PHP 官方客户端,你最终会得到一个庞大而难以阅读的 PHP 数组,它几乎就是 JSON 结构的翻版。每次修改查询,你都需要仔细检查括号和逗号,生怕引入语法错误。这不仅降低了开发效率,也让代码的可维护性变得极差。
幸好,PHP 社区不乏优秀的解决方案。今天,我们要介绍的便是 spatie/elasticsearch-query-builder,一个由 Spatie 团队打造的轻量级但功能强大的查询构建器。它将繁琐的 JSON 结构抽象成一套直观的 PHP 对象和方法链,让你可以用编写普通 PHP 代码的方式来构建复杂的 Elasticsearch 查询。
这个库的核心理念是提供一个流畅的 PHP API,让你能够像操作 Laravel 的 Eloquent Query Builder 一样,链式调用方法来定义你的 Elasticsearch 查询。它支持绝大多数常见的 Elasticsearch 查询类型、聚合、排序、分页以及多索引查询,极大地简化了开发流程。
spatie/elasticsearch-query-builder 是一个标准的 Composer 包,安装过程非常简单:
<code class="bash">composer require spatie/elasticsearch-query-builder</code>
小贴士: 如果你的项目还在使用 elasticsearch/elasticsearch v7 版本,那么你需要安装 spatie/elasticsearch-query-builder 的 v1 版本,可以通过 composer require spatie/elasticsearch-query-builder:^1.0 来指定。对于新项目或已升级到 Elasticsearch v8 的项目,直接安装最新版本即可。
安装完成后,你就可以开始使用 Spatie\ElasticsearchQueryBuilder\Builder 类来构建查询了。首先,你需要一个 Elasticsearch 客户端实例(通常通过 Elastic\Elasticsearch\ClientBuilder 创建)。
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
30
<pre class="brush:php;toolbar:false;"><?php
require 'vendor/autoload.php';
use Elastic\Elasticsearch\ClientBuilder;
use Spatie\ElasticsearchQueryBuilder\Aggregations\MaxAggregation;
use Spatie\ElasticsearchQueryBuilder\Builder;
use Spatie\ElasticsearchQueryBuilder\Queries\MatchQuery;
use Spatie\ElasticsearchQueryBuilder\Queries\RangeQuery;
use Spatie\ElasticsearchQueryBuilder\Sorts\Sort;
// 1. 初始化 Elasticsearch 客户端
$client = ClientBuilder::create()->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: 更灵活地组合 must、should、filter、must_not 条件。fields(): 仅检索文档的特定字段,而不是整个 _source。highlight(): 添加高亮显示设置,用于搜索结果中的关键词高亮。MultiBuilder: 允许在一个请求中执行多个独立的 Elasticsearch 查询,大大减少了网络往返次数。这些功能都通过直观的 PHP 方法链实现,极大地提升了开发效率和代码的可读性。
使用 spatie/elasticsearch-query-builder 结合 Composer,为 Elasticsearch 查询带来了诸多好处:
如果你也曾被 Elasticsearch 复杂的查询语法所困扰,那么 spatie/elasticsearch-query-builder 绝对值得一试。它不仅能解放你的双手,让你的代码更加优雅,还能显著提升你的开发体验。结合 Composer 的强大包管理能力,你可以轻松地将这个利器集成到你的 PHP 项目中,让 Elasticsearch 的强大功能触手可及,而不再是令人头疼的挑战。赶快尝试一下,体验一下用 PHP 语言流畅构建 Elasticsearch 查询的乐趣吧!
以上就是告别繁琐JSON:如何用Composer和SpatieQueryBuilder优雅构建Elasticsearch查询的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号