Enregistrements Hyperf à l'aide d'ElasticSearch

Hyperf installe le client coroutine Elasticsearch

hyperf/elasticsearch encapsule principalement la classe d'usine pour la création d'objets client pour elasticsearch-php. elasticsearch-php utilise le client Guzzle Ring par défaut. Dans hyperf/guzzle, nous implémentons la version coroutine de Handler, vous pouvez donc directement utiliser Hyperf\Elasticsearch \ ClientBuilderFactory crée un nouveau Builder.

  • Installer
composer require hyperf/elasticsearch
  • créer un 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();
    }

}

Le mot de passe du compte fait ici référence au mot de passe du compte lors de la création d'elasticsearch. Si vous utilisez les services Alibaba Cloud ou Tencent Cloud, il y aura également

Ici, nous créons simplement un client coroutine, et la méthode réelle à l'intérieur doit être redéfinie par nous-mêmes

Étapes de base du développement

1 Installez le service es, qui peut également être Tencent Cloud ou Alibaba Cloud. Tencent Cloud et Alibaba Cloud ne fournissent que des services es et ne peuvent pas voir directement les données. Les données doivent encore être visualisées dans kibana.

2 Créer un client coroutine

3 Créez un index. index est équivalent à la bibliothèque dans mysql

4 Créer une cartographie La cartographie peut être comprise comme un tableau. Pour stocker des données, vous devez d'abord définir une table.

5 La méthode d'index pousse une seule donnée. Pousser les données en masse par lots

6 recherche Recherche de données.

Remarque:

Ce qui suit est le plus complet de tout le réseau

Elasticsearch Grammar Encyclopedia_Blog d'iQnoon-CSDN Blog_elasticsearch Grammar  Vous pouvez voir le format de données de chaque méthode ici.

 PHP utilise la référence blog-CSDN blog_elasticsearch php du programmeur elasticsearch_lazy

code complet

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

}

Je suppose que tu aimes

Origine blog.csdn.net/weixin_47367099/article/details/127471121
conseillé
Classement