Hyperf records using ElasticSearch

Hyperf installs the Elasticsearch coroutine client

hyperf/elasticsearch mainly encapsulates the factory class of client object creation for elasticsearch-php. elasticsearch-php uses the Guzzle Ring client by default. In hyperf/guzzle, we implement the coroutine version of Handler, so you can directly use Hyperf\Elasticsearch \ClientBuilderFactory creates a new Builder.

  • Install
composer require hyperf/elasticsearch
  • create client
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();
    }

}

The account password here refers to the account password when creating elasticsearch. If you use Alibaba Cloud or Tencent Cloud services, there will also be

Here we just create a coroutine client, and the actual method inside needs to be redefined by ourselves

Basic steps of development

1 Install the es service, which can also be Tencent Cloud or Alibaba Cloud. Tencent Cloud and Alibaba Cloud only provide es services, and cannot directly see the data. The data still needs to be viewed in kibana.

2 Create a coroutine client

3 Create an index. index is equivalent to the library in mysql

4 Create mapping Mapping can be understood as a table. To store data, you must first define a table.

5 The index method pushes a single piece of data. bulk Push data in batches

6 search Search data.

Remark:

The following is the most complete in the whole network

Elasticsearch Grammar Encyclopedia_iQnoon's Blog-CSDN Blog_elasticsearch Grammar  You can view the data format of each method here.

PHP uses elasticsearch_lazy programmer's blog-CSDN blog_elasticsearch php  reference

full code

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

}

Guess you like

Origin blog.csdn.net/weixin_47367099/article/details/127471121