Meilisearch-laravel-scout: Ich kann meine Dokumente nicht indizieren (bei Algolia sind sie in Ordnung)

Erstellt am 4. Aug. 2020  ·  30Kommentare  ·  Quelle: meilisearch/meilisearch-laravel-scout

Ich verwende Laravel 7, MS 0.13
Ich versuche, mein Modell zu indizieren mit:
php artisan scout:import "App\Models\Product"
Dann mache ich (local_product ist mein Index):
curl -X GET 'http://localhost:7700/indexes/local_product/documents'
Und ich bekomme []

Wenn ich in Algolia indiziere, sind meine Dokumente dort in Ordnung.
Auch wenn ich Filme indiziere:
curl -X POST 'http://127.0.0.1:7700/indexes/movies/documents' --data @movies.json
Die Filme sind auch indiziert.

Laravel integration

Hilfreichster Kommentar

 public function toSearchableArray()
    {
        $array = $this->toArray();

        $array['id'] = (string)$array['_id'];

        return $array;
    }

Das funktioniert

Alle 30 Kommentare

Hallo @elfeffe ,

Ohne weitere Informationen ist es schwierig dir zu helfen.

Wenn Sie Ihre Meilisearch-Instanz protokollieren, haben Sie Folgendes erhalten:

"POST /indexes/local_product/documents?primaryKey=id HTTP/1.1" 202 14 

Wenn Sie toSearchableArray() in Ihrem Produktmodell verwenden, können Sie mir den Inhalt zeigen, damit ich möglicherweise denselben Fehler reproduzieren kann.

Ich verwende MongoDb. Ich denke, der Schlüssel ist _id
Kann das sein?
Ich verwende toSearchableArray, um einige Felder zu filtern, aber sie indizieren Algolia. Und ich dump das letzte Array und es ist ok.
Ich habe den Computer jetzt nicht, was soll ich versuchen?

Ich kann nicht verstehen, was du mit meinst

Wenn Sie Ihre Meilisearch-Instanz protokollieren, haben Sie Folgendes erhalten:

Lassen Sie mich wissen, was ich ausprobieren soll

Wenn ich es versuche

curl \-X POST 'http://localhost:7700/indexes/local_product/documents' \--data '[{"id": 287947,"title": "Shazam","poster": "https://image.tmdb.org/t/p/w1280/xnopI5Xtky18MPhK40cZAGAOVeV.jpg","overview": "A boy is given the ability to become an adult superhero in times of need with a single magic word.","release_date": "2019-03-23"}]'

Ich bekomme
{"updateId":31}

Aber dann tue ich es
curl -X GET 'http://localhost:7700/indexes/local_product/documents'
Und ich bekomme

[]
Wieder

Hallo @elfeffe

Sie können den Update-Status jederzeit überprüfen, meistens teilt Ihnen MeiliSearch mit, was der Fehler war, falls das Update fehlgeschlagen ist.

Sie können Folgendes überprüfen: Abrufen eines Aktualisierungsstatus

Und für das letzte Beispiel können Sie es versuchen

curl -X GET 'http://localhost:7700/indexes/local_product/updates/31'

was Ihnen mehr Informationen darüber geben sollte, was passiert.

Ich verwende MongoDb. Ich denke, der Schlüssel ist _id
Kann das sein?

Wenn Sie Ihren Index local_product erstellt haben, haben Sie den Schlüsselparameter angegeben?
php artisan scout:index local_product --key _id

Ich verwende toSearchableArray, um einige Felder zu filtern, aber sie indizieren Algolia. Und ich dump das letzte Array und es ist ok.

Können Sie auch versuchen, das toSearchableArray() zu kommentieren, ich glaube nicht, dass dies hier das Problem ist, aber es kostet nichts, es zu versuchen.

Ich habe toSearchableArray() entfernt
Dann habe ich versucht, Folgendes zu tun:
php artisan scout:index local_product --key _id
Funktioniert nicht.

Dann tun
php artisan scout:index local_product --key id
Zusammen mit

/**
     * Get the value used to index the model.
     *
     * <strong i="14">@return</strong> mixed
     */
    public function getScoutKey()
    {
        return $this->id;
    }

    /**
     * Get the key name used to index the model.
     *
     * <strong i="15">@return</strong> mixed
     */
    public function getScoutKeyName()
    {
        return 'id';
    }

