推荐直接使用官方 elasticsearch-php 客户端(elasticsearch/elasticsearch Composer 包),支持7.x/8.x版本,通过Composer安装、ClientBuilder初始化连接,支持Basic Auth/HTTPS,可索引文档、执行match/bool查询、分页高亮,并需捕获RuntimeException类异常处理错误。

PHP 接入 Elasticsearch,推荐直接使用官方维护的 elasticsearch-php 客户端(即 elasticsearch/elasticsearch Composer 包),它基于 HTTP 协议与 ES 交互,支持 7.x 和 8.x 版本(注意版本兼容性),开箱即用且文档完善。
安装与基础连接
通过 Composer 安装最新稳定版(以 8.x 为例):
composer require elasticsearch/elasticsearch:^8.0
初始化客户端时需指定 ES 地址、端口及可选认证信息。若 ES 启用了 HTTPS 或 Basic Auth,需配置 HttpClientOptions:
- 单节点连接(开发环境):
$client = ClientBuilder::create()->setHosts(['http://127.0.0.1:9200'])->build(); - 带 Basic Auth 的 HTTPS 连接:
$client = ClientBuilder::create()<br> ->setHosts(['https://es.example.com:9200'])<br> ->setBasicAuthentication('user', 'pass')<br> ->build();
索引文档与简单检索
插入一条文档(自动创建索引,如不存在):
立即学习“PHP免费学习笔记(深入)”;
$params = [
'index' => 'products',
'id' => '1001',
'body' => ['name' => '无线耳机', 'price' => 299, 'category' => 'electronics']
];
$client->index($params);
执行全文检索(match 查询):
$params = [
'index' => 'products',
'body' => [
'query' => [
'match' => ['name' => '耳机']
]
]
];
$response = $client->search($params);
$hits = $response['hits']['hits']; // 获取命中文档数组
返回结果中 $hits 是标准 ES 响应结构,每项含 _source(原始文档)、_id、_score 等字段。
构建常用查询语句
实际业务中常组合多种条件。以下为高频场景示例:
-
多字段匹配 + 过滤:
'query' => [<br> 'bool' => [<br> 'must' => [['match' => ['name' => '耳机']], ['match' => ['category' => 'electronics']]],<br> 'filter' => [['range' => ['price' => ['lte' => 500]]]]<br> ]<br>]
-
分页与高亮(适用于搜索页):
在body中加入:
'from' => 0, 'size' => 10,<br>'highlight' => ['fields' => ['name' => new \stdClass()]]
响应中可通过$hit['_highlight']['name'][0]获取高亮 HTML 片段。
错误处理与调试建议
ES 请求失败时,客户端抛出 Elasticsearch\Common\Exceptions\RuntimeException 及其子类(如 BadRequest400Exception)。建议捕获并记录具体错误信息:
try {
$response = $client->search($params);
} catch (BadRequest400Exception $e) {
error_log('ES 查询语法错误:' . $e->getMessage());
} catch (Exception $e) {
error_log('ES 请求异常:' . $e->getMessage());
}
调试阶段可在请求前启用日志输出:
- 设置
ClientBuilder::setLogger()接入 Monolog; - 或临时开启 cURL 详细日志:
ClientBuilder::setConnectionPool(...)->setConnectionParams(['verbose' => true])(仅限开发)。
注意:生产环境避免暴露原始 ES 错误堆栈,尤其涉及映射或权限问题。



















