直接使用 composer 安装 ES 包就可以了,这里使用官方的 elasticsearch/elasticsearch
这个包。
composer require elasticsearch/elasticsearch
安装好以后,创建一个客户端。hosts如果是多个节点的集群,那么可以配置一个二维数组。
$hosts = [
'host' => '127.0.0.1',
'port' => '9200',
'scheme' => 'http',
'user' => '',
'pass' => ''
];
$client = ClientBuilder::create() //创建客户端
->setHosts($hosts) //hosts连接地址
->build();
如果想跳过ssl证书校验,可以添加一些curl的参数放进客户端
$curlParams = [//不校验ssl
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_SSL_VERIFYHOST => 0,
];
$client = ClientBuilder::create()
->setConnectionParams(['client' => ['curl' => $curlParams]]) //设置curl参数
->setHosts($hosts)
->build();
简单的增删改查在 elasticsearch 的文档中有介绍了,就不说了,可以看(https://www.elastic.co/guide/cn/elasticsearch/php/current/_quickstart.html)[文档]。
分词的话隐藏的比较深,文档中没有介绍,他放在了indices
这个 namespace 下面。如果看源码,可以在Endpoints/Indices
目录下面发现 Analyze.php
文件,当然了,除了分词,这里面还有其他功能,可以自己看。
这个文件也很简单啊,只有几个函数,就是设置请求的API地址,参数这些。
使用起来是这样的,我们用上面创建好的客户端。
$parmas['index'] = 'test' //这个是分词的index,也可以不加,加了请求的API就是 $index/_analyze
//请求体 这个就和你直接写DSL没区别了,参数啥的都一样,可以在 kibana里面试试参数
$parmas['body'] = [
'text' => 'php开发', //要分词的文字
'analyzer' => 'ik_smart', //分词器,可以不写
];
$client->indices()->analyze($params);
indices函数返回的就是 indices 文件夹的 namespace,对应文件在namespace/IndicesNamespace.php
,然后后面的函数就相当于文件名,她会拼接在 indices 后面,像我们上面请求的文件就是indices/Analyze.php
。具体的拼接就是在 namespace/IndicesNamespace.php
这个里面做的,有一个函数如下
/**
* $params['index'] = (string) The name of the index to scope the operation
* $params['body'] = (array) Define analyzer/tokenizer parameters and the text on which the analysis should be performed
*
* @param array $params Associative array of parameters
* @return array
* @see https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-analyze.html
*/
public function analyze(array $params = [])
{
//获取$params['index'], $params['body']
$index = $this->extractArgument($params, 'index');
$body = $this->extractArgument($params, 'body');
//设置endpoints处理类
$endpointBuilder = $this->endpoints;
//$endpoint 就相当于 indices/Analyze.php 这个文件了
$endpoint = $endpointBuilder('Indices\Analyze');
//设置参数,index, 请求体
$endpoint->setParams($params);
$endpoint->setIndex($index);
$endpoint->setBody($body);
//发起请求
return $this->performRequest($endpoint);
}
$this->endpoints 是一个函数,外面传进来的,函数内容如下
$this->endpoint = function ($class) use ($serializer) {
//拼接处理类
$fullPath = '\\Elasticsearch\\Endpoints\\' . $class;
//反射获取
$reflection = new ReflectionClass($fullPath);
$constructor = $reflection->getConstructor();
//执行
if ($constructor && $constructor->getParameters()) {
return new $fullPath($serializer);
} else {
return new $fullPath();
}
};