Meilisearch-laravel-scout: Não consigo indexar meus documentos (eles estão ok em Algolia)

Criado em 4 ago. 2020  ·  30Comentários  ·  Fonte: meilisearch/meilisearch-laravel-scout

Estou usando Laravel 7, MS 0.13
Estou tentando indexar meu modelo usando:
php artisan scout:import "App\Models\Product"
Então eu faço (local_product é meu índice):
curl -X GET 'http://localhost:7700/indexes/local_product/documents'
E eu recebo []

Se eu indexar no Algolia, meus documentos estarão ok lá.
Além disso, se eu indexar filmes fazendo:
curl -X POST 'http://127.0.0.1:7700/indexes/movies/documents' --data @movies.json
Os filmes também são indexados.

Laravel integration

Comentários muito úteis

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

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

        return $array;
    }

Isso funciona

Todos 30 comentários

Olá @elfeffe ,

Isso é difícil de ajudá-lo sem mais informações.

se você registrar sua instância meilisearch, você obteve:

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

Se você usa toSearchableArray() em seu modelo de produto, você pode me mostrar o conteúdo, para que eu possa reproduzir o mesmo erro.

Estou usando o MongoDB. Acho que a chave é _id
Pode ser isso?
Eu uso toSearchableArray para filtrar alguns campos, mas eles indexam no Algolia. E eu despejo a matriz final e está tudo bem.
Eu não tenho o computador agora, o que você quer que eu tente?

Eu não consigo entender o que você quer dizer com

se você registrar sua instância meilisearch, você obteve:

Deixe-me saber o que você quer que eu tente

Se eu tentar

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

eu recebo
{"updateId":31}

Mas então eu faço
curl -X GET 'http://localhost:7700/indexes/local_product/documents'
E eu recebo

[]
Novamente

Olá @elfeffe

Você sempre pode verificar o status de uma atualização, na maioria das vezes o MeiliSearch informará qual foi o erro, caso a atualização tenha falhado.

Você pode verificar: Obter um status de atualização

E para o último exemplo você pode tentar

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

que deve fornecer mais informações sobre o que está acontecendo.

Estou usando o MongoDB. Acho que a chave é _id
Pode ser isso?

Quando você criou seu índice local_product você especificou o parâmetro chave?
php artisan scout:index local_product --key _id

Eu uso toSearchableArray para filtrar alguns campos, mas eles indexam no Algolia. E eu despejo a matriz final e está tudo bem.

Você também pode tentar por comentar o toSearchableArray(), acho que não é esse o problema aqui, mas não custa nada tentar.

Eu removi toSearchableArray()
Então eu tentei fazer:
php artisan scout:index local_product --key _id
Não funciona.

Então fazendo
php artisan scout:index local_product --key id
Junto com

