Laravel Scout macht die Volltextsuche einfach, aber manchmal läuft php artisan scout:import scheint zu funktionieren – es werden Stapel von Datensätzen importiert – aber wenn Sie Ihre Suchmaschine überprüfen, gibt es 0 Ergebnisse.
Ich bin selbst auf dieses Problem gestoßen und habe festgestellt, dass es auf ein fehlendes zurückkehren Erklärung im toSearchableArray() Methode. Es gibt jedoch mehrere mögliche Ursachen für dieses Problem. Lassen Sie uns sie durchgehen, damit Ihr Suchindex ordnungsgemäß funktioniert.
Heute hatte ich selbst den Fehler:
php artisan scout:import "App\Product" Importierte [App\Product]-Modelle bis zur ID: 944 Importierte [App\Product]-Modelle bis zur ID: 1444 Importierte [App\Product]-Modelle bis zur ID: 4788 Importierte [App\Product]-Modelle bis zur ID: 5288 Importierte [App\Product]-Modelle bis zur ID: 5788 Importierte [App\Product]-Modelle bis zur ID: 6288 Alle [App\Product]-Datensätze wurden importiert.Es wurden jedoch 0 Datensätze gefunden innerhalb Typesense (in meinem Fall).
1. Fehlt zurückkehren In toSearchableArray()
Wenn Ihr toSearchableArray() Methode nichts zurückgibt, importiert Laravel Scout leere Datensätze, wodurch diese in Ihrer Suchmaschine unbrauchbar werden.
Falsch:
öffentliche Funktion toSearchableArray() { $array = [ 'id' => (Zeichenfolge)$this->id, 'merchant_id' => (Zeichenfolge)$this->merchant_id, 'shop_id' => $this->shop_id ?? 0, ]; }
Diese Methode definiert ein Array, gibt es aber nicht zurück.
Richtig:
öffentliche Funktion toSearchableArray() { return [ 'id' => (Zeichenfolge)$this->id, 'händler-id' => (Zeichenfolge)$this->händler-id, 'shop_id' => $this->shop_id ?? 0, ]; }
2. Modell nicht verwenden Durchsuchbar Eigenschaft
Damit Scout ein Modell erkennen kann, muss es die Durchsuchbar Eigenschaft.
Überprüfen Sie, ob Ihr Modell Folgendes enthält:
verwende Laravel\Scout\Searchable; Klasse Produkt erweitert Modell { verwende Searchable; }
Wenn das Durchsuchbar Merkmal fehlt, Scout verarbeitet das Modell nicht.
3. toSearchableArray() Gibt ein leeres Array zurück
Wenn toSearchableArray() gibt ein leeres Array zurück ([]), überspringt Scout die Indizierung dieses Datensatzes.
Beispiel einer schlechten Implementierung:
öffentliche Funktion toSearchableArray() { return []; }
Dies veranlasst Scout, das Modell als „nicht durchsuchbar“ und speichert sie nicht in Ihrer Suchmaschine.
Stellen Sie sicher toSearchableArray() enthält mindestens ein durchsuchbares Feld:
öffentliche Funktion toSearchableArray() { return [ 'id' => (Zeichenfolge) $this->id, 'name' => $this->name, ]; }
4. In der Datenbank fehlen Pflichtfelder
Wenn Ihre Datenbank Nullwerte für die Felder aufweist, die Sie indizieren möchten, kann dies zu Problemen führen.
Wenn Ihr toSearchableArray() Methode beruht auf Name, aber einige Datensätze haben NULL im Name werden sie möglicherweise nicht richtig indiziert.
Fix: Verwenden ?? um Standardeinstellungen bereitzustellen.
öffentliche Funktion toSearchableArray() { return [ 'id' => (Zeichenfolge) $this->id, 'name' => $this->name ?? 'Unbekannt', ]; }
5. Warteschlange verarbeitet keine Aufträge
Scout verwendet häufig Warteschlangen, um Importe asynchron abzuwickeln. Wenn Ihre Warteschlange nicht ausgeführt wird, scheint Scout möglicherweise Daten zu importieren, verarbeitet sie aber nicht wirklich.
Führen Sie den Warteschlangen-Worker aus, um sicherzustellen, dass Aufträge verarbeitet werden:
PHP Artisan-Warteschlange: Arbeit
Oder wenn Sie einen anderen Warteschlangentreiber verwenden, stellen Sie sicher, dass dieser ordnungsgemäß ausgeführt wird.
6. Typesense/Algolia/Meilisearch empfängt keine Daten
Auch wenn Laravel Scout einwandfrei funktioniert, liegt das Problem möglicherweise an der Suchmaschinenseite.
- Typensinn: Überprüfen Sie, ob die Sammlung vorhanden ist, indem Sie Folgendes ausführen:
curl http://localhost:8108/collections
Wenn die Sammlung nicht vorhanden ist, ist sie möglicherweise nicht richtig eingerichtet.
- Algolia: Gehen Sie zu Ihrem Algolia-Dashboard und prüfen Sie, ob Datensätze vorhanden sind.
- Meilisearch: Versuchen Sie Folgendes auszuführen:
curl http://localhost:7700/indexes/products/documents
Wenn die Antwort leer ist, überprüfen Sie die Meilisearch-Protokolle.
7. durchsuchbar Umfang des Herausfilterns von Datensätzen
Wenn Sie Bedingte Indizierung mit durchsuchbar(), einige Datensätze sind möglicherweise nicht indiziert.
Zum Beispiel:
Produkt::wo('is_active', true)->durchsuchbar();
Dies indiziert nur aktiv Produkte. Wenn alle Ihre Produkte inaktiv sind (ist_aktiv = falsch), wird nichts indiziert.
Lösung: Stellen Sie sicher, dass Ihre Bedingungen Ihren tatsächlichen Daten entsprechen.
8. Der Scout-Indexname stimmt nicht mit Ihrer Suchmaschine überein
Scout ermöglicht Ihnen, den Indexnamen anzupassen. Wenn Ihre Suchmaschine einen anderen Indexnamen erwartet, sind Ihre Datensätze möglicherweise nicht sichtbar.
Überprüfen Sie Ihr Modell:
öffentliche Funktion searchableAs() { return 'products_index'; }
Überprüfen Sie anschließend in Ihrer Suchmaschine, ob dieser Index existiert.
9. Debuggen mit php artisan scout:flush und Wiedereinfuhr
Wenn Sie nicht sicher sind, was falsch ist, versuchen Sie, den Index zurückzusetzen:
php artisan scout:flush "App\Produkt" php artisan scout:import "App\Produkt"
Das Zollabfertigung und Reimport alle Datensätze.
Abschließende Gedanken
Wenn php artisan scout:import sagt, dass Datensätze importiert werden, aber in Ihrer Suchmaschine keine angezeigt werden, überprüfen Sie:
- Tut
toSearchableArray()Daten zurückgeben? - Verwendet das Modell
Durchsuchbar? - Filtern Sie unbeabsichtigt Datensätze heraus?
- Verarbeitet Ihre Warteschlange Importaufträge?
- Empfängt Ihre Suchmaschine die Daten?
Wenn das Problem dadurch nicht behoben wird, führen Sie php artisan scout:flush gefolgt von php artisan scout:import.
Haben Sie noch weitere Scout-Probleme? Lassen Sie es mich in den Kommentaren wissen!
Zuletzt aktualisiert am 4. März 2025
