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.
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:
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
Comentários muito úteis
Isso funciona