Meilisearch-laravel-scout: Je n'arrive pas à indexer mes documents (ils sont ok chez Algolia)

Créé le 4 août 2020  ·  30Commentaires  ·  Source: meilisearch/meilisearch-laravel-scout

J'utilise Laravel 7, MS 0.13
J'essaie d'indexer mon modèle en utilisant:
php artisan scout:import "App\Models\Product"
Ensuite, je fais (local_product est mon index):
curl -X GET 'http://localhost:7700/indexes/local_product/documents'
Et je reçois []

Si j'indexe en Algolie, mes documents y sont ok.
Aussi, si j'indexe des films en faisant :
curl -X POST 'http://127.0.0.1:7700/indexes/movies/documents' --data @movies.json
Les films sont également indexés.

Laravel integration

Commentaire le plus utile

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

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

        return $array;
    }

Ça marche

Tous les 30 commentaires

Bonjour @elfeffe ,

C'est difficile de t'aider sans plus d'informations.

si vous enregistrez votre instance meilisearch avez-vous obtenu :

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

Si vous utilisez toSearchableArray() dans votre modèle de produit, pouvez-vous me montrer le contenu, afin que je puisse reproduire la même erreur.

J'utilise MongoDb. Je pense que la clé est _id
Peut être ça ?
J'utilise toSearchableArray pour filtrer certains champs, mais ils indexent sur Algolia. Et je vide le tableau final et c'est ok.
Je n'ai pas l'ordinateur maintenant, que voulez-vous que j'essaye ?

Je ne comprends pas ce que tu veux dire par

si vous enregistrez votre instance meilisearch avez-vous obtenu :

Dis-moi ce que tu veux que j'essaye

Si j'essaye

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"}]'

Je reçois
{"updateId":31}

Mais alors je fais
curl -X GET 'http://localhost:7700/indexes/local_product/documents'
Et je reçois

[]
Encore

Bonjour @elfeffe

Vous pouvez toujours vérifier l'état de la mise à jour. La plupart du temps, MeiliSearch vous indiquera quelle était l'erreur, au cas où la mise à jour échouerait.

Vous pouvez vérifier : Obtenir un état de mise à jour

Et pour le dernier exemple, vous pouvez essayer

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

qui devrait vous donner plus d'informations sur ce qui se passe.

J'utilise MongoDb. Je pense que la clé est _id
Peut être ça ?

Lorsque vous avez créé votre index local_product avez-vous spécifié le paramètre clé ?
php artisan scout:index local_product --key _id

J'utilise toSearchableArray pour filtrer certains champs, mais ils indexent sur Algolia. Et je vide le tableau final et c'est ok.

Pouvez-vous également essayer en commentant le toSearchableArray(), je ne pense pas que ce soit le problème ici, mais cela ne coûte rien d'essayer.

J'ai supprimé toSearchableArray()
Ensuite j'ai essayé de faire :
php artisan scout:index local_product --key _id
Ne fonctionne pas.

Puis faire
php artisan scout:index local_product --key id
Ensemble avec

