Algolia Search est un moteur de recherche hébergé en texte intégral, numérique et à facettes, capable de fournir des résultats en temps réel dès la première frappe.
Ce package est obsolète, nous vous recommandons d'utiliser Laravel Scout . Si vous souhaitez étendre les capacités de Scout, veuillez vous référer à notre documentation dédiée
Ce package PHP intègre l'API Algolia Search dans l'ORM Laravel Eloquent. Il est basé sur le package algoliasearch-client-php.
Remarque : si vous utilisez Laravel 4, consultez le référentiel algoliasearch-laravel-4.
Vous pouvez retrouver la référence complète sur le site d’Algolia.
Installer
Démarrage rapide
Possibilités
objectID
personnaliséRelations
Indexage
Gérer les indices
Compatibilité éloquente
Ajoutez algolia/algoliasearch-laravel
à votre fichier composer.json
:
composer require algolia/algoliasearch-laravel
Ajoutez le fournisseur de services à config/app.php
dans le tableau providers
.
AlgoliaSearch Laravel AlgoliaServiceProvider ::class
Laravel Algolia nécessite une configuration de connexion. Pour commencer, vous devrez publier tous les éléments du fournisseur :
php artisan vendor:publish
Vous pouvez ajouter l'option --provider="VinklaAlgoliaAlgoliaServiceProvider"
pour publier uniquement les actifs du package Algolia.
Cela créera un fichier config/algolia.php
dans votre application que vous pourrez modifier pour définir votre configuration. Assurez-vous également de vérifier les modifications par rapport au fichier de configuration d'origine après une mise à niveau.
Le code suivant ajoute des fonctionnalités de recherche à votre modèle Contact
en créant un index Contact
:
use Illuminate Database Eloquent Model ;
use AlgoliaSearch Laravel AlgoliaEloquentTrait ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
}
Par défaut, tous les attributs visibles sont envoyés. Si vous souhaitez envoyer des attributs spécifiques, vous pouvez faire quelque chose comme :
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public function getAlgoliaRecord ()
{
return array_merge ( $ this -> toArray (), [
' custom_name ' => ' Custom Name '
]);
}
}
Après avoir configuré votre modèle, vous devez effectuer manuellement une première importation de vos données. Vous pouvez le faire en appelant reindex
sur votre classe de modèle. En reprenant notre exemple précédent, cela donnerait :
Contact :: reindex ();
Nous proposons de nombreuses façons de configurer les paramètres de votre index afin d'ajuster la pertinence globale, mais les plus importantes sont les attributs consultables et les attributs reflétant la popularité record . Vous pouvez les configurer avec le code suivant :
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ algoliaSettings = [
' searchableAttributes ' => [
' id ' ,
' name ' ,
],
' customRanking ' => [
' desc(popularity) ' ,
' asc(name) ' ,
],
];
}
Vous pouvez propager (enregistrer) les paramètres sur algolia en utilisant la méthode setSetting
:
Contact :: setSettings ();
Les synonymes sont utilisés pour indiquer au moteur des mots ou des expressions qui doivent être considérés comme égaux en termes de pertinence textuelle.
Notre API de synonymes a été conçue pour gérer le plus simplement possible un large ensemble de synonymes pour un index et ses répliques.
Vous pouvez utiliser l'API des synonymes en ajoutant des synonyms
dans la propriété de classe $algoliaSettings
comme ceci :
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ algoliaSettings = [
' synonyms ' => [
[
' objectID ' => ' red-color ' ,
' type ' => ' synonym ' ,
' synonyms ' => [ ' red ' , ' another red ' , ' yet another red ' ]
]
]
];
}
Vous pouvez propager (enregistrer) les paramètres sur algolia en utilisant la méthode setSetting
:
Contact :: setSettings ();
Les implémentations de recherche traditionnelles ont tendance à avoir une logique et des fonctionnalités de recherche sur le backend. Cela avait du sens lorsque l'expérience de recherche consistait en un utilisateur saisissant une requête de recherche, exécutant cette recherche, puis étant redirigé vers une page de résultats de recherche.
La mise en œuvre de la recherche sur le backend n’est plus nécessaire. En fait, dans la plupart des cas, cela nuit aux performances en raison de la latence supplémentaire du réseau et du traitement. Nous recommandons fortement l'utilisation de notre client API JavaScript qui émet toutes les demandes de recherche directement à partir du navigateur, de l'appareil mobile ou du client de l'utilisateur final. Cela réduira la latence globale de la recherche tout en déchargeant vos serveurs en même temps.
Dans votre code JavaScript, vous pouvez faire :
var client = algoliasearch ( 'ApplicationID' , 'Search-Only-API-Key' ) ;
var index = client . initIndex ( 'YourIndexName' ) ;
index . search ( 'something' , function ( success , hits ) {
console . log ( success , hits )
} , { hitsPerPage : 10 , page : 0 } ) ;
Vous pouvez également utiliser la méthode search
, mais il n'est pas recommandé d'implémenter une expérience de recherche instantanée/en temps réel depuis le backend (avoir une recherche frontale offre une meilleure expérience utilisateur) :
Contact :: search ( ' jon doe ' );
Chaque fois qu'un enregistrement est sauvegardé ; il sera - de manière asynchrone - indexé. En revanche, chaque fois qu’un enregistrement est détruit, il sera – de manière asynchrone – supprimé de l’index.
Vous pouvez désactiver l'indexation et la suppression automatiques en définissant les options suivantes :
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public static $ autoIndex = false ;
public static $ autoDelete = false ;
}
Vous pouvez désactiver temporairement l'indexation automatique. Cela est souvent fait pour des raisons de performances.
Contact :: $ autoIndex = false ;
Contact :: clearIndices ();
for ( $ i = 0 ; $ i < 10000 ; $ i ++) {
$ contact = Contact :: firstOrCreate ([ ' name ' => ' Jean ' ]);
}
Contact :: reindex (); // Will use batch operations.
Contact :: $ autoIndex = true ;
Vous pouvez également créer une condition dynamique pour ces deux paramètres en créant une méthode autoIndex
et/ou autoDelete method
sur votre modèle.
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public function autoIndex ()
{
if ( App :: environment () === ' test ' ) {
return false ;
}
return true ;
}
public static autoDelete()
{
if ( App ::environment() === 'test') {
return false ;
}
return true ;
}
}
Attention à définir ces deux méthodes dans AlgoliaEloquentTrait. Lorsque vous placez ces méthodes dans une classe parent, elles seront "effacées" par AlgoliaEloquentTrait si elles sont utilisées dans une classe enfant (en raison de l'héritage php).
Par défaut, le nom de l'index sera le nom de classe au pluriel, par exemple "Contacts". Vous pouvez personnaliser le nom de l'index en utilisant l'option $indices
:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ indices = [ ' contact_all ' ];
}
Vous pouvez suffixer le nom de l'index avec l'environnement d'application actuel à l'aide de l'option suivante :
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public static $ perEnvironment = true ; // Index name will be 'Contacts_{App::environnement()}';
}
objectID
personnalisé Par défaut, l' objectID
est basé sur keyName
de votre enregistrement ( id
par défaut). Vous pouvez modifier ce comportement en spécifiant l'option objectIdKey
(assurez-vous d'utiliser un champ uniq).
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public static $ objectIdKey = ' new_key ' ;
}
Vous pouvez ajouter des contraintes contrôlant si un enregistrement doit être indexé en définissant la méthode indexOnly()
.
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public function indexOnly ( $ index_name )
{
return ( bool ) $ condition ;
}
}
Par défaut, le package Algolia récupérera les relations chargées .
Si vous souhaitez indexer des enregistrements qui n'ont encore chargé aucune relation, vous pouvez le faire en les chargeant dans le getAlgoliaRecord
que vous pouvez créer dans votre modèle.
Cela ressemblera à :
public function getAlgoliaRecord ()
{
/**
* Load the categories relation so that it's available
* in the laravel toArray method
*/
$ this -> categories ;
return $ this -> toArray ();
}
Dans l'objet résultant, vous aurez des catégories converties en tableau par Laravel. Si vous souhaitez une structure de relation personnalisée, vous ferez plutôt quelque chose comme :
public function getAlgoliaRecord ()
{
/**
* Load the categories relation so that it's available
* in the laravel toArray method
*/
$ extra_data = [];
$ extra_data [ ' categories ' ] = array_map ( function ( $ data ) {
return $ data [ ' name ' ];
}, $ this -> categories -> toArray ());
return array_merge ( $ this -> toArray (), $ extra_data );
}
Par défaut, Algolia ne pourra accéder qu'aux attributs visibles de votre modèle. Ainsi, par exemple, vous recevrez une exception No content in PUT request
lorsque vous utiliserez cet exemple de code, car la clé invisible_attribute
renvoie une variable vide/nulle.
protected $ visible = [ ' visible_attribute ' , ' other_visible_attribute ' ];
public function getAlgoliaRecord ()
{
return [
' invisible_attribute ' => $ this -> invisible_attribute
];
}
Avant l'indexation, assurez-vous d'avoir correctement répertorié vos attributs visibles. Pour contourner ce masque de sécurité imposé par Laravel, vous pouvez utiliser $this->attributes['invisible_attribute']
pour accéder directement à l'attribut même s'il n'est pas visible, mais il est recommandé d'éviter ce type d'accès aux attributs de votre modèle.
Vous pouvez déclencher l'indexation à l'aide de la méthode d'instance pushToIndex
.
$ contact = Contact :: firstOrCreate ([ ' name ' => ' Jean ' ]);
$ contact -> pushToIndex ();
Et déclenchez la suppression à l’aide de la méthode d’instance removeFromIndex
.
$ contact = Contact :: firstOrCreate ([ ' name ' => ' Jean ' ]);
$ contact -> removeFromIndex ();
Pour réindexer en toute sécurité tous vos enregistrements (indexer vers un index temporaire + déplacer l'index temporaire vers l'index actuel de manière atomique), utilisez la méthode de classe reindex
:
Contact :: reindex ();
Pour réindexer tous vos enregistrements (sur place, sans supprimer les enregistrements obsolètes) :
Contact :: reindex ( false );
Pour définir les paramètres pendant le processus de réindexation :
Contact :: reindex ( true , true );
Pour conserver les paramètres que vous avez définis sur le tableau de bord Algolia lors de la réindexation et de la modification des paramètres :
Contact :: reindex ( true , true , true );
Pour implémenter un rappel qui est appelé à chaque fois qu'un lot d'entités est indexé :
Contact :: reindex ( true , true , false , function ( $ entities )
{
foreach ( $ entities as $ entity )
{
var_dump ( $ entity -> id ); // Contact::$id
}
});
Pour effacer un index, utilisez la méthode de classe clearIndices
:
Contact :: clearIndices ( ) ;
Vous pouvez définir des index de réplicas à l'aide de la variable $algolia_settings
:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ algoliaSettings = [
' searchableAttributes ' => [
' id ' ,
' name ' ,
],
' customRanking ' => [
' desc(popularity) ' ,
' asc(name) ' ,
],
' replicas ' => [
' contacts_desc ' ,
],
];
public $ replicasSettings = [
' contacts_desc ' => [
' ranking ' => [
' desc(name) ' ,
' typo ' ,
' geo ' ,
' words ' ,
' proximity ' ,
' attribute ' ,
' exact ' ,
' custom '
]
]
];
}
Pour effectuer une recherche à l'aide d'une réplique, utilisez le code suivant :
Book :: search ( ' foo bar ' , [ ' index ' => ' contacts_desc ' ]);
Vous pouvez indexer un enregistrement dans plusieurs index à l'aide de la propriété $indices
:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ indices = [
' contact_public ' ,
' contact_private ' ,
];
public function indexOnly ( $ indexName )
{
if ( $ indexName == ' contact_public ' )
return true ;
return $ this -> private ;
}
}
Pour effectuer une recherche à l'aide d'un index supplémentaire, utilisez le code suivant :
Book :: search ( ' foo bar ' , [ ' index ' => ' contacts_private ' ]);
Faire:
Ad :: where ( ' id ' , $ id )-> update ( $ attributes );
ne déclenchera rien dans le modèle (donc aucune mise à jour n'aura lieu dans Algolia). C'est parce que ce n'est pas un appel éloquent. C'est simplement un moyen pratique de générer la requête cachée derrière le modèle.
Pour que cette requête fonctionne avec Algolia, vous devez procéder comme ceci :
Ad :: find ( $ id )-> update ( $ attributes );
Compatible avec les applications 5.x