Meilisearch-laravel-scout: No puedo indexar mis documentos (están bien en Algolia)

Creado en 4 ago. 2020  ·  30Comentarios  ·  Fuente: meilisearch/meilisearch-laravel-scout

Estoy usando Laravel 7, MS 0.13
Estoy tratando de indexar mi modelo usando:
php artisan scout:import "App\Models\Product"
Entonces lo hago (local_product es mi índice):
curl -X GET 'http://localhost:7700/indexes/local_product/documents'
Y obtengo []

Si indexo en Algolia, mis documentos están bien allí.
También si indexo películas haciendo:
curl -X POST 'http://127.0.0.1:7700/indexes/movies/documents' --data @movies.json
Las películas también están indexadas.

Laravel integration

Comentario más útil

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

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

        return $array;
    }

Eso funciona

Todos 30 comentarios

Hola @elfeffe ,

Esto es difícil de ayudar sin más información.

si registra su instancia de meilisearch, obtuvo:

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

Si usa toSearchableArray() en su modelo de producto, ¿puede mostrarme el contenido para que pueda reproducir el mismo error?

Estoy usando MongoDb. Creo que la clave es _id
puede ser eso?
Uso toSearchableArray para filtrar algunos campos, pero indexan en Algolia. Y descargo la matriz final y está bien.
No tengo la computadora ahora, ¿qué quieres que pruebe?

No puedo entender lo que quieres decir con

si registra su instancia de meilisearch, obtuvo:

Dime que quieres que pruebe

si lo intento

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

yo obtengo
{"updateId":31}

pero luego lo hago
curl -X GET 'http://localhost:7700/indexes/local_product/documents'
y obtengo

[]
De nuevo

Hola @elfeffe

Siempre puede verificar el estado de una actualización, la mayoría de las veces MeiliSearch le dirá cuál fue el error, en caso de que la actualización falle.

Puedes consultar: Obtener un estado de actualización

Y para el último ejemplo puedes probar

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

que debería darle más información sobre lo que está sucediendo.

Estoy usando MongoDb. Creo que la clave es _id
puede ser eso?

Cuando creó su índice local_product , ¿especificó el parámetro clave?
php artisan scout:index local_product --key _id

Uso toSearchableArray para filtrar algunos campos, pero indexan en Algolia. Y descargo la matriz final y está bien.

¿Puede intentarlo también comentando toSearchableArray()? No creo que este sea el problema aquí, pero no cuesta nada intentarlo.

He eliminado toSearchableArray()
Entonces he intentado hacer:
php artisan scout:index local_product --key _id
no funciona

entonces haciendo
php artisan scout:index local_product --key id
Juntos con

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

Nada, cuando lo hago
curl -X GET 'http://localhost:7700/indexes/local_product/documents'

Solo obtengo un documento, el indexado usando

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

¿Hay algún registro que pueda comprobar?

Cuando importaste tus datos, obtuviste algo como esto:

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.

los registros se encuentran storage/logs/laravel.log

¿Configuró queue => true en scout.php o SCOUT_QUEUE=true en su .env?

He intentado con verdadero y falso para las colas. siempre lo consigo

Modelos [AppModelsProduct] importados hasta ID: 5eea4b314c80095faf5be593
Modelos [AppModelsProduct] importados hasta ID: 5eea4bd94c80095faf5be787
Modelos [AppModelsProduct] importados hasta ID: 5eea4cc34c80095faf5be97b
Modelos [AppModelsProduct] importados hasta ID: 5eea4dfa4c80095faf5beb6f
Modelos [AppModelsProduct] importados hasta ID: 5eea4f6b4c80095faf5bed63
Modelos [AppModelsProduct] importados hasta ID: 5eea51164c80095faf5bef57
Modelos [AppModelsProduct] importados hasta ID: 5eea524e4c80095faf5bf099

Pero no hay documentos.
Sé dónde se encuentran los registros de laravel, pero no tengo errores allí, lo que quiero ver son los registros de MS.
¿Hay alguna manera de ver lo que está pasando?

Con todas las mismas configuraciones, Algolia está indexando mis documentos.

Ok, Meilisearch laravel scout es solo un motor como una copia y pega del de Algolia. Por lo tanto, no debería ser un problema, pero tampoco he intentado ejecutarlo con mongodb ...

@eskombro @curquiza puede responder a dónde están los registros de MS.

Esto está relacionado con MongoDB, porque el modelo de Usuarios es MySQL y funciona.
Quiero decir, esto está relacionado con MongoDB / Meilisearch, porque Algolia también funciona con MongoDB.

Sería genial si pudiera ver algunos registros de MS, es triste si Algolia lo admite pero no Meilisearch.

Puedo tratar de resolver el problema, pero necesito su ayuda sobre cómo puedo instalar mongoDB con laravel

Por ahora, los registros de MeiliSearch se imprimen directamente en la salida estándar, por lo que depende de dónde esté ejecutando su instancia de MeiliSearch. ¿Dónde está corriendo?

Abrí un problema para discutir registros persistentes en MeiliSearch aquí: https://github.com/meilisearch/MeiliSearch/issues/898

