Hyperf使用ElasticSearch记录

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);     }  }  

发表评论

评论已关闭。

相关文章