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