@elfeffe , ¿verificó el estado de actualización como sugerí en comentarios anteriores? Si los documentos se enviaron con éxito a MeilISearch y obtuvo una identificación de estado, muy probablemente encontrará dentro de ese estado de actualización la información sobre cuál es el problema cuando MeilISearch intenta indexar. Prueba esto: https://github.com/meilisearch/meilisearch-laravel-scout/issues/36#issuecomment -668787383

Mira esto

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

Eso funciona, pero

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" es un MongoDB _id
Que vuelve esta belleza

{"mensaje":"JSON no válido: número no válido en la línea 1 columna 11","errorCode":"bad_request","errorType":"invalid_request_error","errorLink":" https://docs.meilisearch.com/errors #solicitud_incorrecta "}

Creo que JSON es válido, hay algún problema con MS y la clave personalizada.
No sé si es la longitud, las letras o qué.

Después de algunos intentos, creo que las letras son el problema, MS no acepta letras en la identificación. Pero Laravel te permite poner letras allí.
ese es el problema creo

Sí, solo necesita enviarlo como una cadena, entre comillas dobles.

Funcionará con "id": "5eea4bd94c80095faf5be787" en lugar de "id": 5eea4bd94c80095faf5be787 porque 5eea4bd94c80095faf5be787 no es un número válido 🙂

Pero no controlo cómo lo envía tu extensión Scout 🙂

Incluso haciendo esto

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

No funciona, creo que este motor debe manejar identificadores de cadena

haz lo mismo en toSearchableArray()

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

no se que has puesto como clave

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

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

        return $array;
    }

Eso funciona

Una última cosa.
Algolia maneja eso automáticamente, junto con la creación del índice.
Quiero decir, Algolia crea el índice si no existe, y puedo indexar identificaciones con letras sin ninguna conversión.
Creo que MS debería incluir ambas funciones.

Quiero decir, Algolia crea el índice si no existe

De hecho, la API de MeiliSearch aún no maneja esta función.
Como solución alternativa, la mayoría de nuestros SDK ofrecen un método get_or_create_index (como lo hace el SDK de PHP) 🙂

y puedo indexar identificaciones con letras sin ninguna conversión.

El problema que tuviste proviene de la validez de JSON. Incluso la API de Algolia no acepta JSON no válido: enviar un número con letras sin comillas ( " ) se considera un JSON no válido y fallaría.

Ver el panel de control de Algolia:

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

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

Quizás el SDK de Laravel de Algolia transforma tu número con letras en una cadena y por eso no tuviste ningún fallo 🙂

Creo que MS debería incluir ambas funciones.

Entonces, tal vez meilisearch-laravel-scout podría incluir la "función de cotización", pero MeiliSearch no podría porque espera un JSON válido 😉

Sí, en ambos casos estoy hablando de este Motor Scout, estamos en la integración Scout aquí.
El SDK puede proporcionar un método para crear el índice, pero Scout falla si el índice no existe.

Lo mismo con Id con letras, entiendo que JSOn está mal formado, pero el motor Scout debe controlar eso antes de que falle.
Como hace el de Algolia, porque ese no falla con las letras.

Ok, ok, no estaba seguro de entender 😉

¡Podrían ser buenas características para implementar entonces! 🙂

Editar: deberíamos pensar si implementamos eso en meilisearch-php o en el paquete meilisearch-laravel-scout.

@curquiza
Depende, ambos son buenos.

Si lo implementamos en Scout, supongo que Symfony (y la implementación de otros marcos) también debería implementarlo (puede ser que ya sea el caso). Entonces, ¿sería mejor tenerlo en el SDK?

No estoy seguro de que Scout lo implemente para Algolia, creo que esto lo maneja el SDK de PHP de Algolia, lo revisaré cuando tenga un poco de tiempo libre.

@shokme , tiene razón, podría ser más inteligente hacerlo en el SDK de PHP en lugar de en la integración de laravel-scout.
¡Háganos saber acerca de su investigación, moveré el problema (o recrearé uno) en consecuencia! 🙂

Entonces, después de investigar todo el asunto.
He instalado mongodb en laravel usando jenssegers/laravel-mongodb .

Empecé creando mi index.
php artisan scout:index cars -k _id

crear un modelo

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

creando un auto nuevo

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

¡El modelo fue enviado a meilisearch sin ningún problema!

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

Al hacer una búsqueda obtengo el resultado correcto

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

```json
[
{
"_id": "5f4a93dbd9668370086c7752",
"nombre": "mustango",
"constructor": "vado",
"tipo": "músculo",
"caballos": 280,
"actualizado_en": "2020-08-29T17:43:55.102000Z",
"creado_en": "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"
}

Entonces, para ser honesto, no entiendo por qué no recuperas una cadena en $this->_id @elfeffe

@shokme No lo sé. Reanudaré mi trabajo con la búsqueda en unos días y les avisaré si encuentro algo nuevo.
El SDK debería crear el índice automáticamente como lo hace Algolia, con el I'd correcto, para evitar errores.

El SDK debería crear el índice automáticamente como lo hace Algolia, con el I'd correcto, para evitar errores.

¡Está planeado en el motor central de MeiliSearch! 🙂
https://github.com/meilisearch/MeiliSearch/issues/918

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

curquiza picture curquiza  ·  4Comentarios

dreamcog picture dreamcog  ·  14Comentarios

ctf0 picture ctf0  ·  7Comentarios

dmyers picture dmyers  ·  14Comentarios

marky291 picture marky291  ·  6Comentarios