Scout-Volltextsuche
- Einführung
- Installation
- Warteschlange
- TreiberanforderungenModellindex konfigurieren
- Durchsuchbare Daten konfigurierenBatch-Import
- Datensatz hinzufügenWo Erklärung
- PagingEngine schreiben
- Engine registrieren
Laravel Scout
Einführung
Laravel Scout bietet eine einfache, treiberbasierte Lösung für die Volltextsuche von Eloquent-Modellen. Durch die Verwendung von Modellbeobachtern synchronisiert Scout automatisch den Suchindex von Eloquent-Datensätzen.
Derzeit wird Scout mit einem Algolia-Treiber geliefert. Allerdings ist es auch einfach, einen benutzerdefinierten Treiber zu schreiben, und Sie können Scout problemlos um Ihre eigene Suchimplementierung erweitern.
Installation
Installieren Sie Scout zunächst über den Composer-Paketmanager:
composer require laravel/scout
Scout After Nachdem die Installation abgeschlossen ist, verwenden Sie den Befehl
vendor:publish
Artisan, um Scout zu generieren Konfigurationsdatei. Dieser Befehl generiert eineconfig
-Konfigurationsdatei in Ihremscout.php
-Verzeichnis.php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
Fügen Sie schließlich das Merkmal
LaravelScoutSearchable
dem Modell hinzu, nach dem Sie suchen möchten. Diese Eigenschaft registriert einen Modellbeobachter, um das Modell und alle Treiber synchron zu halten:<?php namespace App; use Laravel\Scout\Searchable; use Illuminate\Database\Eloquent\Model; class Post extends Model{ use Searchable; }
Warteschlange
Obwohl Die Verwendung von Scout ist nicht zwingend erforderlich. Vor der Verwendung dieser Bibliothek wird jedoch dringend empfohlen, einen Warteschlangentreiber zu konfigurieren und ihn zum Ausführen einer Warteschlange für die Verarbeitung zu verwenden, die Scout zulässt Alle Vorgänge synchronisieren Modellinformationen mit dem Suchindex und sorgen so für schnellere Antwortzeiten für die Weboberfläche Ihrer App.
Sobald Sie den Warteschlangentreiber konfiguriert haben, sollte der Wert der Option
config/scout.php
in Ihrerqueue
-Konfigurationsdatei auftrue
:'queue' => true,
Treiberanforderungen
Algolia
Wenn Sie den Algolia-Treiber verwenden, müssen Sie Ihre Algolia
config/scout.php
- undid
-Anmeldeinformationen in dersecret
-Konfiguration konfigurieren Datei. Nachdem Sie die Anmeldeinformationen konfiguriert haben, müssen Sie auch den Composer-Paketmanager verwenden, um Algolia PHP zu installieren SDK:composer require algolia/algoliasearch-client-php:^2.2
Konfiguration
Modellindex konfigurieren
jeweils Eloquente Modelle werden über einen bestimmten „Index“ synchronisiert, der alle durchsuchbaren Modelldatensätze enthält. Mit anderen Worten: Sie können sich jeden „Index“ als eine MySQL-Datentabelle vorstellen. Standardmäßig wird jedes Modell in einem Index gespeichert, der mit dem „Tabellen“-Namen des Modells (normalerweise der Pluralform des Modellnamens) übereinstimmt. Sie können den Index des Modells auch anpassen, indem Sie die Methode
searchableAs
für das Modell überschreiben:<?php namespace App; use Laravel\Scout\Searchable; use Illuminate\Database\Eloquent\Model; class Post extends Model{ use Searchable; /** * 获取索引名称 * * @return string */ public function searchableAs() { return 'posts_index'; } }
Durchsuchbare Daten konfigurieren
Modelle werden standardmäßig im vollständigen
toArray
-Format im Suchindex gespeichert. Wenn Sie die mit dem Suchindex synchronisierten Daten anpassen möchten, können Sie dietoSearchableArray
-Methode am Modell überschreiben:<?php namespace App; use Laravel\Scout\Searchable; use Illuminate\Database\Eloquent\Model; class Post extends Model{ use Searchable; /** * 获取模型的可搜索数据 * * @return array */ public function toSearchableArray() { $array = $this->toArray(); // Customize array... return $array; } }
Modell-ID konfigurieren
Standardmäßig verwendet Scout den Primärschlüssel des Modells als eindeutige ID, die im Suchindex gespeichert ist. Dies kann über
getScoutKey
am Modell erfolgen Methodenanpassung:<?php namespace App; use Laravel\Scout\Searchable; use Illuminate\Database\Eloquent\Model; class User extends Model{ use Searchable; /** * 获取模型主键 * * @return mixed */ public function getScoutKey() { return $this->email; } }
Index
Batch-Import
Wenn Sie installieren möchten Scouten Sie in ein bestehendes Projekt. Möglicherweise verfügen Sie bereits über Datenbankeinträge, die Sie in den Suchtreiber importieren möchten. Scout stellt den Artisan-Befehl
import
bereit, um alle vorhandenen Datensätze in den Suchindex zu importieren:php artisan scout:import "App\Post"
flush
Mit dem Befehl können Datensätze für alle Modelle aus dem Suchindex gelöscht werden:php artisan scout:flush "App\Post"
Datensatz hinzufügen
Wann Sie werden
LaravelScoutSearchable trait
Um einem Modell etwas hinzuzufügen, müssen Sie lediglichsave
eine Modellinstanz erstellen und diese wird automatisch zum Suchindex hinzugefügt. Wenn Sie Scout für die Verwendung einer Warteschlange konfiguriert haben, wird dieser Vorgang im Hintergrund von Ihrem Warteschlangenarbeitsprozess ausgeführt:$order = new App\Order;// ...$order->save();
Über Abfrage hinzufügen
Wenn Sie über den Eloquent-Abfrage-Builder eine Sammlung von Modellen zum Suchindex hinzufügen möchten, können Sie auch die
searchable
-Methode im Eloquent-Abfrage-Builder verketten.searchable
spaltet die Ergebnisse der Konstruktorabfrage auf und fügt die Datensätze Ihrem Suchindex hinzu. Wenn Sie Scout für die Verwendung einer Warteschlange konfiguriert haben, werden ebenfalls alle Datenblöcke von Ihrem Warteschlangenarbeitsprozess im Hintergrund hinzugefügt: Die Methode// 通过 Eloquent 查询构造器增加.. App\Order::where('price', '>', 100)->searchable(); // 你也可以通过模型关系增加记录... $user->orders()->searchable(); // 你也可以通过集合增加记录... $orders->searchable();
searchable
kann als „Update-Einfügung“-Vorgang betrachtet werden. Mit anderen Worten: Wenn sich der Modelldatensatz bereits in Ihrem Index befindet, wird er aktualisiert. Wenn es im Suchindex nicht vorhanden ist, wird es dem Index hinzugefügt.Datensatz aktualisieren
Um ein durchsuchbares Modell zu aktualisieren, aktualisieren Sie einfach die Eigenschaften der Modellinstanz und platzieren Sie das Modell
save
zur Datenbank. Scout synchronisiert Aktualisierungen automatisch mit Ihrem Suchindex:$order = App\Order::find(1); // 更新订单... $order->save();
Sie können die
searchable
-Methode auch für eine Eloquent-Abfrage verwenden, um eine Sammlung von Modellen zu aktualisieren. Wenn das Modell im gesuchten Index nicht vorhanden ist, wird es erstellt:// 通过 Eloquent 查询更新... App\Order::where('price', '>', 100)->searchable(); // 你也可以通过数据间的关联进行更新... $user->orders()->searchable(); // 你也可以通过数据集合进行更新... $orders->searchable();
Datensatz löschen
mit
delete
Durch das Löschen des Modells aus der Datenbank werden die Datensätze im Index entfernt. Diese Form des Löschens ist sogar mit dem Soft-Delete-Modell kompatibel:$order = App\Order::find(1); $order->delete();
Wenn Sie nicht möchten, dass der Datensatz vor dem Löschen abgerufen wird, können Sie
unsearchable
für eine Eloquent-Abfrageinstanz oder -Sammlung verwenden Methode:// 通过 Eloquent 查询删除... App\Order::where('price', '>', 100)->unsearchable(); // 你可以通过数据间的关系进行删除... $user->orders()->unsearchable(); // 你可以通过数据集合进行删除... $orders->unsearchable();
Indizierung anhalten
Möglicherweise müssen Sie die Synchronisierung des Modells aufheben, wenn Sie einen Stapel eloquenter Operationsdaten ausführen zum Suchindex. An dieser Stelle können Sie dazu die Methode
withoutSyncingToSearch
verwenden. Diese Methode akzeptiert einen Rückruf, der sofort ausgeführt wird. Alle Vorgänge in diesem Rückruf werden nicht mit dem Modellindex synchronisiert:App\Order::withoutSyncingToSearch(function () { // 执行模型操作... });
Modellinstanz für bedingte Suche
Manchmal Unter bestimmten Bedingungen muss ein Modell möglicherweise durchsuchbar sein. Angenommen, Sie haben ein
AppPost
-Modell, das einen von zwei Status haben kann: „Entwurf“ oder „Veröffentlicht“. Sie können die Suche nur nach „veröffentlichten“ Beiträgen zulassen. Um dies zu erreichen, müssen Sie eineshouldBeSearchable
-Methode in Ihrem Modell definieren:public function shouldBeSearchable(){ return $this->isPublished(); }
Die
save
-Methode sollte nur verwendet werden, wenn über dieshouldBeSearchable
-Methode, Abfrage oder ein zugehöriges Modell gearbeitet wird. Die direkte Verwendung dersearchable
-Methode führt dazu, dass die durchsuchbaren Ergebnisse des Modells oder der Sammlung die Ergebnisse dershouldBeSearchable
-Methode überschreiben:// 此处将遵循 "shouldBeSearchable" 结果... App\Order::where('price', '>', 100)->searchable(); $user->orders()->searchable();$order->save(); // 此处将覆盖 "shouldBeSearchable" 结果... $orders->searchable(); $order->searchable();
Suchen
Mit der Methode
search
können Sie nach Modellen suchen. Die Suchmethode akzeptiert eine Zeichenfolge, nach der das Modell durchsucht werden soll. Sie müssen außerdem dieget
-Methode in der Suchabfrage verketten, um nach passenden Eloquent-Modellen mit einer bestimmten Suchanweisung abzufragen:$orders = App\Order::search('Star Trek')->get();
Scout-Suche gibt eine Sammlung von Eloquent-Modellen zurück, sodass Sie direkt Routen oder Controller suchen können Ergebnisse zurückgeben, werden sie automatisch in das JSON-Format konvertiert:
use Illuminate\Http\Request; Route::get('/search', function (Request $request) { return App\Order::search($request->search)->get(); });
Wenn Sie möchten, dass sie in Eloquent zurückgegeben werden Um Rohergebnisse vor dem Modell zu erhalten, sollten Sie die Methode
raw
verwenden:$orders = App\Order::search('Star Trek')->raw();
Suchanfragen werden normalerweise für den Index ausgeführt, der durch die Methode
searchableAs
des Modells angegeben wird. Natürlich können Sie auch einen benutzerdefinierten Index angeben, der mit der Methodewithin
durchsucht werden soll:$orders = App\Order::search('Star Trek') ->within('tv_shows_popularity_desc') ->get();
Where-Anweisung
Ermöglicht das Hinzufügen einfacher „Where“-Anweisungen zu Suchanfragen. Derzeit unterstützen diese Anweisungen nur grundlegende numerische Gleichheitsprüfungen und sind in erster Linie für Bereichssuchabfragen basierend auf Mieter-IDs gedacht. Da es sich beim Suchindex nicht um eine relationale Datenbank handelt, werden die erweiterten „Where“-Anweisungen derzeit nicht unterstützt:
$orders = App\Order::search('Star Trek')->where('user_id', 1)->get();
Paging
Zusätzlich zum Abrufen einer Sammlung von Modellen können Sie die Methode
paginate
auch zum Paginieren von Suchergebnissen verwenden. Diese Methode gibt einePaginator
-Instanz zurück, genau wie die herkömmliche Paginierung eloquenter Abfragen:$orders = App\Order::search('Star Trek')->paginate();
Sie können angeben, wie viele Modelle pro Seite abgerufen werden sollen, indem Sie die Zahl als erstes Argument an die
paginate
-Methode übergeben:$orders = App\Order::search('Star Trek')->paginate(15);
Nachdem Sie die Suchergebnisse erhalten haben, können Sie Blade verwenden, um Paging-Links zu rendern und Suchergebnisse anzuzeigen, genau wie herkömmliches Eloquent Die Abfragepaginierung ist dieselbe:
<div class="container"> @foreach ($orders as $order) {{ $order->price }} @endforeach </div> {{ $orders->links() }}
Vorläufiges Löschen
Wenn Ihr Indexmodell vorläufiges Löschen ist und Sie dies tun müssen Suche Für vorläufig gelöschte Modelle setzen Sie den Wert der Option
config/scout.php
in der Konfigurationsdateisoft_delete
auftrue
:'soft_delete' => true,
Wenn diese Konfigurationsoption
true
ist, entfernt Scout vorläufig gelöschte Modelle nicht aus dem Suchindex. Stattdessen wird ein verstecktes__soft_deleted
-Attribut für den Indexdatensatz festgelegt. Anschließend können Sie bei der Suche die MethodewithTrashed
oderonlyTrashed
verwenden, um vorläufig gelöschte Datensätze abzurufen:// 搜索结果包括已删除的记录... $orders = App\Order::withTrashed()->search('Star Trek')->get(); // 搜索结果只含已删除的记录... $orders = App\Order::onlyTrashed()->search('Star Trek')->get();
{Tipp} Um das Modell dauerhaft zu löschen, verwenden Sie
forceDelete
, um es zu löschen. Scout entfernt Modelle automatisch aus dem Suchindex.Benutzerdefinierte Suchmaschine
Wenn Sie das Suchverhalten der Suchmaschine anpassen müssen, können Sie den Rückruf als zweiten Parameter an die
search
-Methode übergeben. Zum Beispiel, wenn eine Suchanfrage an Algolia übergeben wird Bisher war es möglich, mithilfe dieses Rückrufs Geolokalisierungsdaten zu Suchanfragen hinzuzufügen:use Algolia\AlgoliaSearch\SearchIndex; App\Order::search('Star Trek', function (SearchIndex $algolia, string $query, array $options) { $options['body']['query']['bool']['filter']['geo_distance'] = [ 'distance' => '1000km', 'location' => ['lat' => 36, 'lon' => 111], ]; return $algolia->search($query, $options); })->get();
Custom Engine
Schreibmaschine
Wenn der integrierte Scout Wenn die Suchmaschine Ihren Anforderungen nicht entspricht, können Sie eine benutzerdefinierte Suchmaschine schreiben und diese bei Scout registrieren. Ihre Engine muss die abstrakte Klasse
LaravelScoutEnginesEngine
erben. Diese abstrakte Klasse enthält sieben Methoden, die Ihre angepasste Engine implementieren muss:use Laravel\Scout\Builder; abstract public function update($models); abstract public function delete($models); abstract public function search(Builder $builder); abstract public function paginate(Builder $builder, $perPage, $page); abstract public function mapIds($results); abstract public function map($results, $model); abstract public function getTotalCount($results); abstract public function flush($model);
Das Anzeigen der Implementierung dieser Methoden in der Klasse
LaravelScoutEnginesAlgoliaEngine
ist großartig helfen. Dieser Kurs bietet Ihnen einen guten Ausgangspunkt, um zu lernen, wie Sie diese Methoden in einer benutzerdefinierten Engine implementieren.Registrieren der Engine
Sobald Sie Ihre benutzerdefinierte Engine geschrieben haben, können Sie sie mit der Methode
extend
des Scout-Engine-Managements bei Scout registrieren. Sie müssen lediglich die MethodeAppServiceProvider
von der Methodeboot
unterextend
oder von einem beliebigen in Ihrer Anwendung verwendeten Dienstanbieter aufrufen. Wenn Sie beispielsweise einMySqlSearchEngine
geschrieben haben, können Sie es wie folgt registrieren:use Laravel\Scout\EngineManager; /** * 启动任何的服务 * * @return void */ public function boot(){ resolve(EngineManager::class)->extend('mysql', function () { return new MySqlSearchEngine; }); }
Nachdem die Engine registriert wurde, können Sie sie in der
config/scout.php
-Konfigurationsdatei als Standard-Scout angebendriver
:'driver' => 'mysql',
Makrobefehl generieren
Wenn Sie eine benutzerdefinierte Generatormethode wünschen, können Sie < verwenden 🎜>-Methode unter der
LaravelScoutBuilder
-Klasse. Normalerweise müssen Sie beim Definieren von „Makros“ diemacro
-Methode des Dienstanbieters implementieren:boot
<?php namespace App\Providers; use Laravel\Scout\Builder; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Response; class ScoutMacroServiceProvider extends ServiceProvider{ /** * 注册应用的Scout 宏命令. * * @return void */ public function boot() { Builder::macro('count', function () { return $this->engine->getTotalCount( $this->engine()->search($this) ); }); } }
Die Funktion akzeptiert einen Namen als ersten Parameter und der zweite Parameter ist eine Abschlussfunktion. Diese Funktion wird aufgerufen, wenn
macro
den MakrobefehlApp\Order::search('Star Trek')->count();
LaravelScoutBuilder
aufruft. Dieser Artikel wurde erstmals auf der Website LearnKu.com