Elasticsearch PHP客户端(elasticsearch-php):强大的搜索与分析工具
Elasticsearch 是一个基于 Apache Lucene 构建的分布式搜索与分析系统。它能够近乎实时地存储、搜索和分析大量数据。为了从 PHP 应用程序与 Elasticsearch 交互,官方提供了客户端——elasticsearch-php。该库提供了便捷的 API,用于执行从文档索引到复杂搜索查询和聚合的所有操作。
本文将详细介绍 elasticsearch-php 的安装、配置及主要功能。您将学习如何连接到集群、创建索引、添加文档、执行搜索以及使用过滤和数据聚合等高级功能。
安装 elasticsearch-php
该库通过 Composer 分发。在项目根目录下执行以下命令进行安装:
composer require elasticsearch/elasticsearch安装后,composer.json 文件中将出现该依赖项。请确保您已安装 PHP 7.4 或更高版本,并已启用 json 扩展。
连接到 Elasticsearch 服务器
第一步是创建客户端。对于本地服务器(默认情况下 Elasticsearch 监听 9200 端口),代码如下:
<?phprequire 'vendor/autoload.php';
use Elastic\\Elasticsearch\\ClientBuilder;
$client = ClientBuilder::create() ->setHosts(['localhost:9200']) ->build();?>如果您的服务器需要身份验证(例如通过用户名/密码或 API 密钥),请传递参数:
$client = ClientBuilder::create() ->setHosts(['https://user:pass@localhost:9200']) ->setSSLVerification(false) // 仅用于开发环境 ->build();索引与文档操作
Elasticsearch 将数据存储在索引中(类似于 SQL 中的表)。让我们创建一个带有简单映射的 products 索引:
$params = [ 'index' => 'products', 'body' => [ 'settings' => [ 'number_of_shards' => 1, 'number_of_replicas' => 0 ], 'mappings' => [ 'properties' => [ 'title' => ['type' => 'text'], 'price' => ['type' => 'float'], 'description' => ['type' => 'text'], 'category' => ['type' => 'keyword'] ] ] ]];
$response = $client->indices()->create($params);现在添加几个文档:
$documents = [ ['title' => '戴尔 XPS 15 笔记本电脑', 'price' => 1200.00, 'description' => '适用于工作的强大超极本', 'category' => 'electronics'], ['title' => '《PHP 专业开发》书籍', 'price' => 45.50, 'description' => '深入学习 PHP 高级知识', 'category' => 'books'], ['title' => '索尼 WH-1000XM5 耳机', 'price' => 350.00, 'description' => '带降噪功能的无线耳机', 'category' => 'electronics']];
foreach ($documents as $id => $doc) { $params = [ 'index' => 'products', 'id' => $id + 1, 'body' => $doc ]; $response = $client->index($params);}搜索文档
在 title 字段上执行全文搜索:
$params = [ 'index' => 'products', 'body' => [ 'query' => [ 'match' => [ 'title' => '笔记本电脑' ] ] ]];
$response = $client->search($params);$hits = $response['hits']['hits'];
foreach ($hits as $hit) { echo "ID: " . $hit['_id'] . " | 标题: " . $hit['_source']['title'] . " | 价格: " . $hit['_source']['price'] . "";}