Meilisearch-laravel-scout: Я не могу проиндексировать свои документы (в Алголии они в порядке)

Созданный на 4 авг. 2020  ·  30Комментарии  ·  Источник: meilisearch/meilisearch-laravel-scout

Я использую Laravel 7, MS 0.13.
Я пытаюсь индексировать свою модель, используя:
php artisan scout:import "App\Models\Product"
Затем я делаю (local_product — мой индекс):
curl -X GET 'http://localhost:7700/indexes/local_product/documents'
И я получаю []

Если я индексирую в Алголии, мои документы там в порядке.
Также, если я индексирую фильмы, делающие:
curl -X POST 'http://127.0.0.1:7700/indexes/movies/documents' --data @movies.json
Фильмы также индексируются.

Laravel integration

Самый полезный комментарий

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

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

        return $array;
    }

Это работает

Все 30 Комментарий

Привет @elfeffe ,

Трудно помочь вам без дополнительной информации.

если вы зарегистрируете свой экземпляр meilisearch, вы получите:

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

Если вы используете toSearchableArray() в своей модели продукта, можете ли вы показать мне содержимое, чтобы я мог воспроизвести ту же ошибку.

Я использую MongoDB. Я думаю, что ключ _id
Может быть что?
Я использую toSearchableArray для фильтрации некоторых полей, но они индексируются в Algolia. И я сбрасываю окончательный массив, и все в порядке.
У меня сейчас нет компьютера, что ты хочешь, чтобы я попробовал?

Я не могу понять, что вы имеете в виду под

если вы зарегистрируете свой экземпляр meilisearch, вы получите:

Дайте мне знать, что вы хотите, чтобы я попробовал

Если я попытаюсь

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

я получил
{"updateId":31}

Но тогда я делаю
curl -X GET 'http://localhost:7700/indexes/local_product/documents'
И я получаю

[]
Снова

Привет @elfeffe

Вы всегда можете проверить статус обновления, в большинстве случаев MeiliSearch сообщит вам, в чем была ошибка, если обновление не удалось.

Вы можете проверить: Получить статус обновления

И для последнего примера вы можете попробовать

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

который должен дать вам больше информации о том, что происходит.

Я использую MongoDB. Я думаю, что ключ _id
Может быть что?

Когда вы создали свой индекс local_product , вы указали ключевой параметр?
php artisan scout:index local_product --key _id

Я использую toSearchableArray для фильтрации некоторых полей, но они индексируются в Algolia. И я сбрасываю окончательный массив, и все в порядке.

Можете ли вы также попробовать прокомментировать toSearchableArray(), я не думаю, что это проблема, но попробовать ничего не стоит.

Я удалил toSearchableArray()
Затем я попытался сделать:
php artisan scout:index local_product --key _id
Не работает.

Затем делаем
php artisan scout:index local_product --key id
Вместе с

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

Ничего, когда я делаю
curl -X GET 'http://localhost:7700/indexes/local_product/documents'

Я просто получаю один документ, тот, который проиндексирован с помощью

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

Есть ли журнал, который я могу проверить?

Когда вы импортируете свои данные, вы получаете что-то вроде этого:

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.

логи расположены storage/logs/laravel.log

Вы установили queue => true в scout.php или SCOUT_QUEUE=true в вашем .env?

Я пробовал как с true, так и с false для очередей. всегда получаю

Импортированные модели [AppModelsProduct] до идентификатора: 5eea4b314c80095faf5be593
Импортированные модели [AppModelsProduct] до идентификатора: 5eea4bd94c80095faf5be787
Импортированные модели [AppModelsProduct] до идентификатора: 5eea4cc34c80095faf5be97b
Импортированные модели [AppModelsProduct] до идентификатора: 5eea4dfa4c80095faf5beb6f
Импортированные модели [AppModelsProduct] до идентификатора: 5eea4f6b4c80095faf5bed63
Импортированные модели [AppModelsProduct] до идентификатора: 5eea51164c80095faf5bef57
Импортированные модели [AppModelsProduct] до идентификатора: 5eea524e4c80095faf5bf099

Но документов нет.
Я знаю, где находятся журналы laravel, но у меня там нет ошибок, я хочу видеть журналы MS.
Есть ли способ увидеть, что происходит?

При всех тех же настройках Algolia индексирует мои документы.

Хорошо, Meilisearch laravel scout — это всего лишь движок, похожий на копипасту Algolia. Так что это не должно быть проблемой, но я никогда не пытался запустить его с помощью mongodb...

@eskombro @curquiza может ответить, что это журналы MS.

Это связано с MongoDB, потому что модель Users — это MySQL и работает.
Я имею в виду, что это связано с MongoDB/Meilisearch, потому что Algolia также работает с MongoDB.

Было бы здорово, если бы я мог увидеть некоторые журналы от MS, это печально, если Algolia поддерживает это, но не Meilisearch.

Я могу попытаться разобраться в проблеме, но мне нужна ваша помощь, как установить mongoDB с помощью laravel.

На данный момент журналы MeiliSearch напрямую выводятся на стандартный вывод, поэтому это зависит от того, где вы используете свой экземпляр MeiliSearch. Где это работает?

Я открыл вопрос для обсуждения постоянных журналов в MeiliSearch здесь: https://github.com/meilisearch/MeiliSearch/issues/898 .