/**
     * 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';
    }

Rien, quand je fais
curl -X GET 'http://localhost:7700/indexes/local_product/documents'

Je reçois juste un document, celui indexé à l'aide

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"}]'

Existe-t-il un journal que je peux vérifier ?

Lorsque vous avez importé vos données, avez-vous obtenu quelque chose comme ceci :

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.

les journaux sont situés storage/logs/laravel.log

Avez-vous défini queue => true dans scout.php ou SCOUT_QUEUE=true dans votre .env ?

J'ai essayé avec true et false pour les files d'attente. Je reçois toujours

Modèles [AppModelsProduct] importés jusqu'à l'ID : 5eea4b314c80095faf5be593
Modèles [AppModelsProduct] importés jusqu'à l'ID : 5eea4bd94c80095faf5be787
Modèles [AppModelsProduct] importés jusqu'à l'ID : 5eea4cc34c80095faf5be97b
Modèles [AppModelsProduct] importés jusqu'à l'ID : 5eea4dfa4c80095faf5beb6f
Modèles [AppModelsProduct] importés jusqu'à l'ID : 5eea4f6b4c80095faf5bed63
Modèles [AppModelsProduct] importés jusqu'à l'ID : 5eea51164c80095faf5bef57
Modèles [AppModelsProduct] importés jusqu'à l'ID : 5eea524e4c80095faf5bf099

Mais il n'y a pas de documents.
Je sais où se trouvent les journaux de laravel, mais je n'ai aucune erreur là-bas, ce que je veux voir, ce sont les journaux MS.
Y a-t-il un moyen de voir ce qui se passe ?

Avec tous les mêmes paramètres, Algolia indexe mes documents.

Ok, Meilisearch laravel scout n'est qu'un moteur comme un copier coller de celui d'Algolia. Donc ça ne devrait pas être un problème mais aussi je n'ai jamais essayé de l'exécuter avec mongodb...

@eskombro @curquiza peut répondre à ce que sont les journaux MS.

Ceci est lié à MongoDB, car le modèle Users est MySQL et fonctionne.
Je veux dire, cela est lié à MongoDB / Meilisearch, car Algolia fonctionne également avec MongoDB.

Ce serait génial si je pouvais voir des journaux de MS, c'est triste si Algolia le supporte mais pas Meilisearch.

Je peux essayer de creuser le problème, mais j'ai besoin de votre aide pour installer mongoDB avec laravel

Pour l'instant, les journaux MeiliSearch sont directement imprimés sur stdout, cela dépend donc de l'endroit où vous exécutez votre instance MeiliSearch. Où tourne-t-il ?

J'ai ouvert un problème pour discuter des journaux persistants dans MeiliSearch ici : https://github.com/meilisearch/MeiliSearch/issues/898

@elfeffe avez-vous vérifié l'état de la mise à jour comme je l'ai suggéré dans les commentaires précédents ? Si les documents ont été envoyés avec succès à MeilISearch et que vous avez obtenu un ID de statut, vous trouverez très probablement à l'intérieur de ce statut de mise à jour les informations sur le problème lorsque MeilISearch essaie d'indexer. Essayez ceci : https://github.com/meilisearch/meilisearch-laravel-scout/issues/36#issuecomment -668787383

Regarde ça

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"}]'

Cela fonctionne, mais

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" est un _id MongoDB
Qui rend cette beauté

{"message":"JSON invalide : numéro invalide à la ligne 1 colonne 11","errorCode":"bad_request","errorType":"invalid_request_error","errorLink":" https://docs.meilisearch.com/errors #bad_request "}

Je pense que JSON est valide, il y a un problème avec MS et la clé personnalisée.
Je ne sais pas si c'est la longueur, les lettres ou quoi.

Après quelques essais, je pense que les lettres sont le problème, MS n'accepte pas les lettres sur l'identifiant. Mais Laravel vous a laissé y mettre des lettres.
C'est le problème je pense

Oui, il vous suffit de l'envoyer sous forme de chaîne, entourée de guillemets

Cela fonctionnera avec "id": "5eea4bd94c80095faf5be787" au lieu de "id": 5eea4bd94c80095faf5be787 car 5eea4bd94c80095faf5be787 n'est pas un nombre valide 🙂

Mais je ne contrôle pas la façon dont votre extension Scout l'envoie 🙂

Même en faisant ça

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

Cela ne fonctionne pas, je pense que ce moteur doit gérer les identifiants de chaîne

faire la même chose dans toSearchableArray()

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

Je ne sais pas ce que vous avez défini comme clé

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

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

        return $array;
    }

Ça marche

Une dernière chose.
Algolia s'en charge automatiquement, ainsi que la création de l'index.
Je veux dire, Algolia crée l'index s'il n'existe pas, et je peux indexer les identifiants avec des lettres sans aucune conversion.
Je pense que MS devrait inclure les deux fonctionnalités.

Je veux dire, Algolia crée l'index s'il n'existe pas

En effet, l'API MeiliSearch ne gère pas encore cette fonctionnalité.
Comme solution alternative, la plupart de nos SDK fournissent une méthode get_or_create_index (comme le fait le SDK PHP) 🙂

et je peux indexer les identifiants avec des lettres sans aucune conversion.

Le problème que vous avez eu vient de la validité JSON. Même l'API Algolia n'accepte pas les JSON invalides : l'envoi d'un nombre avec des lettres sans le citer ( " ) est considéré comme un JSON invalide et échouerait.

Voir le tableau de bord Algolia :

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

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

Peut-être que le SDK Laravel d'Algolia transforme votre numéro avec des lettres en une chaîne et c'est pourquoi vous n'avez eu aucun échec 🙂

Je pense que MS devrait inclure les deux fonctionnalités.

Alors peut-être meilisearch-laravel-scout pourrait inclure la "fonctionnalité de citation", mais MeiliSearch ne le pourrait pas car il attend un JSON valide 😉

Oui, dans les deux cas je parle de ce Scout Engine, on est bien dans l'intégration Scout ici.
Le SDK peut fournir une méthode pour créer l'index, mais Scout échoue si l'index n'existe pas.

La même chose avec Id avec des lettres, je comprends que JSOn est mal formé, mais le moteur Scout doit contrôler cela avant qu'il ne tombe en panne.
Comme celui d'Algolia, parce que celui-là ne manque pas de lettres.

Ok ok j'étais pas sûr d'avoir compris 😉

Ce pourraient être des fonctionnalités intéressantes à implémenter alors! 🙂

Edit : nous devrions réfléchir si nous implémentons cela dans le package meilisearch-php ou dans le package meilisearch-laravel-scout.

@curquiza
Ça dépend, les deux sont bons.

Si nous l'implémentons dans scout, je suppose que l'implémentation de symfony (et d'autres frameworks) devrait également l'implémenter (c'est peut-être déjà le cas). Donc, il serait peut-être préférable de l'avoir dans le SDK à la place ?

Je ne suis pas sûr que le scout l'implémente pour Algolia, je pense que c'est géré par le SDK PHP d'Algolia, je vérifierai cela quand j'aurai un peu de temps libre.

@shokme , vous avez raison, il serait peut-être plus intelligent de le faire dans le SDK PHP plutôt que dans l'intégration laravel-scout.
Faites-nous part de votre enquête, je déplacerai le problème (ou en recréerai un) en conséquence ! 🙂

Donc, après avoir enquêté sur le tout.
J'ai installé mongodb dans laravel en utilisant jenssegers/laravel-mongodb .

J'ai commencé par créer mon index.
php artisan scout:index cars -k _id

créer un modèle

<?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';
    }
}

création d'une nouvelle voiture

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

Le modèle a été envoyé à meilisearch sans aucun problème !

{
  "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"
}

Lorsque je fais une recherche, j'obtiens le bon résultat

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

```json
[
{
"_id": "5f4a93dbd9668370086c7752",
"nom": "mustang",
"constructeur": "gué",
"type": "musclé",
"chevaux": 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"
}

Donc, pour être honnête, je ne comprends pas pourquoi vous ne récupérez pas une chaîne sur $this->_id @elfeffe

@shokme je ne sais pas. Je reprendrai mon travail avec la recherche dans quelques jours et je vous ferai savoir si je trouve quelque chose de nouveau.
Le SDK devrait créer l'index automatiquement comme le fait Algolia, avec le bon I'd, pour éviter les erreurs.

Le SDK devrait créer l'index automatiquement comme le fait Algolia, avec le bon I'd, pour éviter les erreurs.

C'est prévu dans le core-engine MeiliSearch ! 🙂
https://github.com/meilisearch/MeiliSearch/issues/918

Cette page vous a été utile?
0 / 5 - 0 notes