Laravel Scout maakt het zoeken naar volledige tekst eenvoudig, maar soms is het lastig om php ambachtelijke scout:import
lijkt te werken - het toont batches van records die worden geïmporteerd - maar wanneer u uw zoekmachine controleert, zijn er 0 resultaten.
Ik heb dit probleem zelf ook gehad en ontdekte dat het kwam door een ontbrekende opbrengst
verklaring in de naarZoekbareArray()
methode. Er zijn echter meerdere mogelijke oorzaken voor dit probleem. Laten we ze doornemen zodat u uw zoekindex goed kunt laten werken.
Vandaag had ik zelf de fout:
php artisan scout:import "App\Product" Geïmporteerde [App\Product] modellen tot ID: 944 Geïmporteerde [App\Product] modellen tot ID: 1444 Geïmporteerde [App\Product] modellen tot ID: 4788 Geïmporteerde [App\Product] modellen tot ID: 5288 Geïmporteerde [App\Product] modellen tot ID: 5788 Geïmporteerde [App\Product] modellen tot ID: 6288 Alle [App\Product] records zijn geïmporteerd.
Er zijn nog 0 records gevonden binnen Typesense (in mijn geval).
1. Vermist opbrengst
in naarZoekbareArray()
Als je naarZoekbareArray()
Als de methode niets retourneert, importeert Laravel Scout lege records, waardoor ze nutteloos zijn in uw zoekmachine.
Onjuist:
openbare functie toSearchableArray() { $array = [ 'id' => (string)$this->id, 'merchant_id' => (string)$this->merchant_id, 'shop_id' => $this->shop_id ?? 0, ]; }
Deze methode definieert een array, maar retourneert deze niet.
Juist:
openbare functie toSearchableArray() { return [ 'id' => (string)$this->id, 'merchant_id' => (string)$this->merchant_id, 'shop_id' => $this->shop_id ?? 0, ]; }
2. Model niet in gebruik Doorzoekbaar
Karaktereigenschap
Om een model te herkennen, moet Scout de volgende kenmerken gebruiken: Doorzoekbaar
karaktereigenschap.
Controleer of uw model het volgende bevat:
gebruik Laravel\Scout\Searchable; klasse Product breidt Model uit { gebruik Searchable; }
Als de Doorzoekbaar
eigenschap ontbreekt, Scout zal het model niet verwerken.
3. naarZoekbareArray()
Retourneert een lege array
Als naarZoekbareArray()
retourneert een lege array ([]
), zal Scout het indexeren van dat record overslaan.
Voorbeeld van een slechte implementatie:
openbare functie toSearchableArray() { return []; }
Dit zorgt ervoor dat Scout het model behandelt als “niet doorzoekbaar” en worden niet in uw zoekmachine opgeslagen.
Zorg ervoor naarZoekbareArray()
bevat ten minste één doorzoekbaar veld:
openbare functie toSearchableArray() { return [ 'id' => (string) $this->id, 'name' => $this->name, ]; }
4. Database-records missen vereiste velden
Als uw database null-waarden bevat voor de velden die u probeert te indexeren, kan dit problemen veroorzaken.
Als uw bijvoorbeeld naarZoekbareArray()
methode is gebaseerd op naam
, maar sommige gegevens hebben NIETIG
in de naam
kolom, worden ze mogelijk niet correct geïndexeerd.
Repareren: Gebruik ??
om standaardinstellingen te verstrekken.
openbare functie toSearchableArray() { return [ 'id' => (string) $this->id, 'name' => $this->name ?? 'Onbekend', ]; }
5. Wachtrij verwerkt geen taken
Scout gebruikt vaak wachtrijen om imports asynchroon te verwerken. Als uw wachtrij niet actief is, lijkt het erop dat Scout gegevens importeert, maar deze niet daadwerkelijk verwerkt.
Voer de wachtrijwerker uit om ervoor te zorgen dat taken worden verwerkt:
php artisan wachtrij:werk
Of als u een andere wachtrijdriver gebruikt, controleer dan of deze correct werkt.
6. Typesense/Algolia/Meilisearch ontvangt geen gegevens
Zelfs als Laravel Scout prima werkt, kan het probleem aan de zoekmachine kant.
- Typografie: Controleer of de collectie bestaat door het volgende uit te voeren:
krul http://localhost:8108/collections
Als de collectie er niet is, is deze mogelijk niet correct ingesteld.
- Algolia: Ga naar uw Algolia-dashboard en controleer of er records bestaan.
- Meilisearch: Probeer het volgende uit te voeren:
krul http://localhost:7700/indexes/products/documents
Als het antwoord leeg is, controleer dan de Meilisearch-logboeken.
7. doorzoekbaar
Bereik Filteren van Records
Als u gebruik maakt van voorwaardelijke indexering met doorzoekbaar()
, zijn sommige records mogelijk niet geïndexeerd.
Bijvoorbeeld:
Product::where('is_actief', true)->doorzoekbaar();
Dit indexeert alleen actief producten. Als al uw producten inactief zijn (is_actief = false
), wordt er niets geïndexeerd.
Oplossing: Zorg ervoor dat uw voorwaarden overeenkomen met uw werkelijke gegevens.
8. Scout Index-naam komt niet overeen met uw zoekmachine
Met Scout kunt u de indexnaam aanpassen. Als uw zoekmachine een andere indexnaam verwacht, zijn uw records mogelijk niet zichtbaar.
Controleer uw model:
openbare functie doorzoekbaarAs() { return 'products_index'; }
Controleer vervolgens in uw zoekmachine of deze index bestaat.
9. Debuggen met php ambachtelijke scout:flush
en herimporteren
Als u niet zeker weet wat er mis is, probeer dan de index opnieuw in te stellen:
php artisan scout:flush "App\Product" php artisan scout:importeer "App\Product"
Dit opruimen en herimporteren alle gegevens.
Laatste gedachten
Als php ambachtelijke scout:import
Er staat dat er records worden geïmporteerd, maar er verschijnen er geen in uw zoekmachine. Controleer:
- Doet
naarZoekbareArray()
gegevens retourneren? - Maakt het model gebruik van
Doorzoekbaar
? - Filtert u onbedoeld records weg?
- Is uw wachtrij bezig met het verwerken van importtaken?
- Ontvangt uw zoekmachine de gegevens?
Als geen van deze oplossingen het probleem oplost, probeer dan het volgende: php ambachtelijke scout:flush
gevolgd door php ambachtelijke scout:import
.
Heb je nog andere Scout-problemen? Laat het me weten in de reacties!