Nichts, wenn ich es tue
curl -X GET 'http://localhost:7700/indexes/local_product/documents'

Ich erhalte nur ein Dokument, das mit indiziert wird

curl \-X POST 'http://localhost:7700/indexes/local_product/documents' \--data '[{"id": 287947,"title": "Shazam","poster": "https://image.tmdb.org/t/p/w1280/xnopI5Xtky18MPhK40cZAGAOVeV.jpg","overview": "A boy is given the ability to become an adult superhero in times of need with a single magic word.","release_date": "2019-03-23"}]'

Gibt es ein Protokoll, das ich überprüfen kann?

Wenn Sie Ihre Daten importieren, haben Sie so etwas erhalten:

shok@pop-os:~/web/blog$ php artisan scout:import "App\Models\Post"
Imported [App\Models\Post] models up to ID: 100
All [App\Models\Post] records have been imported.

Protokolle befinden sich in storage/logs/laravel.log

Hast du queue => true in scout.php oder SCOUT_QUEUE=true in deiner .env gesetzt?

Ich habe es sowohl mit true als auch mit false für Warteschlangen versucht. Immer bekomme ich

Importierte [AppModelsProduct]-Modelle bis zur ID: 5eea4b314c80095faf5be593
Importierte [AppModelsProduct]-Modelle bis zur ID: 5eea4bd94c80095faf5be787
Importierte [AppModelsProduct]-Modelle bis zur ID: 5eea4cc34c80095faf5be97b
Importierte [AppModelsProduct]-Modelle bis zur ID: 5eea4dfa4c80095faf5beb6f
Importierte [AppModelsProduct]-Modelle bis zur ID: 5eea4f6b4c80095faf5bed63
Importierte [AppModelsProduct]-Modelle bis zur ID: 5eea51164c80095faf5bef57
Importierte [AppModelsProduct]-Modelle bis zur ID: 5eea524e4c80095faf5bf099

Aber es gibt keine Dokumente.
Ich weiß, wo sich die Protokolle von Laravel befinden, aber ich habe dort keine Fehler. Was ich sehen möchte, sind die MS-Protokolle.
Gibt es eine Möglichkeit zu sehen, was passiert?

Mit denselben Einstellungen indiziert Algolia meine Dokumente.

Ok, Meilisearch Laravel Scout ist nur eine Engine wie ein Copy-Paste der Algolia-Engine. Es sollte also kein Problem sein, aber ich habe auch nie versucht, es mit Mongodb auszuführen ...

@eskombro @curquiza kann antworten, wo die MS-Protokolle sind.

Dies hängt mit MongoDB zusammen, da das Benutzermodell MySQL ist und funktioniert.
Ich meine, das hängt mit MongoDB / Meilisearch zusammen, weil Algolia auch mit MongoDB arbeitet.

Es wäre großartig, wenn ich einige Protokolle von MS sehen könnte, es ist traurig, wenn Algolia es unterstützt, aber nicht Meilisearch.

Ich kann versuchen, das Problem auszugraben, aber ich brauche Ihre Hilfe, wie ich MongoDB mit Laravel installieren kann

Im Moment werden MeiliSearch-Protokolle direkt auf stdout gedruckt, es hängt also davon ab, wo Sie Ihre MeiliSearch-Instanz ausführen. Wo läuft es?

Ich habe hier ein Issue zur Diskussion persistenter Protokolle in MeiliSearch eröffnet: https://github.com/meilisearch/MeiliSearch/issues/898

@elfeffe hast du den Update-Status überprüft, wie ich in früheren Kommentaren vorgeschlagen habe? Wenn die Dokumente erfolgreich an MeilISearch gesendet wurden und Sie eine Status-ID erhalten haben, finden Sie sehr wahrscheinlich in diesem Aktualisierungsstatus die Informationen darüber, was das Problem ist, wenn MeilISearch versucht, zu indizieren. Versuchen Sie Folgendes: https://github.com/meilisearch/meilisearch-laravel-scout/issues/36#issuecomment -668787383

Schau dir das an

curl \-X POST 'http://localhost:7700/indexes/local_product/documents' \--data '[{"id": 287947,"title": "Shazam","poster": "https://image.tmdb.org/t/p/w1280/xnopI5Xtky18MPhK40cZAGAOVeV.jpg","overview": "A boy is given the ability to become an adult superhero in times of need with a single magic word.","release_date": "2019-03-23"}]'

