Maison >cadre php >PensezPHP >Comment effectuer une opération de recherche en texte intégral Elasticsearch dans ThinkPHP6 ?

Comment effectuer une opération de recherche en texte intégral Elasticsearch dans ThinkPHP6 ?

PHPz
PHPzoriginal
2023-06-12 10:38:561778parcourir

Avec le développement rapide d'Internet et l'augmentation de la quantité de données, comment effectuer efficacement une recherche en texte intégral est devenu un problème auquel de plus en plus de développeurs sont confrontés. Elasticsearch est un moteur de recherche en texte intégral populaire capable de traiter rapidement de grandes quantités de données textuelles, de les récupérer et de les analyser, ce qui en fait l'outil de choix pour de nombreuses applications Web. Désormais, ThinkPHP6 a également commencé à prendre en charge les opérations de recherche en texte intégral d'Elasticsearch, offrant ainsi aux développeurs une solution de recherche plus efficace.

Tout d'abord, nous devons installer la bibliothèque de support Elasticsearch dans ThinkPHP6. Cela peut être fait en ajoutant le code suivant dans le fichier composer.json :

"require" : {#🎜 🎜#

"elasticsearch/elasticsearch": "^7.0"

}

Ensuite, exécutez la commande composer update dans le répertoire racine du projet pour terminer l'installation de la bibliothèque de support Elasticsearch.

Ensuite, nous allons créer un fournisseur de services Elasticsearch pour lier l'instance client Elasticsearch au conteneur afin que nous puissions l'utiliser dans notre application à tout moment via l'injection de dépendances. Dans le répertoire App/Provider, créez le fichier ElasticsearchServiceProvider.php avec le code suivant :

namespace appprovider;

use ElasticsearchClientBuilder;

use thinkService;#🎜🎜 ## 🎜🎜#class ElasticsearchServiceProvider extends Service
{

public function register()
{
    // 获取config/elasticsearch.php配置
    $config = $this->app->config->get('elasticsearch');

    // 创建Elasticsearch客户端实例
    $client = ClientBuilder::create()->setHosts($config['hosts'])->build();

    // 将Elasticsearch客户端实例绑定到容器中
    $this->app->bind('elasticsearch', $client);
}

}

Dans cet exemple, nous récupérons d'abord l'hôte Elasticsearch à partir de la configuration config/elasticsearch.php adresse du fichier, puis utilisez la classe ClientBuilder pour créer une instance client Elasticsearch et la lier au conteneur de l'application afin que nous puissions l'utiliser pour effectuer des opérations de recherche en texte intégral à tout moment.

Ensuite, nous montrerons comment effectuer des opérations de recherche en texte intégral dans les applications ThinkPHP6. Ici, nous créons une classe de service ElasticsearchService, qui contient plusieurs méthodes simples pour effectuer des opérations de recherche. Le code est le suivant :

namespace appservice;

use ElasticsearchClient;

use ElasticsearchCommonExceptionsMissing404Exception;

use Throwable;


class ElasticsearchService # 🎜🎜#{

protected $client;

public function __construct(Client $client)
{
    $this->client = $client;
}

/**
 * 创建索引
 *
 * @param string $indexName 索引名称
 * @return bool
 */
public function createIndex(string $indexName)
{
    $params = [
        'index' => $indexName,
        'body' => [
            'mappings' => [
                'properties' => [
                    'title' => [
                        'type' => 'text'
                    ],
                    'content' => [
                        'type' => 'text'
                    ]
                ]
            ]
        ]
    ];

    try {
        $response = $this->client->indices()->create($params);
        return true;
    } catch (Throwable $e) {
        throw new Exception('创建索引失败:' . $e->getMessage());
    }
}

/**
 * 删除索引
 *
 * @param string $indexName 索引名称
 * @return bool
 */
public function deleteIndex(string $indexName)
{
    try {
        $response = $this->client->indices()->delete(['index' => $indexName]);
        return true;
    } catch (Missing404Exception $e) {
        return false;
    } catch (Throwable $e) {
        throw new Exception('删除索引失败:' . $e->getMessage());
    }
}

