龙行博客

走路看风景,经历看人生,岁月留痕迹,人生留轨迹,17的历史,18的豪情,时间的匆忙,人生的风景,放开心胸往前走,成功再远行,放开理想往前走,梦想再行动。
现在位置:首页 > 编程语言 > PHP > Hyperf 操作 Elasticsearch 协程客户端

Hyperf 操作 Elasticsearch 协程客户端

龙行    PHP    2022-11-9    173    0评论    

Hyperf 操作 Elasticsearch 协程客户端

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

  • 安装

composer require hyperf/elasticsearch
  • 创建客户端

lass 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 = [
           //这里的账号密码指的是创建 elasticsearch 的时候的账号密码。如果是用阿里云或者腾讯云服务,创建好了之后一样会有
           'https://账号:密码@地址:9200'
       ];
       $this->es_client = $builder->setHosts($host)->build();
   }
}

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

开发基本步骤

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

}



评论一下 分享本文 赞助站长

赞助站长X

扫码赞助站长
联系站长
龙行博客
  • 版权申明:此文如未标注转载均为本站原创,自由转载请表明出处《龙行博客》。
  • 本文网址:https://www.liaotaoo.cn/419.html
  • 上篇文章:Hyperf漏斗计数器限流
  • 下篇文章:PHP生成唯一RequestID类
  • swoole hyperf
快捷导航
联系博主
在线壁纸
给我留言
四四五五
音乐欣赏
返回顶部