Das geht, aber

curl \-X POST 'http://localhost:7700/indexes/local_product/documents' \--data '[{"id": 5eea4bd94c80095faf5be787,"title": "Shazam 2","poster": "https://image.tmdb.org/t/p/w1280/xnopI5Xtky18MPhK40cZAGAOVeV.jpg","overview": "A boy is given the ability to become an adult superhero in times of need with a single magic word.","release_date": "2019-03-23"}]'

„5eea4bd94c80095faf5be787“ ist eine MongoDB-_id
Das gibt diese Schönheit zurück

{"message":"Invalid JSON: invalid number at line 1 column 11","errorCode":"bad_request","errorType":"invalid_request_error","errorLink":" https://docs.meilisearch.com/errors #bad_request "}

Ich denke, dass JSON gültig ist, es gibt ein Problem mit MS und dem benutzerdefinierten Schlüssel.
Ich weiß nicht, ob es an der Länge, den Buchstaben oder was liegt.

Nach einigen Versuchen denke ich, dass die Buchstaben das Problem sind, MS akzeptiert keine Buchstaben auf der ID. Aber Laravel ließ dich dort Buchstaben platzieren.
Das ist das Problem, denke ich

Ja, Sie müssen das nur als Zeichenfolge senden, umgeben von doppelten Anführungszeichen

Es funktioniert mit "id": "5eea4bd94c80095faf5be787" anstelle von "id": 5eea4bd94c80095faf5be787 , da 5eea4bd94c80095faf5be787 keine gültige Zahl ist 🙂

Aber ich kontrolliere nicht, wie deine Scout-Erweiterung es sendet 🙂

Sogar das tun

/**
     * Get the value used to index the model.
     *
     * <strong i="6">@return</strong> mixed
     */
    public function getScoutKey()
    {
        return (string)$this->_id;
    }

Es funktioniert nicht, ich denke, diese Engine muss String-IDs verarbeiten

machen Sie dasselbe in toSearchableArray()

return [ 'id' => (string) $this->_id]
or
return [ '_id' => (string) $this->_id]

Ich weiß nicht, was Sie als Schlüssel eingestellt haben

 public function toSearchableArray()
    {
        $array = $this->toArray();

        $array['id'] = (string)$array['_id'];

        return $array;
    }

Das funktioniert

Eine letzte Sache.
Algolia handhabt das automatisch, zusammen mit der Indexerstellung.
Ich meine, Algolia erstellt den Index, wenn er nicht vorhanden ist, und ich kann IDs mit Buchstaben ohne Konvertierung indizieren.
Ich denke, MS sollte beide Funktionen enthalten.

Ich meine, Algolia erstellt den Index, wenn er nicht existiert

Tatsächlich beherrscht die MeiliSearch-API diese Funktion noch nicht.
Als alternative Lösung bieten die meisten unserer SDKs eine get_or_create_index -Methode (wie das PHP-SDK) 🙂

und ich kann IDs mit Buchstaben ohne Konvertierung indizieren.

