Hyperf 安装 Elasticsearch 协程客户端
hyperf/elasticsearch 主要为 elasticsearch-php 进行了客户端对象创建的工厂类封装,elasticsearch-php 默认使用 Guzzle Ring 客户端,在 hyperf/guzzle 中我们实现了协程版本的 Handler,所以可以直接使用 HyperfElasticsearchClientBuilderFactory 创建一个新的 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 AppServiceCommon; use AppServiceService; use ElasticsearchClient; use HyperfElasticsearchClientBuilderFactory; use HyperfUtilsApplicationContext; /** * */ 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); } }