/**
 * 添加文档
 *
 * @param string $indexName 索引名称
 * @param string $id 文档ID
 * @param array $data 文档数据
 * @return bool
 */
public function indexDocument(string $indexName, string $id, array $data)
{
    $params = [
        'index' => $indexName,
        'id' => $id,
        'body' => $data
    ];

    try {
        $response = $this->client->index($params);
        return true;
    } catch (Throwable $e) {
        throw new Exception('添加文档失败:' . $e->getMessage());
    }
}

/**
 * 搜索文档
 *
 * @param string $indexName 索引名称
 * @param string $query 查询字符串
 * @return array
 */
public function searchDocuments(string $indexName, string $query)
{
    $params = [
        'index' => $indexName,
        'body' => [
            'query' => [
                'match' => [
                    '_all' => $query
                ]
            ]
        ]
    ];

    try {
        $response = $this->client->search($params);
        return $response['hits']['hits'];
    } catch (Throwable $e) {
        throw new Exception('搜索文档失败:' . $e->getMessage());
    }
}

}


Dans cette classe de service, nous définissons quatre méthodes : createIndex, deleteIndex, indexDocument et searchDocuments. Ces méthodes encapsulent les appels à l'API Elasticsearch, ce qui facilite la création et la suppression d'index, ainsi que l'ajout et la recherche de documents.

Nous allons maintenant vous montrer comment utiliser ces méthodes. Ici, nous allons créer une page de test, créer un index appelé « articles », ajouter quelques documents, puis utiliser le champ de recherche pour rechercher les documents. Dans le répertoire App/controller, créez un fichier ElasticsearchTestController.php avec le code suivant :

namespace appcontroller;

use appServiceElasticsearchService;

use thinkRequest;#🎜🎜 #

class ElasticsearchTestController extends BaseController

{

protected $elasticsearchService;

public function __construct(ElasticsearchService $elasticsearchService)
{
    $this->elasticsearchService = $elasticsearchService;
}

public function index()
{
    $this->elasticsearchService->createIndex('articles');

    // 添加测试文档
    $this->elasticsearchService->indexDocument('articles', '1', [
        'title' => 'ThinkPHP',
        'content' => 'ThinkPHP是一款优秀的PHP开发框架'
    ]);
    $this->elasticsearchService->indexDocument('articles', '2', [
        'title' => 'Laravel',
        'content' => 'Laravel是一款流行的PHP开发框架'
    ]);
    $this->elasticsearchService->indexDocument('articles', '3', [
        'title' => 'Symfony',
        'content' => 'Symfony是一款PHP开发框架'
    ]);

    // 搜索框
    $search = Request::instance()->get('search', '');

    // 搜索结果
    $results = $this->elasticsearchService->searchDocuments('articles', $search);

    // 返回搜索结果
    return $this->fetch('index', [
        'results' => $results
    ]);
}

}

Dans ce contrôleur, nous avons injecté le service ElasticsearchService et l'avons appelé dans la méthode d'index createIndex, Méthodes indexDocument et searchDocuments pour créer des index, ajouter des documents et effectuer des opérations de recherche. Le champ de recherche et les résultats de la recherche sont également inclus dans la méthode d'indexation.

À ce stade, nous avons terminé la démonstration de l'utilisation d'Elasticsearch pour les opérations de recherche en texte intégral dans les applications ThinkPHP6. Il convient de noter que cet exemple n'est qu'un simple cas d'utilisation de démonstration. Dans les projets réels, une conception d'index et une gestion de documents plus détaillées sont nécessaires pour garantir l'efficacité de la recherche et l'exactitude des résultats de recherche.

De manière générale, avec l'application généralisée d'Elasticsearch, il est devenu un moteur de recherche en texte intégral très populaire et efficace dans les applications Web. Dans ThinkPHP6, en utilisant la bibliothèque de support Elasticsearch et l'API Elasticsearch, nous pouvons facilement effectuer des opérations de recherche en texte intégral.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn