Comment configurer une recherche en texte intégral à l'aide de Scout dans Laravel

La recherche en texte intégral est essentielle pour permettre aux utilisateurs de naviguer sur des sites Web riches en contenu. Dans cet article, je vais vous montrer comment implémenter la recherche en texte intégral pour une application Laravel. En fait, nous utiliserons la bibliothèque Laravel Scout, qui facilite la mise en œuvre de la recherche en texte intégral..

En quoi consiste exactement l'éclaireur Laravel? La documentation officielle le résume comme suit:

Laravel Scout fournit une solution simple, basée sur un pilote, permettant d’ajouter une recherche en texte intégral à vos modèles Eloquent. En utilisant des observateurs de modèle, Scout synchronisera automatiquement vos index de recherche avec vos enregistrements Eloquent..

Laravel Scout est une bibliothèque qui gère la manipulation de l'index chaque fois que les données du modèle changent. L'emplacement où les données seront indexées dépend du pilote que vous avez configuré avec la bibliothèque Scout..

À partir de maintenant, la bibliothèque Scout prend en charge Algolia, une API de moteur de recherche basée sur un nuage. C'est ce que nous utiliserons dans cet article pour illustrer l'implémentation de la recherche en texte intégral..

Nous commencerons par installer les bibliothèques de serveurs Scout et Algolia, puis nous suivrons un exemple concret pour montrer comment vous pouvez indexer et rechercher vos données..

Configurations du serveur

Dans cette section, nous allons installer les dépendances nécessaires pour que la bibliothèque Scout fonctionne avec Laravel. Après l’installation, nous aurons besoin de beaucoup de configuration pour que Laravel puisse détecter la bibliothèque Scout..

Continuons et installons la bibliothèque Scout en utilisant Composer.

$ compositeur nécessite laravel / scout

C'est à peu près tout ce qui concerne l'installation de la bibliothèque Scout. Maintenant que nous avons installé la bibliothèque Scout, assurons-nous que Laravel soit au courant..

En travaillant avec Laravel, vous connaissez probablement le concept de fournisseur de services, qui vous permet de configurer des services dans votre application. Ainsi, chaque fois que vous souhaitez activer un nouveau service dans votre application Laravel, il vous suffit d’ajouter une entrée de fournisseur de service associé dans le répertoire. config / app.php.

Si vous n'êtes pas encore familiarisé avec les fournisseurs de services Laravel, je vous recommande fortement de vous rendre un service et de lire cet article d'introduction qui explique les bases des fournisseurs de services à Laravel..

Dans notre cas, nous avons juste besoin d'ajouter le ScoutServiceProvider fournisseur à la liste des fournisseurs de services config / app.php, comme indiqué dans l'extrait suivant.

