Registros de Hyperf usando ElasticSearch

Hyperf instala el cliente de corrutina de Elasticsearch

hyperf/elasticsearch encapsula principalmente la clase de fábrica de creación de objetos de cliente para elasticsearch-php. elasticsearch-php usa el cliente Guzzle Ring de forma predeterminada. En hyperf/guzzle, implementamos la versión coroutine de Handler, por lo que puede usar directamente Hyperf\Elasticsearch \ ClientBuilderFactory crea un nuevo constructor.

  • Instalar
composer require hyperf/elasticsearch
  • crear cliente
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();
    }

}

La contraseña de la cuenta aquí se refiere a la contraseña de la cuenta al crear elasticsearch. Si utiliza los servicios de Alibaba Cloud o Tencent Cloud, también habrá

Aquí solo creamos un cliente coroutine, y el método real interno debe ser redefinido por nosotros mismos.

Pasos básicos del desarrollo.

1 Instale el servicio es, que también puede ser Tencent Cloud o Alibaba Cloud. Tencent Cloud y Alibaba Cloud solo brindan servicios es y no pueden ver los datos directamente. Los datos todavía necesitan ser vistos en kibana.

2 Crear un cliente corrutina

3 Cree un índice. índice es equivalente a la biblioteca en mysql

4 Crear mapeo El mapeo puede entenderse como una tabla. Para almacenar datos, primero debe definir una tabla.

5 El método de índice inserta una sola pieza de datos. Empuje masivo de datos en lotes

6 buscar Buscar datos.

Observación:

El siguiente es el más completo de toda la red.

Elasticsearch Grammar Encyclopedia_iQnoon's Blog-CSDN Blog_elasticsearch Grammar  Puede ver el formato de datos de cada método aquí.

 PHP usa la referencia de php blog-CSDN blog_elasticsearch del programador elasticsearch_lazy

código completo

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

}

Supongo que te gusta

Origin blog.csdn.net/weixin_47367099/article/details/127471121
Recomendado
Clasificación