Meilisearch-laravel-scout: لا يمكنني فهرسة المستندات الخاصة بي (لا بأس بها في Algolia)

تم إنشاؤها على ٤ أغسطس ٢٠٢٠  ·  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'
وأحصل على []

إذا قمت بالفهرسة في Algolia ، فستكون المستندات الخاصة بي على ما يرام هناك.
أيضًا إذا قمت بفهرسة الأفلام أثناء القيام بما يلي:
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

هل قمت بتعيين قائمة الانتظار => صحيح في scout.php أو SCOUT_QUEUE = صحيح في .env الخاص بك؟

لقد حاولت باستخدام كل من الصواب والخطأ لقوائم الانتظار. دائما أحصل

طرازات [AppModelsProduct] المستوردة حتى المعرف: 5eea4b314c80095faf5be593
نماذج [AppModelsProduct] المستوردة حتى المعرف: 5eea4bd94c80095faf5be787
نماذج [AppModelsProduct] المستوردة حتى المعرف: 5eea4cc34c80095faf5be97b
نماذج [AppModelsProduct] المستوردة حتى المعرف: 5eea4dfa4c80095faf5beb6f
نماذج [AppModelsProduct] المستوردة حتى المعرف: 5eea4f6b4c80095faf5bed63
طرازات [AppModelsProduct] المستوردة حتى المعرف: 5eea51164c80095faf5bef57
طرازات [AppModelsProduct] المستوردة حتى المعرف: 5eea524e4c80095faf5bf099

لكن لا توجد ducuments.
أعرف مكان وجود سجلات Laravel ، لكن ليس لدي أخطاء هناك ، ما أريد رؤيته هو سجلات MS.
هل هناك طريقة لمعرفة ما يحدث؟

باستخدام نفس الإعدادات ، تقوم Algolia بفهرسة المستندات الخاصة بي.

حسنًا ، Meilisearch Laravel scout هو مجرد محرك مثل نسخة عجينة من Algolia. لذلك لا ينبغي أن تكون مشكلة ولكن أيضًا لم أحاول مطلقًا تشغيلها مع mongodb ...

eskombrocurquiza يمكن الإجابة على سجلات MS.

هذا مرتبط بـ MongoDB ، لأن نموذج المستخدمين هو MySQL ويعمل.
أعني ، هذا مرتبط بـ MongoDB / Meilisearch ، لأن Algolia تعمل أيضًا مع MongoDB.

سيكون من الرائع أن أتمكن من رؤية بعض السجلات من MS ، فمن المحزن أن تدعمها Algolia وليس Meilisearch.

يمكنني محاولة حفر المشكلة ، لكني أحتاج إلى مساعدتك حول كيفية تثبيت mongoDB مع Laravel

بالنسبة إلى الآن ، تتم طباعة سجلات MeiliSearch مباشرةً على stdout ، لذلك يعتمد ذلك على مكان تشغيل مثيل 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" هو MongoDB _id
هذا يعيد هذا الجمال

{"message": "JSON غير صالح: رقم غير صالح في السطر 1 العمود 11" ، "رمز الخطأ": "bad_request" ، "errorType": "alid_request_error "،" errorLink ":" https://docs.meilisearch.com/errors #bad_request "}

أعتقد أن JSON صالح ، هناك بعض المشاكل مع MS والمفتاح المخصص.
لا أعرف ما إذا كان هذا هو الطول أم الأحرف أم ماذا.

بعد بعض المحاولات أعتقد أن الحروف هي المشكلة ، لا يقبل MS الأحرف الموجودة في الهوية. لكن 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;
    }

انه يعمل انها تعمل

شيء أخير.
يتعامل Algolia مع ذلك تلقائيًا ، جنبًا إلى جنب مع إنشاء الفهرس.
أعني ، تقوم Algolia بإنشاء الفهرس إذا لم يكن موجودًا ، ويمكنني فهرسة المعرفات بأحرف دون أي تحويل.
أعتقد أن MS يجب أن تتضمن كلتا الميزتين.

أعني ، تقوم Algolia بإنشاء الفهرس إذا لم يكن موجودًا

في الواقع ، لا تتعامل MeiliSearch API مع هذه الميزة حتى الآن.
كحل بديل ، توفر معظم حزم 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 هنا.
يمكن أن توفر SDK طريقة لإنشاء الفهرس ، لكن يفشل Scout إذا لم يكن الفهرس موجودًا.

الشيء نفسه مع المعرف بالحروف ، أفهم أن JSOn مشوه ، لكن محرك الكشافة يتحكم في ذلك قبل أن يفشل.
كما هو الحال مع Algolia ، لأن هذا الشخص لا يفشل مع الحروف.

حسنًا ، حسنًا ، لم أكن متأكدًا من فهم 😉

يمكن أن تكون ميزات لطيفة لتطبيقها بعد ذلك! 🙂

تحرير: يجب أن نفكر إذا قمنا بتنفيذ ذلك في meilisearch-php أو في حزمة meilisearch-laravel-scout.

تضمين التغريدة
هذا يعتمد ، كلاهما جيد.

إذا قمنا بتطبيقه في الكشافة ، أعتقد أن symfony (وتنفيذ إطار عمل آخر) يجب أن ينفذه أيضًا (قد يكون الأمر كذلك بالفعل). لذلك قد يكون من الأفضل وضعها في SDK بدلاً من ذلك؟

لست متأكدًا من قيام الكشافة بتنفيذها لـ Algolia ، أعتقد أن هذا يتم التعامل معه بواسطة Algolia PHP SDK ، وسوف أتحقق من ذلك عندما يكون لدي القليل من وقت الفراغ.

shokme ، أنت على حق ، قد يكون من الأفضل القيام بذلك في PHP SDK بدلاً من تكامل Laravel-scout.
أخبرنا بالتحقيق الذي أجريته ، وسأنقل المشكلة (أو أعد إنشاء واحدة) وفقًا لذلك! 🙂

لذلك ، بعد التحقيق في الأمر برمته.
لقد قمت بتثبيت mongodb في Laravel باستخدام jenssegers/laravel-mongodb .

لقد بدأت بإنشاء الفهرس الخاص بي.
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" ،
"الاسم": "موستانج"،
"المُنشئ": "ford"،
"النوع": "العضلات"،
"خيول": 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

تضمين التغريدة سأستأنف عملي بالبحث في غضون أيام قليلة وسأخبرك إذا وجدت شيئًا جديدًا.
يجب أن تنشئ SDK الفهرس تلقائيًا كما تفعل Algolia ، مع I الصحيح ، لتجنب الأخطاء.

يجب أن تنشئ SDK الفهرس تلقائيًا كما تفعل Algolia ، مع I الصحيح ، لتجنب الأخطاء.

تم التخطيط له في محرك MeiliSearch الأساسي! 🙂
https://github.com/meilisearch/MeiliSearch/issues/918

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

husonghua picture husonghua  ·  5تعليقات

Cannonb4ll picture Cannonb4ll  ·  6تعليقات

desaintflorent picture desaintflorent  ·  8تعليقات

Kladislav picture Kladislav  ·  8تعليقات

milosevicn picture milosevicn  ·  5تعليقات