@elfeffe вы проверили статус обновления, как я предложил в предыдущих комментариях? Если документы были успешно отправлены в MeilISearch и вы получили идентификатор статуса, вы, скорее всего, найдете в этом статусе обновления информацию о том, в чем проблема, когда MeilISearch пытается индексировать. Попробуйте это: https://github.com/meilisearch/meilisearch-laravel-scout/issues/36#issuecomment -668787383

Посмотри на это

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

Это работает, но

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» — это _id MongoDB.
Что возвращает эту красоту

{"message":"Неверный JSON: неверный номер в строке 1, столбце 11","errorCode":"bad_request","errorType":"invalid_request_error","errorLink":" https://docs.meilisearch.com/errors #плохой_запрос "}

Я думаю, что JSON действителен, есть проблема с MS и пользовательским ключом.
Я не знаю, то ли это длина, то ли буквы, то ли что.

После некоторых попыток я думаю, что проблема в письмах, MS не принимает буквы на id. Но Laravel позволяет помещать туда буквы.
в этом проблема я думаю

Да, вам просто нужно отправить это как строку, заключенную в двойные кавычки.

Он будет работать с "id": "5eea4bd94c80095faf5be787" вместо "id": 5eea4bd94c80095faf5be787 , потому что 5eea4bd94c80095faf5be787 не является допустимым числом 🙂

Но я не контролирую, как ваше расширение Scout отправляет его 🙂

Даже делая это

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

Это не работает, я думаю, что этот движок должен обрабатывать идентификаторы строк

сделать то же самое в toSearchableArray()

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

Я не знаю, что вы установили в качестве ключа

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

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

        return $array;
    }

Это работает

Последняя вещь.
Алголия обрабатывает это автоматически вместе с созданием индекса.
Я имею в виду, что Алголия создает индекс, если он не существует, и я могу индексировать идентификаторы буквами без какого-либо преобразования.
Я думаю, что MS должна включать в себя обе функции.

Я имею в виду, Алголия создает индекс, если он не существует

Действительно, API MeiliSearch еще не поддерживает эту функцию.
В качестве альтернативного решения большинство наших SDK предоставляют метод get_or_create_index (как это делает PHP SDK) 🙂

и я могу индексировать идентификаторы буквами без преобразования.

Проблема, с которой вы столкнулись, связана с достоверностью JSON. Даже Algolia API не принимает недопустимый JSON: отправка числа с буквами без кавычек ( " ) считается недопустимым JSON и завершится ошибкой.

См. информационную панель Algolia:

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

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

Возможно, Laravel SDK от Algolia преобразует ваше число с буквами в строку, и поэтому у вас не было сбоев 🙂

Я думаю, что MS должна включать в себя обе функции.

Так что, возможно, meilisearch-laravel-scout может включать «функцию цитирования», но MeiliSearch не может, так как ожидает действительный JSON 😉

Да, в обоих случаях я говорю об этом Scout Engine, здесь мы занимаемся интеграцией Scout.
SDK может предоставить метод для создания индекса, но Scout не работает, если индекс не существует.

То же самое с Id с буквами, я понимаю, что JSOn искажен, но движок Scout должен контролировать это, прежде чем он выйдет из строя.
Как Алголия, потому что она не ошибается с буквами.

Хорошо, хорошо, я не был уверен, что понял 😉

Они могли бы быть хорошими функциями для реализации тогда! 🙂

Изменить: мы должны подумать, реализуем ли мы это в пакете meilisearch-php или в пакете meilisearch-laravel-scout.

@куркиза
Это зависит от того, оба хороши.

Если мы реализуем это в scout, я думаю, symfony (и другие реализации фреймворка) также должны реализовать это (возможно, это уже так). Так что, может быть, лучше иметь его в SDK?

Я не уверен, что scout реализует это для Algolia, я думаю, что это обрабатывается Algolia PHP SDK, я проверю это, когда у меня будет немного свободного времени.

@shokme , вы правы, возможно, было бы разумнее сделать это в PHP SDK, а не в интеграции laravel-scout.
Дайте нам знать о вашем расследовании, я перенесу проблему (или создам ее заново) соответствующим образом! 🙂

Итак, после расследования всего этого.
Я установил mongodb в laravel, используя jenssegers/laravel-mongodb .

Я начал с создания своего файла index.
php artisan scout:index cars -k _id

создать модель

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

создание новой машины

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

Модель была отправлена ​​на meilisearch без проблем!

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

При выполнении поиска я получаю правильный результат

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

```json
[
{
"_id": "5f4a93dbd9668370086c7752",
"имя": "мустанг",
"конструктор": "форд",
"тип": "мышца",
«лошадей»: 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"
}

Итак, если честно, я не понимаю, почему вы не возвращаете строку на $this->_id @elfeffe

@shokme я не знаю. Я возобновлю свою работу с поиском через несколько дней и дам вам знать, если найду что-то новое.
SDK должен автоматически создавать индекс, как это делает Algolia, с правильным Id, чтобы избежать ошибок.

SDK должен автоматически создавать индекс, как это делает Algolia, с правильным Id, чтобы избежать ошибок.

Планируется в ядре MeiliSearch! 🙂
https://github.com/meilisearch/MeiliSearch/issues/918

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

milosevicn picture milosevicn  ·  5Комментарии

husonghua picture husonghua  ·  5Комментарии

dmyers picture dmyers  ·  14Комментарии

curquiza picture curquiza  ·  4Комментарии

desaintflorent picture desaintflorent  ·  8Комментарии