首页 > 其他分享 >Hyperf使用ElasticSearch记录

Hyperf使用ElasticSearch记录

时间:2022-10-20 20:36:20浏览次数:86  
标签:index return 记录 Hyperf client params ElasticSearch array es

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

}

标签:index,return,记录,Hyperf,client,params,ElasticSearch,array,es
From: https://www.cnblogs.com/chenrunxuan/p/16811156.html

相关文章

  • 有关反向代理的记录
    反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知......
  • springcloud学习记录day4 -- 消息队列RubbitMQ
    同步通信和异步通信微服务间通讯有同步和异步两种方式:同步通讯:就像打电话,需要实时响应。异步通讯:就像发邮件,不需要马上回复。同步通信我们之前学习的Feign调用就属于......
  • 记录--一些看起来很叼难的前端面试题
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助1.ajax最大的缺陷「对搜索引擎不友好,并且存在跨域问题限制」搜索引擎会屏蔽掉所有baijavascript代码du,......
  • Elasticsearch 字段折叠的使用
    在Elasticsearch5.x有一个字段折叠(FieldCollapsing,#22337)的功能非常有意思,在这里分享一下, 字段折叠是一个很有历史的需求了,可以看这个issue,编号#256,最初是2010年7月......
  • 记录|在WordPress设立HTTPS
    TL;DR:根据HTTPSforWordPress–WordPress.orgForums上的指示操作即可。获取HTTPS证书到Certbot上去,填MyHTTPwebsiteisrunning[Nginx]on[Ubuntu20]......
  • ARC151 简要记录(A-E)
    VP4/6,E读错了。A:字典序最小,贪心,后面能填即可。B:处理字典序\(A<B\),经典枚举lcp。C:一眼鉴定为公平游戏且能分成若干段,暴力找sg函数规律。D:观察到不同位间操作顺......
  • 记录python3.7版本中 Django+celery 启动报错
     虚拟环境启动I报错Traceback(mostrecentcalllast):File"/data/.virtualenvs/cmdb/lib/python3.7/site-packages/gunicorn/arbiter.py",line589,inspawn_w......
  • 调试遇到的一些问题记录【持续记录】
    1.std::vector作为入参,跨dll传输引起的崩溃问题崩溃现象:监控传入的std变量:在dll外部时,std::vector_Myval2为std_Container_base0,在dll内部时,std::vector_Myval2为std_Con......
  • 根号算法学习记录
    根号算法专题分块基础根号平衡对于两个不同方面的复杂度,直接做的话一个很小,一个很大,我们用根号使得两者复杂度同阶级以降低总复杂度。这个叫根号平衡。一个典型的应用......
  • windows端ping 工具带时间戳保存ping记录到本地
    新建txt文件,复制代码保存到新建文件后,修改文件后缀为.bat文件后。双击运行后会在本地脚本相同路径生成日志记录文件@echooffset/phost=host:setlogfile=ping_%host......