/**
     * 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, quando eu faço
curl -X GET 'http://localhost:7700/indexes/local_product/documents'

Acabei de receber um documento, aquele 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"}]'

Existe algum log que eu possa verificar?

Ao importar seus dados, você obteve algo assim:

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.

logs estão localizados storage/logs/laravel.log

Você definiu queue => true em scout.php ou SCOUT_QUEUE=true em seu .env ?

Eu tentei com true e false para filas. Sempre eu recebo

Modelos [AppModelsProduct] importados até o ID: 5eea4b314c80095faf5be593
Modelos [AppModelsProduct] importados até o ID: 5eea4bd94c80095faf5be787
Modelos [AppModelsProduct] importados até o ID: 5eea4cc34c80095faf5be97b
Modelos [AppModelsProduct] importados até o ID: 5eea4dfa4c80095faf5beb6f
Modelos [AppModelsProduct] importados até o ID: 5eea4f6b4c80095faf5bed63
Modelos [AppModelsProduct] importados até o ID: 5eea51164c80095faf5bef57
Modelos [AppModelsProduct] importados até o ID: 5eea524e4c80095faf5bf099

Mas não há documentos.
Eu sei onde os logs do laravel estão localizados, mas não tenho erros lá, o que eu quero ver são os logs do MS.
Existe alguma maneira de ver o que está acontecendo?

Com todas as mesmas configurações, Algolia está indexando meus documentos.

Ok, Meilisearch laravel scout é apenas um mecanismo como uma cópia e pasta do Algolia. Portanto, não deve ser um problema, mas também nunca tentei executá-lo com o mongodb ...

@eskombro @curquiza pode responder onde estão os logs do MS.

Isso está relacionado ao MongoDB, porque o modelo de usuários é MySQL e funciona.
Quer dizer, isso está relacionado ao MongoDB / Meilisearch, porque o Algolia também trabalha com o MongoDB.

Será ótimo se eu puder ver alguns logs do MS, é triste se Algolia suportar, mas não Meilisearch.

Eu posso tentar cavar o problema, mas preciso de sua ajuda sobre como posso instalar o mongoDB com laravel

Por enquanto, os logs do MeiliSearch são impressos diretamente no stdout, então depende de onde você está executando sua instância do MeiliSearch. Onde está rodando?

Abri um problema para discutir logs persistentes no MeiliSearch aqui: https://github.com/meilisearch/MeiliSearch/issues/898

@elfeffe você verificou o status da atualização como sugeri nos comentários anteriores? Se os documentos foram enviados com sucesso para o MeilISearch e você obteve um ID de status, muito provavelmente encontrará dentro desse status de atualização as informações sobre qual é o problema quando o MeilISearch tenta indexar. Tente isso: https://github.com/meilisearch/meilisearch-laravel-scout/issues/36#issuecomment -668787383

Veja isso

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

Isso funciona, mas

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" é um _id do MongoDB
Que devolve essa beleza

{"message":"JSON inválido: número inválido na linha 1 coluna 11","errorCode":"bad_request","errorType":"invalid_request_error","errorLink":" https://docs.meilisearch.com/errors #bad_request "}

Eu acho que o JSON é válido, há algum problema com o MS e a chave personalizada.
Não sei se é o comprimento, as letras ou o quê.

Depois de algumas tentativas acho que as letras são o problema, a MS não aceita letras no id. Mas o Laravel deixa você colocar letras lá.
Esse é o problema eu acho

Sim, você só precisa enviar isso como uma string, entre aspas duplas

Funcionará com "id": "5eea4bd94c80095faf5be787" em vez de "id": 5eea4bd94c80095faf5be787 porque 5eea4bd94c80095faf5be787 não é um número válido 🙂

Mas eu não controlo como sua extensão Scout a envia 🙂

Mesmo fazendo isso

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

Não funciona, acho que esse mecanismo deve lidar com ids de string

faça a mesma coisa em toSearchableArray()

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

Eu não sei o que você definiu como chave

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

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

        return $array;
    }

Isso funciona

Uma última coisa.
Algolia trata disso automaticamente, juntamente com a criação do índice.
Quer dizer, Algolia cria o índice se não existir, e posso indexar IDs com letras sem nenhuma conversão.
Eu acho que o MS deve incluir os dois recursos.

Quer dizer, Algolia cria o índice se não existir

De fato, a API MeiliSearch ainda não lida com esse recurso.
Como solução alternativa, a maioria dos nossos SDKs fornece um método get_or_create_index (como o PHP SDK faz) 🙂

e posso indexar IDs com letras sem nenhuma conversão.

O problema que você teve vem da validade do JSON. Mesmo a API Algolia não aceita JSON inválido: enviar um número com letras sem citá-lo ( " ) é considerado um JSON inválido e falharia.

Veja o painel Algolia:

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

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

Talvez o SDK do Laravel da Algolia transforme seu número com letras em uma string e por isso você não teve nenhuma falha 🙂

Eu acho que o MS deve incluir os dois recursos.

Então talvez meilisearch-laravel-scout pudesse incluir o "recurso de cotação", mas o MeiliSearch não poderia, pois espera um JSON válido 😉

Sim, em ambos os casos estou falando desse Scout Engine, estamos na integração do Scout aqui.
O SDK pode fornecer um método para criar o índice, mas o Scout falhará se o índice não existir.

O mesmo com Id com letras, entendo que JSOn está malformado, mas o motor Scout deve controlar isso antes que falhe.
Como o Algolia faz, porque esse não falha com letras.

Ok ok não tinha certeza de entender 😉

Eles poderiam ser bons recursos para implementar então! 🙂

Edit: devemos pensar se implementamos isso no meilisearch-php ou no pacote meilisearch-laravel-scout.

@curquiza
Depende, ambos são bons.

Se o implementarmos no scout, acho que o symfony (e outras implementações de framework) também deve implementá-lo (pode ser que já seja o caso). Portanto, pode ser melhor tê-lo no SDK em vez disso?

Não tenho certeza se o scout o implementa para Algolia, acho que isso é tratado pelo Algolia PHP SDK, vou verificar isso quando tiver um pouco de tempo livre.

@shokme , você está certo, pode ser mais inteligente fazer isso no PHP SDK em vez da integração laravel-scout.
Deixe-nos saber sobre sua investigação, vou mover o problema (ou recriar um) de acordo! 🙂

Então, depois de investigar a coisa toda.
Eu instalei o mongodb em laravel usando jenssegers/laravel-mongodb .

Comecei criando meu index.
php artisan scout:index cars -k _id

criar um 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';
    }
}

criando um carro novo

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

O modelo foi enviado para o meilisearch sem nenhum 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"
}

Ao fazer uma pesquisa obtenho o resultado correto

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

``` json
[
{
"_id": "5f4a93dbd9668370086c7752",
"nome": "mustang",
"construtor": "ford",
"tipo": "músculo",
"cavalos": 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"
}

Então, para ser honesto, não entendo por que você não recebe uma string de volta em $this->_id @elfeffe

@shokme Eu não sei. Retomarei meu trabalho com busca em alguns dias e avisarei se encontrar algo novo.
O SDK deve criar o índice automaticamente como o Algolia faz, com o I'd correto, para evitar erros.

O SDK deve criar o índice automaticamente como o Algolia faz, com o I'd correto, para evitar erros.

Está planejado no mecanismo principal do MeiliSearch! 🙂
https://github.com/meilisearch/MeiliSearch/issues/918

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

milosevicn picture milosevicn  ·  5Comentários

curquiza picture curquiza  ·  17Comentários

marky291 picture marky291  ·  6Comentários

JexPY picture JexPY  ·  8Comentários

desaintflorent picture desaintflorent  ·  8Comentários