Algolia Search ist eine gehostete Volltext-, numerische und facettenreiche Suchmaschine, die in der Lage ist, Ergebnisse in Echtzeit ab dem ersten Tastendruck zu liefern.
Dieses Paket ist veraltet. Wir empfehlen Ihnen, Laravel Scout zu verwenden . Wenn Sie die Scout-Funktionen erweitern möchten, lesen Sie bitte unsere spezielle Dokumentation
Dieses PHP-Paket integriert die Algolia Search API in das Laravel Eloquent ORM. Es basiert auf dem Paket algoliasearch-client-php.
Hinweis: Wenn Sie Laravel 4 verwenden, schauen Sie sich das Repository algoliasearch-laravel-4 an.
Die vollständige Referenz finden Sie auf der Website von Algolia.
Installieren
Schnellstart
Optionen
objectID
Beziehungen
Indizierung
Indizes verwalten
Beredte Kompatibilität
Fügen Sie algolia/algoliasearch-laravel
zu Ihrer composer.json
Datei hinzu:
composer require algolia/algoliasearch-laravel
Fügen Sie den Dienstanbieter zu config/app.php
im providers
-Array hinzu.
AlgoliaSearch Laravel AlgoliaServiceProvider ::class
Laravel Algolia erfordert eine Verbindungskonfiguration. Um zu beginnen, müssen Sie alle Anbieter-Assets veröffentlichen:
php artisan vendor:publish
Sie können die Option --provider="VinklaAlgoliaAlgoliaServiceProvider"
hinzufügen, um nur Assets des Algolia-Pakets zu veröffentlichen.
Dadurch wird in Ihrer App eine Datei config/algolia.php
erstellt, die Sie ändern können, um Ihre Konfiguration festzulegen. Stellen Sie außerdem sicher, dass Sie nach einem Upgrade prüfen, ob sich Änderungen gegenüber der ursprünglichen Konfigurationsdatei ergeben haben.
Der folgende Code fügt Ihrem Contact
Suchfunktionen hinzu und erstellt einen Contact
:
use Illuminate Database Eloquent Model ;
use AlgoliaSearch Laravel AlgoliaEloquentTrait ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
}
Standardmäßig werden alle sichtbaren Attribute gesendet. Wenn Sie bestimmte Attribute senden möchten, können Sie Folgendes tun:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public function getAlgoliaRecord ()
{
return array_merge ( $ this -> toArray (), [
' custom_name ' => ' Custom Name '
]);
}
}
Nachdem Sie Ihr Modell eingerichtet haben, müssen Sie einen ersten Import Ihrer Daten manuell durchführen. Sie können dies tun, indem Sie reindex
Ihrer Modellklasse aufrufen. In unserem vorherigen Beispiel wäre dies:
Contact :: reindex ();
Wir bieten viele Möglichkeiten, Ihre Indexeinstellungen zu konfigurieren, um die Gesamtrelevanz zu optimieren. Die wichtigsten sind jedoch die durchsuchbaren Attribute und die Attribute, die die Datensatzpopularität widerspiegeln. Sie können sie mit dem folgenden Code konfigurieren:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ algoliaSettings = [
' searchableAttributes ' => [
' id ' ,
' name ' ,
],
' customRanking ' => [
' desc(popularity) ' ,
' asc(name) ' ,
],
];
}
Sie können die Einstellungen mithilfe der setSetting
-Methode an Algolia weitergeben (speichern):
Contact :: setSettings ();
Synonyme werden verwendet, um der Engine Wörter oder Ausdrücke mitzuteilen, die hinsichtlich der Textrelevanz als gleichwertig angesehen werden sollten.
Unsere Synonym-API wurde entwickelt, um eine große Menge an Synonymen für einen Index und seine Replikate so einfach wie möglich zu verwalten.
Sie können die Synonym-API verwenden, indem Sie in der Klasseneigenschaft $algoliaSettings
ein synonyms
wie folgt hinzufügen:
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 ' ]
]
]
];
}
Sie können die Einstellungen mithilfe der setSetting
-Methode an Algolia weitergeben (speichern):
Contact :: setSettings ();
Herkömmliche Suchimplementierungen verfügen in der Regel über Suchlogik und -funktionalität im Backend. Dies machte Sinn, wenn das Sucherlebnis darin bestand, dass ein Benutzer eine Suchabfrage eingab, diese Suche ausführte und dann zu einer Suchergebnisseite weitergeleitet wurde.
Die Implementierung der Suche im Backend ist nicht mehr erforderlich. Tatsächlich ist es in den meisten Fällen aufgrund der zusätzlichen Netzwerk- und Verarbeitungslatenz schädlich für die Leistung. Wir empfehlen dringend die Verwendung unseres JavaScript-API-Clients, der alle Suchanfragen direkt über den Browser, das Mobilgerät oder den Client des Endbenutzers ausgibt. Dadurch wird die allgemeine Suchlatenz reduziert und gleichzeitig Ihre Server entlastet.
In Ihrem JavaScript-Code können Sie Folgendes tun:
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 } ) ;
Sie könnten auch die search
verwenden, es wird jedoch nicht empfohlen, eine Sofort-/Echtzeit-Suche über das Backend zu implementieren (eine Frontend-Suche bietet eine bessere Benutzererfahrung):
Contact :: search ( ' jon doe ' );
Jedes Mal, wenn ein Datensatz gespeichert wird; es wird – asynchron – indiziert. Andererseits wird jedes Mal, wenn ein Datensatz zerstört wird, dieser asynchron aus dem Index entfernt.
Sie können die automatische Indizierung und das automatische Entfernen deaktivieren, indem Sie die folgenden Optionen festlegen:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public static $ autoIndex = false ;
public static $ autoDelete = false ;
}
Sie können die automatische Indizierung vorübergehend deaktivieren. Dies geschieht häufig aus Leistungsgründen.
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 ;
Sie können für diese beiden Parameter auch eine dynamische Bedingung festlegen, indem Sie eine autoIndex
und/oder autoDelete method
für Ihr Modell erstellen
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 ;
}
}
Achten Sie darauf, diese beiden Methoden in AlgoliaEloquentTrait zu definieren. Wenn diese Methoden in eine übergeordnete Klasse eingefügt werden, werden sie von AlgoliaEloquentTrait „gelöscht“, wenn sie in einer untergeordneten Klasse verwendet werden (aufgrund der PHP-Vererbung).
Standardmäßig ist der Indexname der pluralisierte Klassenname, z. B. „Kontakte“. Sie können den Indexnamen anpassen, indem Sie die Option $indices
verwenden:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ indices = [ ' contact_all ' ];
}
Mit der folgenden Option können Sie dem Indexnamen die aktuelle App-Umgebung anhängen:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public static $ perEnvironment = true ; // Index name will be 'Contacts_{App::environnement()}';
}
objectID
Standardmäßig basiert die objectID
auf keyName
Ihres Datensatzes (standardmäßig id
). Sie können dieses Verhalten ändern, indem Sie die Option objectIdKey
angeben (verwenden Sie unbedingt ein Uniq-Feld).
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public static $ objectIdKey = ' new_key ' ;
}
Sie können Einschränkungen hinzufügen, die steuern, ob ein Datensatz indiziert werden muss, indem Sie die Methode indexOnly()
definieren.
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public function indexOnly ( $ index_name )
{
return ( bool ) $ condition ;
}
}
Standardmäßig ruft das Algolia-Paket die geladenen Beziehungen ab.
Wenn Sie Datensätze indizieren möchten, für die noch keine Beziehungen geladen wurden, können Sie dies tun, indem Sie sie in den getAlgoliaRecord
laden, den Sie in Ihrem Modell erstellen können.
Es wird so aussehen:
public function getAlgoliaRecord ()
{
/**
* Load the categories relation so that it's available
* in the laravel toArray method
*/
$ this -> categories ;
return $ this -> toArray ();
}
Im resultierenden Objekt werden Kategorien von Laravel in Arrays konvertiert. Wenn Sie eine benutzerdefinierte Beziehungsstruktur wünschen, gehen Sie stattdessen folgendermaßen vor:
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 );
}
Standardmäßig kann Algolia nur auf sichtbare Attribute Ihres Modells zugreifen. Wenn Sie diesen Beispielcode verwenden, erhalten Sie beispielsweise die Ausnahme No content in PUT request
, da der Schlüssel invisible_attribute
eine leere/Null-Variable zurückgibt.
protected $ visible = [ ' visible_attribute ' , ' other_visible_attribute ' ];
public function getAlgoliaRecord ()
{
return [
' invisible_attribute ' => $ this -> invisible_attribute
];
}
Stellen Sie vor der Indizierung sicher, dass Ihre sichtbaren Attribute korrekt aufgelistet sind. Um diese von Laravel auferlegte Sicherheitsmaske zu umgehen, können Sie $this->attributes['invisible_attribute']
verwenden, um direkt auf das Attribut zuzugreifen, auch wenn es nicht sichtbar ist. Wir empfehlen jedoch, diese Art des Zugriffs auf Attribute in Ihrem Modell zu vermeiden.
Sie können die Indizierung mit der Instanzmethode pushToIndex
auslösen.
$ contact = Contact :: firstOrCreate ([ ' name ' => ' Jean ' ]);
$ contact -> pushToIndex ();
Und lösen Sie die Entfernung mit der Instanzmethode removeFromIndex
aus.
$ contact = Contact :: firstOrCreate ([ ' name ' => ' Jean ' ]);
$ contact -> removeFromIndex ();
Um alle Ihre Datensätze sicher neu zu indizieren (Indizierung auf einen temporären Index + den temporären Index atomar auf den aktuellen zu verschieben), verwenden Sie die Klassenmethode reindex
“:
Contact :: reindex ();
So indizieren Sie alle Ihre Datensätze neu (an Ort und Stelle, ohne veraltete Datensätze zu löschen):
Contact :: reindex ( false );
So legen Sie Einstellungen während des Neuindizierungsprozesses fest:
Contact :: reindex ( true , true );
So behalten Sie Einstellungen bei, die Sie im Algolia-Dashboard festgelegt haben, wenn Sie Einstellungen neu indizieren und ändern:
Contact :: reindex ( true , true , true );
So implementieren Sie einen Rückruf, der jedes Mal aufgerufen wird, wenn ein Stapel von Entitäten indiziert wird:
Contact :: reindex ( true , true , false , function ( $ entities )
{
foreach ( $ entities as $ entity )
{
var_dump ( $ entity -> id ); // Contact::$id
}
});
Um einen Index zu löschen, verwenden Sie die Klassenmethode clearIndices
:
Contact :: clearIndices ( ) ;
Sie können Replikatindizes mithilfe der Variablen $algolia_settings
definieren:
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 '
]
]
];
}
Um mithilfe einer Replik zu suchen, verwenden Sie den folgenden Code:
Book :: search ( ' foo bar ' , [ ' index ' => ' contacts_desc ' ]);
Mit der Eigenschaft $indices
können Sie einen Datensatz in mehreren Indizes indizieren:
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 ;
}
}
Um mit einem zusätzlichen Index zu suchen, verwenden Sie den folgenden Code:
Book :: search ( ' foo bar ' , [ ' index ' => ' contacts_private ' ]);
Tun:
Ad :: where ( ' id ' , $ id )-> update ( $ attributes );
wird nichts im Modell auslösen (also wird in Algolia kein Update durchgeführt). Dies liegt daran, dass es sich nicht um einen eloquenten Aufruf handelt. Dies ist lediglich eine bequeme Möglichkeit, die hinter dem Modell verborgene Abfrage zu generieren.
Damit diese Abfrage mit Algolia funktioniert, müssen Sie folgendermaßen vorgehen:
Ad :: find ( $ id )-> update ( $ attributes );
Kompatibel mit 5.x-Anwendungen