Dieses Paket bietet einen generischen Laravel-Scout-Treiber, der die Volltext-Suche in indizierten Modelldaten mithilfe einer SQL-Datenbank als Speicher-Backend durchführt. Indexierte Daten werden in normalisierter Form gespeichert und ermöglichen eine effiziente und unscharfe Suche, die keine vollständige und/oder genaue Übereinstimmung erfordert.
Dieser Treiber ist eine Alternative zu teamtnt/laravel-scout-tntsearch-driver . Der Hauptunterschied besteht darin, dass dieser Treiber weniger Funktionen bietet (z. B. GEO -Suche). Stattdessen funktioniert es mit allen Datenbanksystemen, die von Laravel selbst unterstützt werden (die im Grunde genommen alle PDO -Treiber sind). Auch der Suchalgorithmus ist etwas anders.
Alle Tests werden in den folgenden Datenbanksystemen durch Github -Aktionen für PHP 8.0, 8.1 und 8.2 durchgeführt:
Die tatsächlichen Einschränkungen in Bezug auf unterstützte Datenbanksysteme beziehen sich hauptsächlich mit der Verwendung des gemeinsamen Expression von Tabellen unter Verwendung von Staudenmeir/Laravel-CTE zusammen. Bitte stellen Sie sicher, dass Ihr Datenbanksystem vor der Verwendung des Pakets unterstützt wird, oder Sie werden möglicherweise Datenbankfehler eingehen.
Sie können das Paket über Komponist installieren:
composer require namoshek/laravel-scout-databaseNach der Installation des Pakets müssen die Konfigurationsdatei sowie die Migrationen veröffentlicht werden:
php artisan vendor:publish --provider= " NamoshekScoutDatabaseScoutDatabaseServiceProvider " --tag= " config "
php artisan vendor:publish --provider= " NamoshekScoutDatabaseScoutDatabaseServiceProvider " --tag= " migrations " Wenn Sie ein anderes Tabellenpräfix als scout_ für die von diesem Paket erstellten Tabellen verwenden möchten, sollten Sie die Konfiguration sowie die kopierten Migrationen entsprechend ändern. Wenn Sie dies getan haben, können Sie die Datenbankmigrationen anwenden:
php artisan migratev0.x auf v1.x Mit der neuen Version hat sich das Datenbankschema geändert und neue Migrationen müssen mit:
php artisan vendor:publish --provider= " NamoshekScoutDatabaseScoutDatabaseServiceProvider " --tag= " migrations "Der gleiche Hinweis, wie oben im Abschnitt Installation erwähnt, gilt auch für die neu veröffentlichten Migrationen.
Die Konfiguration wurde geringfügig reduziert und Sie möchten möglicherweise die neue Konfigurationsdatei mit der alten vergleichen, um veraltete Einstellungen zu entfernen. Das Überspringen dieses Teils hat jedoch keinen negativen Einfluss auf die Leistung des Scout -Treibers.
Der Befehl NamoshekScoutDatabaseCommandsCleanWordsTable::class
Die meisten Ereignisse protected Felder und Methoden wurden in private umgeändert, um die Entwicklung in Bezug auf die Rückwärts-Kompatibilität in Zukunft zu vereinfachen. Wenn Sie Teile der Implementierung nicht aktiv überschrieben haben, wirkt sich dies überhaupt nicht aus.
Um Scout anzuweisen, den von diesem Paket bereitgestellten Treiber zu verwenden, müssen Sie die driver in config/scout.php in database ändern. Wenn Sie die Scout -Konfigurationsdatei nicht geändert haben, können Sie stattdessen auch die Umgebungsvariable SCOUT_DRIVER in database festlegen.
Alle verfügbaren Konfigurationsoptionen des Pakets selbst finden Sie in config/scout-database.php . Die Optionen werden in der Datei selbst gründlich beschrieben. Standardmäßig verwendet das Paket den UnicodeTokenizer und den PorterStemmer , der für die englische Sprache geeignet ist. Die Suche fügt dem letzten Token eine nachfolgende Wildcard hinzu, und nicht alle Suchbegriffe müssen gefunden werden, damit ein Dokument in den Ergebnissen angezeigt wird (es muss jedoch mindestens eine Übereinstimmung sein).
Sie können jedem Such -Token auch eine Wildcard hinzufügen, indem Sie in der wildcard_all_tokens in der Konfigurationsdatei Altough aktivieren. Dies wird aus Leistungsgründen nicht empfohlen.
Eine grundlegende Installation erfordert höchstwahrscheinlich nicht, dass Sie diese Einstellungen ändern. Um sicherzugehen, sollten Sie sich jedoch die connection ansehen. Wenn Sie dies ändern möchten, tun Sie dies, bevor Sie die Migrationen ausführen, oder die Tabellen werden mithilfe der falschen Datenbankverbindung erstellt.
Derzeit ist nur ein UnicodeTokenizer verfügbar. Es wird Strings in einem Zeichen aufgeteilt, das weder ein Buchstaben noch eine Zahl gemäß den Regex -Mustern p{L} und p{N} ist. Dies bedeutet, dass Punkte, Kolons, Striche, Whitespace usw. geteilte Kriterien sind.
Wenn Sie unterschiedliche Anforderungen für einen Tokenizer haben, können Sie Ihre eigene Implementierung über die Konfiguration bereitstellen. Stellen Sie einfach sicher, dass die Tokenizer -Schnittstelle implementiert wird.
Derzeit sind alle vom wamania/php-stemmer Paket implementierten Stemmers verfügbar. Für jeden von ihnen wurde eine Wrapper -Klasse hinzugefügt:
DanishStemmerDutchStemmerEnglishStemmerFrenchStemmerGermanStemmerItalianStemmerNorwegianStemmerNullStemmer (kann verwendet werden, um das Stamm zu deaktivieren)PorterStemmer (Standard, gleich wie EnglishStemmer )PortugueseStemmerRomanianStemmerRussianStemmerSpanishStemmerSwedishStemmer Wenn Sie unterschiedliche Anforderungen für einen Stemmer haben, können Sie Ihre eigene Implementierung über die Konfiguration bereitstellen. Stellen Sie einfach sicher, dass die Stemmer -Schnittstelle implementiert wird.
Das Paket folgt den verfügbaren Anwendungsfällen, die in der offiziellen Scout -Dokumentation beschrieben sind. Bitte beachten Sie jedoch die aufgelisteten Einschränkungen.
Der Suchtreiber verwendet intern eine einzelne Tabelle, die Begriffe und die Vereinigung zu Dokumenten enthält. Bei der Indizierung von Dokumenten (dh Hinzufügen oder Aktualisieren von Modellen im Suchindex) verwendet die Engine den konfigurierten Tokenizer, um die Eingabe jeder Spalte in Token aufzuteilen. Der standardmäßig konfigurierte Tokenizer spaltet einfach Eingänge in Wörter auf, die aus einem Unicode -Buchstaben oder einer . Nummer ein anderes Zeichen wie , , - , _ ! , ? / , Whitespace und alle anderen Sonderzeichen werden als Trennzeichen für die Token angesehen und vom Tokenizer entfernt. Auf diese Weise werden solche Charaktere niemals im Suchindex selbst landen.
Nachdem die Eingaben tokenisiert wurden, wird jedes Token (und an diesem Punkt erwarten wir tatsächlich, dass unsere Token Wörter sind) durch den konfigurierten Stemmer geleitet, um den Stamm abzurufen (dh Root Word ). Durch die Ausführung dieser Aktion können wir später nach ähnlichen Wörtern suchen. Der PorterStemmer zum Beispiel erzeugt intellig als Ausgabe sowohl für intelligent als auch für intelligence als Eingabe. Wie dies bei der Suche hilft, wird in einem Moment klar sein.
Schließlich werden die Ergebnisse dieses Prozesses in der Datenbank gespeichert. Die Indextabelle wird mit den Ergebnissen des Stammprozesses und den Assoziationen zu den indizierten Modellen (Modelltyp und Kennung) gefüllt. Darüber hinaus enthält die Datenbank für jede Zeile im Index auch die Anzahl der Auseinandersetzungen in einem Dokument. Wir verwenden diese Informationen, um im Suchteil unseres Motors zu punkten.
Bei der Ausführung einer Suchabfrage wird der gleiche Tokenisierungs- und Stammprozess für die Indexierung auf die Suchabfrage -Zeichenfolge angewendet. Das Ergebnis dieses Prozesses ist eine Liste von Stämmen (oder Stammwörtern ), die dann zur Ausführung der tatsächlichen Suche verwendet werden. Abhängig von der Konfiguration des Pakets gibt die Suche Dokumente zurück, die mindestens eines oder alle Stängel enthalten. Dies geschieht durch die Berechnung einer Punktzahl für jede Übereinstimmung im Index basierend auf der inversen Dokumentfrequenz (dh dem Verhältnis zwischen indizierten Dokumenten und Dokumenten, die eines der durchsuchten Wörter enthalten), der Begriffsfrequenz (dh der Anzahl der Vorkommen eines Suchbegriffs innerhalb eines Dokuments) und der Begriff Abweichung (die nur für die Wildcard -Suche relevant ist). Zurückgegeben sind Dokumente, die in absteigender Reihenfolge nach ihrer Punktzahl bestellt wurden, bis die gewünschte Grenze erreicht ist.
Es ist möglich, die Suchindextabelle ( scout_index ) mit benutzerdefinierten Spalten zu erweitern. Während der Indexierung können diese Spalten mit benutzerdefinierten Inhalten gefüllt werden, und während der Suche können die Suchvorgänge in diese Spalten geschoben werden (genaue Übereinstimmung). Diese Funktion ist besonders nützlich, wenn Sie mit einer Multi-Mieter-Anwendung arbeiten, bei der der Suchindex von mehreren Mietern verwendet wird.
In unserem Beispiel fügen wir dem Suchindex eine obligatorische tenant_id hinzu.
return new class extends Migration {
public function up (): void
{
Schema :: table ( ' scout_index ' , function ( Blueprint $ table ) {
$ table -> uuid ( ' tenant_id ' );
});
}
public function down (): void
{
Schema :: table ( ' scout_index ' , function ( Blueprint $ table ) {
$ table -> dropColumn ([ ' tenant_id ' ]);
});
}
}; Der tenant_id wird während der Indexierung für jedes Modell hinzugefügt:
class User extends Model
{
public function toSearchableArray (): array
{
return [
' id ' => $ this -> id ,
' name ' => $ this -> name ,
' tenant_id ' => new StandaloneField ( $ this -> tenant_id ),
];
}
} Der tenant_id wird während der Suche basierend auf dem $tenantId filtriert, was beispielsweise aus der HTTP -Anfrage entnommen werden kann:
User :: search ( ' Max Mustermann ' )
-> where ( ' tenant_id ' , $ tenantId )
-> get ();Offensichtlich bietet dieses Paket keine Suchmaschine, die eine professionelle Suchmaschine wie Elasticsearch bietet (sogar aus der Ferne) die Leistung und Qualität. Diese Lösung ist für kleinere bis mittelgroße Projekte gedacht, die eine ziemlich einfache Einstellung von Lösung benötigen.
Auch erwähnenswert sind die folgenden Scout -Funktionen derzeit nicht implementiert:
User::search('Mustermann')->within('users_without_admins')User::search('Musterfrau')->orderBy('age', 'desc')Ein Problem mit dieser Suchmaschine ist, dass sie zu Problemen führen kann, wenn mehrere Warteschlangenarbeitnehmer gleichzeitig an der Indexierung eines einzelnen Dokuments arbeiten (Datenbank mit Deadlock). Um dieses Problem zu umgehen, ist die Anzahl der Versuche, die für Transaktionen verwendet werden, konfigurierbar. Standardmäßig wird jede Transaktion maximal dreimal ausprobiert, wenn ein Deadlock (oder ein anderer Fehler) auftritt.
Die MIT -Lizenz (MIT). Weitere Informationen finden Sie unter Lizenzdatei.