… 'Providers' => [/ * * Fournisseurs de services Laravel Framework… * / Illuminate \ Auth \ AuthServiceProvider :: class, Illuminate \ Broadcasting \ BroadcastServiceProvider :: class, Illuminate \ Bus \ BusServiceProvider :: class, Illuminate \ Broadcasting \ BroadcastServiceProvider :: class, Illuminate \ Bus \ ServiceServiceProvider :: class, Illuminate \ Cache \ ServeurProvider: : class, Illuminate \ Foundation \ Providers \ ConsoleSupportServiceProvider :: class, Illuminate \ Cookie \ CookieServiceProvider :: class, Illuminate \ Database \ DatabaseServiceProvider :: class, Illuminate \ EncryptionServiceProvider :: class, Illuminate \ Database \ DatabaseServiceProvider :: class, Illuminate \ EncryptionServiceProvider :: class, Illuminate \ FilesystemServiceProvider :: class, Illuminate \ Foundation \ Providers \ FoundationServiceProvider :: class, Illuminate \ Hashing \ HashServiceProvider :: class, Illuminate \ Mail \ MailServiceProvider :: class, Illuminate \ Notifications \ NotificationServiceProvider :: class, Illuminate \ Mail \ MailServiceProvider :: class, Illuminate \ Notifications \ NotificationServiceProvider :: class, Illuminate \ Pagination \ ServeurProvider :: class \ PipelineServiceProvider :: class, Illuminate \ Queue \ QueueServiceProvider :: class, Illuminate \ Redis \ RedisServiceProvider :: class, Illuminate \ Auth \ Passwords \ PasswordResetServ iceProvider :: class, Illuminate \ Session \ SessionServiceProvider :: class, Illuminate \ Translation \ TranslationServiceProvider :: class, Illuminate \ Validation \ ValidationServiceProvider :: class, Illuminate \ View \ ViewServiceProvider :: class, / * * Fournisseurs de services de packages… * / Laravel \ Tinker \ TinkerServiceProvider :: class, / * * Fournisseurs de services d'application… * / App \ Providers \ AppServiceProvider :: class, App \ Providers \ AuthServiceProvider :: class, App \ Providers \ BroadcastServiceProvider :: class, App \ Providers \ EventServiceProvider :: class, App \ Providers \ RouteServiceProvider :: class, Laravel \ Scout \ ScoutServiceProvider :: class,],… 

Laravel est au courant de la ScoutServiceProvider fournisseur de services. La bibliothèque Scout est livrée avec un fichier de configuration qui nous permet de définir les informations d'identification de l'API..

Continuons et publions les ressources fournies par la bibliothèque Scout en utilisant la commande suivante.

$ php artisan vendeur: publish --provider = "Laravel \ Scout \ ScoutServiceProvider" Fichier copié [/vendor/laravel/scout/config/scout.php] À [/config/scout.php] Publication terminée.

Comme vous pouvez le voir, il a copié le vendor / laravel / scout / config / scout.php déposer dans config / scout.php.

Ensuite, allez-y et créez un compte avec Algolia, car nous aurons besoin des informations d'identification de l'API en premier lieu. Une fois que vous avez les informations sur l’API, allons de l'avant et configurez les paramètres nécessaires dans config / scout.php fichier, comme indiqué dans l'extrait suivant.

 env ('SCOUT_DRIVER', 'algolia'), / * | ---------------------------------------- -------------------------------------- | Préfixe d'index | --------------------------------------------------- --------------------------- | | Ici, vous pouvez spécifier un préfixe qui sera appliqué à tous les index de recherche | noms utilisés par Scout. Ce préfixe peut être utile si vous avez plusieurs | "locataires" ou applications partageant la même infrastructure de recherche. | * / 'prefix' => env ('SCOUT_PREFIX', "), / * | ------------------------------- ------------------------------------------- | Synchronisation des données en file d'attente | - -------------------------------------------------- ---------------------- | | Cette option vous permet de contrôler si les opérations qui synchronisent vos données | avec vos moteurs de recherche sont en file d'attente. "true" alors | toute la synchronisation automatique des données sera mise en file d'attente pour de meilleures performances. | * / 'queue' => env ('SCOUT_QUEUE', false), / * | -------------- -------------------------------------------------- ---------- | Tailles de morceaux | ---------------------------------------- -------------------------------------- | | Ces options vous permettent de contrôler la taille maximale du chunk lorsque vous importez des données en masse dans le moteur de recherche, ce qui vous permet d'ajuster chacune de ces tailles de bloc en fonction de la puissance des serveurs. | * / 'chunk' => ['consultable' => 500, 'impossible à rechercher '=> 500,], / * | ------------------------------------------------ ---------------------------------- | Suppression logicielle | --------------------------------------------------- --------------------------- | | Cette option vous permet de choisir de conserver ou non les enregistrements supprimés dans | les index de recherche. Maintenir des enregistrements supprimés peut être utile | si votre application doit encore rechercher les enregistrements ultérieurement. | * / 'soft_delete' => false, / * | -------------------------------------- ------------------------------------ | Configuration Algolia | --------------------------------------------------- --------------------------- | | Ici, vous pouvez configurer vos paramètres Algolia. Algolia est un nuage hébergé | moteur de recherche qui fonctionne très bien avec Scout hors de la boîte. Il suffit de brancher | dans votre ID d’application et votre clé API d’administrateur pour commencer la recherche. | * / 'algolia' => ['id' => env ('ALGOLIA_APP_ID', 'STQK4DEGMA'), 'secret' => env ('ALGOLIA_SECRET', '6ef572194f70201ed7ad102cc9f90e05'),],];

Notez que nous avons défini la valeur de SCOUT_DRIVER à Algolia chauffeur. Ainsi, vous devez configurer les paramètres nécessaires pour le pilote Algolia à la fin du fichier. Fondamentalement, il vous suffit de définir la identifiant et secret que vous avez depuis le compte Algolia.

Comme vous pouvez le constater, nous récupérons les valeurs des variables d’environnement. Alors assurons-nous que nous définissons les variables suivantes dans le .env déposer correctement.

… ALGOLIA_APP_ID = STQK4DEGMA ALGOLIA_SECRET = 6ef572194f70201ed7ad102cc9f90e05… 

Enfin, nous devons installer le kit de développement logiciel (SDK) Algolia PHP, qui sera utilisé pour interagir avec Algolia à l’aide d’API. Installons-le en utilisant le composeur comme indiqué dans l'extrait suivant.

$ composer exige algolia / algoliasearch-client-php

Et avec cela, nous avons installé toutes les dépendances nécessaires pour pouvoir enregistrer et indexer des données sur le service Algolia..

Rendre les modèles indexables et consultables

Dans la section précédente, nous avons travaillé d'arrache-pied pour configurer les bibliothèques Scout et Algolia afin de pouvoir indexer et rechercher des données à l'aide du service de recherche Algolia..

Dans cette section, nous allons voir un exemple qui montre comment indexer les données existantes et extraire les résultats de recherche d’Algolia. Je suppose que vous avez un défaut Poster modèle dans votre application que nous utiliserons dans notre exemple.

La première chose à faire est d’ajouter le Laravel \ Scout \ Recherche trait au Poster modèle. Ça fait la Poster modèle consultable; Laravel synchronise les enregistrements de publication avec l'index Algolia chaque fois que l'enregistrement de publication est ajouté, mis à jour ou supprimé..

Avec ça, le Poster le modèle est convivial!

Ensuite, nous aimerions configurer les champs qui devraient être indexés en premier lieu. Bien entendu, vous ne souhaitez pas indexer tous les champs de votre modèle dans Algolia pour le maintenir efficace et léger. En fait, le plus souvent, vous n'en aurez pas besoin.

Vous pouvez ajouter le toSearchableArray dans la classe de modèle pour configurer les champs qui seront indexés.

/ ** * Récupère le tableau de données indexable du modèle. * * @return array * / public function toSearchableArray () $ array = $ this-> toArray (); return array ('id' => $ array ['id'], 'name' => $ array ['name']); 

Maintenant, nous sommes prêts à importer et à indexer des Poster records dans Algolia. En fait, la bibliothèque Scout facilite cela en fournissant la commande artisanale suivante.

$ php artisan scout: importez "App \ Post"

Cela devrait importer tous les enregistrements de la Poster modèle en une seule fois! Ils sont indexés dès leur importation, nous sommes donc prêts à interroger les enregistrements. Allez de l'avant et explorez le tableau de bord Algolia pour voir les enregistrements importés et d'autres utilitaires.

Comment ça marche tout à fait

Dans cette section, nous allons créer un exemple qui montre comment effectuer des opérations de recherche et CRUD synchronisées en temps réel avec l'index Algolia..

Allez-y et créez le app / Http / Controllers / SearchController.php fichier avec le contenu suivant.

obtenir(); // fait les choses habituelles ici foreach ($ posts en tant que $ post) //… fonction publique add () // cette publication devrait être indexée immédiatement chez Algolia! $ post = new Post; $ post-> setAttribute ('name', 'Another Post'); $ post-> setAttribute ('user_id', '1'); $ post-> save ();  public function delete () // cet article doit être supprimé de l'index chez Algolia immédiatement! $ post = Post :: find (1); $ post-> delete (); 

Bien sûr, nous devons également ajouter les itinéraires associés.

Route :: get ('search / query', 'SearchController @ query'); Route :: get ('search / add', 'SearchController @ add'); Route :: get ('search / delete', 'SearchController @ delete');

Passons à travers le question méthode pour voir comment effectuer une recherche en Algolia.

public function query () // interroge l'index de recherche Algolia et renvoie les enregistrements correspondants sous forme de modèles Eloquent $ posts = Post :: search ('title') -> get (); // fait les choses habituelles ici foreach ($ posts as $ post) //…

Rappelons que nous avons fait la Poster modèle consultable en ajoutant le Consultable trait. Ainsi, le Poster le modèle peut utiliser le chercher méthode pour récupérer des enregistrements à partir de l'index Algolia. Dans l'exemple ci-dessus, nous essayons de récupérer les enregistrements qui correspondent à la Titre mot-clé.

Ensuite, il y a la ajouter méthode qui imite le flux de travail de l'ajout d'un nouvel enregistrement de publication.

public function add () // cet article devrait être indexé chez Algolia immédiatement! $ post = new Post; $ post-> setAttribute ('name', 'Another Post'); $ post-> setAttribute ('user_id', '1'); $ post-> save (); 

Il n'y a rien d'extraordinaire dans le code ci-dessus; il crée simplement un nouvel enregistrement de publication en utilisant le Poster modèle. Mais le Poster le modèle implémente le Consultable Ainsi, Laravel fait un peu plus de travail cette fois-ci en indexant le nouvel enregistrement créé en Algolia. Comme vous pouvez le constater, l'indexation se fait en temps réel.

Enfin, il y a la effacer méthode. Passons aussi en revue.

public function delete () // cet article doit être supprimé de l'index chez Algolia immédiatement! $ post = Post :: find (1); $ post-> delete (); 

Comme vous vous en doutez, l'enregistrement est immédiatement supprimé de l'index Algolia dès qu'il est supprimé de la base de données..

En gros, aucun effort supplémentaire n'est requis de votre part si vous souhaitez rendre les modèles existants consultables. Tout est géré par la bibliothèque Scout à l'aide d'observateurs modèles.

Et cela nous amène également à la fin de cet article!

Conclusion

Aujourd'hui, nous avons discuté de la façon dont vous pouvez implémenter la recherche de texte intégral dans Laravel à l'aide de la bibliothèque Laravel Scout. Au cours du processus, nous avons passé en revue les installations nécessaires et un exemple concret pour le démontrer..

N'hésitez pas à demander si vous avez des questions ou des doutes en utilisant le flux de commentaires ci-dessous!