Hyperf使用ElasticSearch记录

2022-12-05,,

Hyperf 安装 Elasticsearch 协程客户端

hyperf/elasticsearch 主要为 elasticsearch-php 进行了客户端对象创建的工厂类封装,elasticsearch-php 默认使用 Guzzle Ring 客户端,在 hyperf/guzzle 中我们实现了协程版本的 Handler,所以可以直接使用 Hyperf\Elasticsearch\ClientBuilderFactory 创建一个新的 Builder。

安装

composer require hyperf/elasticsearch

创建客户端

class ElasticsearchService
{
protected $container;
protected Client $es_client; public function _initialize(): void
{
$this->container = ApplicationContext::getContainer();
$client_builder = $this->container->get(ClientBuilderFactory::class);
$builder = $client_builder->create();
$host = [
'https://账号:密码@地址:9200'
]; $this->es_client = $builder->setHosts($host)->build();
} }

这里的账号密码指的是创建 elasticsearch 的时候的账号密码。如果是用阿里云或者腾讯云服务,创建好了之后一样会有

这里只是创建了协程客户端,里面的实际方法是要自己重新定义的

开发基本步骤

1 安装 es 服务,也可以是腾讯云或者阿里云,腾讯云阿里云也只是提供 es 服务而已,并不是能直接看到数据。数据还是要在 kibana 里面查看。

2 创建协程客户端

3 创建 index。index 相当于 mysql 里面的库

4 创建 mapping mapping 可以理解成表。要存储数据要先定义好表。

5 index 方法推送单条数据。bulk 批量推送数据

6 search 搜索数据。

备注:

以下全网最全了

https://blog.csdn.net/qq_41911898/article/details/110089644 可以在这里查看每个方法的数据格式。

https://blog.csdn.net/qq_18361349/article/details/106369551 参考

完整代码

<?php

namespace App\Service\Common;

use App\Service\Service;
use Elasticsearch\Client;
use Hyperf\Elasticsearch\ClientBuilderFactory;
use Hyperf\Utils\ApplicationContext; /**
*
*/
class ElasticsearchService extends Service
{ /**
* @var
*/
protected $container; /**
* @var Client
*/
protected Client $es_client; public function _initialize(): void
{
$this->container = ApplicationContext::getContainer();
$client_builder = $this->container->get(ClientBuilderFactory::class);
$builder = $client_builder->create();
$host = [
'https://账号:密码@地址:9200'
]; $this->es_client = $builder->setHosts($host)->build();
} /**
* 创建index - 相当于MySQL的数据库
* @param string $index
* @return array
*/
public function createIndex(string $index): array
{
$params = [
'index' => $index,
];
return $this->es_client->indices()->create($params);
} /**
* 设置mapping
* @param $params
* @return array
*/
public function putMapping($params): array
{
return $this->es_client->indices()->putMapping($params);
} /**
* 获取mapping
* @param $params
* @return array
*/
public function getMapping($params): array
{
return $this->es_client->indices()->getMapping($params);
} /**
* 判断索引是否存在
* @param string $index
* @return bool
*/
public function indexExistsEs(string $index): bool
{
$params = [
'index' => $index,
];
return $this->es_client->indices()->exists($params);
} /**
* 删除索引
* @param string $index
* @return array|callable
*/
public function deleteIndex(string $index): callable|array
{
$params = [
'index' => $index
];
return $this->es_client->indices()->delete($params);
} /**
* 创建文档
* @param array $params
* @return array|callable
*/
public function indexEs(array $params): callable|array
{
$index_data = [
'index' => $params['index'],
'body' => $params['body'],
];
return $this->es_client->index($index_data);
} /**
* 批量创建文档
* @param array $params
* @return callable|array
*/
public function bulk(array $params): callable|array
{
return $this->es_client->bulk($params);
} /**
* 更新文档
* @param array $params
* $params = [
* 'index' => 'chat_data',
* 'id' => '文档id',
* 'doc' => [
* '字段名1' => '要修改的值',
* '字段名2' => '要修改的值',
* '字段名3' => '要修改的值',
* ]
* ]
* @return array|callable
*/
public function update(array $params): callable|array
{
$params = [
'index' => $params['index'],
'id' => $params['id'],
'body' => [
'doc' => $params['doc']
]
];
return $this->es_client->update($params);
} /**
* 删除文档
* @param $params
* @return array|callable
*/
public function deleteEs($params): callable|array
{
extract($params);
$delete_data = [
'index' => $index,
'type' => $type,
'id' => $id,
];
return $this->es_client->delete($delete_data);
} /**
* es搜索数据
* @param array $params
* @param int $page
* @param int $size
* @return array|callable
*/
public function search(array $params, int $page = 1, int $size = 15): callable|array
{
$search = $params['search'];
$params = [
'index' => $params['index'],
'from' => ($page <= 0) ? 0 : $page - 1,
'size' => $size
];
// 只有一个搜索字段时
if (count($search) == 1) {
$query = [
'match_phrase' => $search
];
} else {
$must = [];
foreach ($search as $k => $v) {
// 一定要把时间筛选弄出来,因为这里的条件类似where('xxxx','xxxx')
if(!in_array($k,['start_time','end_time'])) {
$must[] = ['match' => [$k => $v]];
}
}
$query['bool']['must'] = $must;
// 时间搜索
if(!empty($search['start_time'])) {
$filter = [
'range' => [
'start_time' =>[
'gte' => $search['start_time'],
'lte' => $search['end_time']
]
]
];
$query['bool']['filter'] = $filter;
}
} $params['body'] = [
'query' => $query,
];
return $this->es_client->search($params);
} }

Hyperf使用ElasticSearch记录的相关教程结束。

《Hyperf使用ElasticSearch记录.doc》

下载本文的Word格式文档,以方便收藏与打印。