Das Problem, das Sie hatten, kommt von der JSON-Gültigkeit. Sogar die Algolia-API akzeptiert kein ungültiges JSON: Das Senden einer Zahl mit Buchstaben ohne Anführungszeichen ( " ) wird als ungültiges JSON betrachtet und würde fehlschlagen.

Sehen Sie sich das Algolia-Dashboard an:

Capture d’écran 2020-08-06 à 10 52 59

Capture d’écran 2020-08-06 à 10 53 15

Vielleicht wandelt das Laravel SDK von Algolia deine Zahl mit Buchstaben in einen String um und deswegen hattest du keinen Fehler 🙂

Ich denke, MS sollte beide Funktionen enthalten.

Also könnte meilisearch-laravel-scout vielleicht die "Quoting-Funktion" beinhalten, aber MeiliSearch könnte es nicht, da es ein gültiges JSON erwartet 😉

Ja, in beiden Fällen spreche ich von dieser Scout-Engine, wir befinden uns hier in der Scout-Integration.
Das SDK kann eine Methode zum Erstellen des Index bereitstellen, Scout schlägt jedoch fehl, wenn der Index nicht vorhanden ist.

Dasselbe gilt für Id mit Buchstaben. Ich verstehe, dass JSOn fehlerhaft ist, aber die Scout-Engine sollte dies kontrollieren, bevor sie fehlschlägt.
So wie die von Algolia, denn die scheitert nicht an Buchstaben.

Ok ok war nicht sicher zu verstehen 😉

Das könnten nette Features sein, die man dann implementieren könnte! 🙂

Bearbeiten: Wir sollten überlegen, ob wir das im Paket meilisearch-php oder im Paket meilisearch-laravel-scout implementieren.

@curquiza
Es kommt darauf an, beide sind gut.

Wenn wir es in Scout implementieren, sollte Symfony (und andere Framework-Implementierungen) es wahrscheinlich auch implementieren (möglicherweise ist dies bereits der Fall). Es könnte also besser sein, es stattdessen im SDK zu haben?

Ich bin mir nicht sicher, ob Scout es für Algolia implementiert, ich denke, das wird vom Algolia PHP SDK gehandhabt, ich werde das überprüfen, wenn ich ein bisschen Freizeit habe.

@shokme , du hast recht, es könnte klüger sein, dies im PHP SDK statt in der Laravel-Scout-Integration zu tun.
Teilen Sie uns Ihre Untersuchung mit, ich werde das Problem entsprechend verschieben (oder neu erstellen)! 🙂

Also, nachdem ich die ganze Sache untersucht habe.
Ich habe Mongodb in Laravel mit jenssegers/laravel-mongodb installiert.

Ich habe damit begonnen, meinen Index zu erstellen.
php artisan scout:index cars -k _id

ein Modell erstellen

<?php

namespace App;

use Jenssegers\Mongodb\Eloquent\Model;
use Laravel\Scout\Searchable;

class Car extends Model
{
    use Searchable;

    public function getScoutKey() // not required if this is already your primary key
    {
        return $this->_id;
    }

    public function getScoutKeyName() // not required if this is already your primary key
    {
        return '_id';
    }
}

ein neues Auto bauen

$car = new App\Car();
$car->name = 'mustang';
$car->constructor = 'ford';
$car->type = 'muscle';
$car->horses = 280;
$car->save();

Das Modell wurde ohne Probleme an meilisearch gesendet!

{
  "status": "processed",
  "updateId": 1,
  "type": {
    "name": "DocumentsAddition",
    "number": 1
  },
  "duration": 0.005275826,
  "enqueuedAt": "2020-08-29T17:43:55.104917708Z",
  "processedAt": "2020-08-29T17:43:55.121602037Z"
}

Bei einer Suche erhalte ich das richtige Ergebnis

App\Car::search('mustang')->get();

```json
[
{
"_id": "5f4a93dbd9668370086c7752",
"Name": "Mustang",
"Konstrukteur": "Ford",
"Typ": "Muskel",
"Pferde": 280,
"updated_at": "2020-08-29T17:43:55.102000Z",
"created_at": "2020-08-29T17:43:55.102000Z"
}
]

The only problem I have encounter while trying to reproduce the bug was by forgot to set `_id` has primaryKey
and the update status was returning:
```json
{
  "status": "failed",
  "updateId": 3,
  "type": {
    "name": "DocumentsAddition",
    "number": 1
  },
  "error": "serializer error; Primary key is missing.",
  "duration": 9.817e-6,
  "enqueuedAt": "2020-08-29T17:21:00.098580201Z",
  "processedAt": "2020-08-29T17:21:00.100495474Z"
}

Um ehrlich zu sein, verstehe ich nicht, warum Sie bei $this->_id @elfeffe keine Zeichenfolge zurückbekommen

@shokme Ich weiß es nicht. Ich werde meine Arbeit mit der Suche in ein paar Tagen wieder aufnehmen und Sie informieren, wenn ich etwas Neues finde.
Das SDK sollte den Index automatisch erstellen, wie es Algolia tut, mit dem richtigen Id, um Fehler zu vermeiden.

Das SDK sollte den Index automatisch erstellen, wie es Algolia tut, mit dem richtigen Id, um Fehler zu vermeiden.

Es ist in der MeiliSearch Core-Engine geplant! 🙂
https://github.com/meilisearch/MeiliSearch/issues/918

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen