Elasticsearch
组件从v2.5.26
版本起支持,底层基于ES 的 REST API
封装调用而成,并不依赖ES官方的SDK包。
目前组件只完成了对单索引表的日常ORM操作支持,对于需要join
多表的业务,还是需要执行原生的ES JSON
语句,组件提供了exec()
方法支持。
同时,由于基于ES 的 REST API
封装,所以该组件没有连接池的概念,组件底层基于定时器实现了节点的定时嗅探,分为异常和正常节点的探测;
如正常的节点探测失败,则会转移到异常队列中;反之,异常节点探测成功,则会添加回正常节点的队列中。
当我们需要调用组件提供了exec()
方法支持原生请求时,由于PHP的数组$arr = [];
在转义为JSON字符串时为[]
,这在ES中是不允许的。
所以使用时需要注意,当提交空数组时,要使用new \stdClass()
进行代替,该方法表示创建一个空对象。
例如要转义成下面的JSON格式:
{
"query" : {
"match" : {
"content" : "quick brown fox"
}
},
"highlight" : {
"fields" : {
"content" : {}
}
}
}
组件就需要这样写:
// 组件
use x\Elasticsearch;
// 动词库
use x\elasticsearch\tool\Client;
// ES组件
$Elasticsearch = new Elasticsearch();
// 执行原生查询
$body = [
'query' => [
'match' => [
'content' => 'quick brown fox'
]
],
'highlight' => [
'fields' => [
'content' => new \stdClass()
]
]
];
$res = $Elasticsearch->exec('/shop/_search', Client::GET, $body);
var_dump($res);