Algolia Search هو محرك بحث مستضاف للنصوص الكاملة والعددية والأوجه قادر على تقديم نتائج في الوقت الفعلي من أول ضغطة على المفتاح.
تم إهمال هذه الحزمة، ننصحك باستخدام Laravel Scout . إذا كنت ترغب في توسيع قدرات الكشافة، يرجى الرجوع إلى وثائقنا المخصصة
تقوم حزمة PHP هذه بدمج Algolia Search API في Laravel Eloquent ORM. يعتمد ذلك على حزمة algoliasearch-client-php.
ملاحظة: إذا كنت تستخدم Laravel 4، فاطلع على مستودع algoliasearch-laravel-4.
يمكنك العثور على المرجع الكامل على موقع Algolia الإلكتروني.
ثَبَّتَ
بداية سريعة
خيارات
objectID
المخصصالعلاقات
الفهرسة
إدارة المؤشرات
التوافق البليغ
أضف algolia/algoliasearch-laravel
إلى ملف composer.json
الخاص بك:
composer require algolia/algoliasearch-laravel
أضف مزود الخدمة إلى config/app.php
في مصفوفة providers
.
AlgoliaSearch Laravel AlgoliaServiceProvider ::class
يتطلب Laravel Algolia تكوين اتصال. للبدء، ستحتاج إلى نشر جميع أصول المورد:
php artisan vendor:publish
يمكنك إضافة خيار --provider="VinklaAlgoliaAlgoliaServiceProvider"
لنشر أصول حزمة Algolia فقط.
سيؤدي هذا إلى إنشاء ملف config/algolia.php
في تطبيقك والذي يمكنك تعديله لضبط التكوين الخاص بك. تأكد أيضًا من التحقق من التغييرات مقارنة بملف التكوين الأصلي بعد الترقية.
يضيف التعليمة البرمجية التالية إمكانات البحث إلى نموذج Contact
الخاص بك لإنشاء فهرس Contact
:
use Illuminate Database Eloquent Model ;
use AlgoliaSearch Laravel AlgoliaEloquentTrait ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
}
افتراضيًا، يتم إرسال كافة السمات المرئية. إذا كنت تريد إرسال سمات محددة، يمكنك القيام بشيء مثل:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public function getAlgoliaRecord ()
{
return array_merge ( $ this -> toArray (), [
' custom_name ' => ' Custom Name '
]);
}
}
بعد إعداد النموذج الخاص بك، يتعين عليك إجراء استيراد أولي لبياناتك يدويًا. يمكنك القيام بذلك عن طريق استدعاء reindex
في فئة النموذج الخاص بك. باستخدام مثالنا السابق، سيكون هذا:
Contact :: reindex ();
نحن نقدم العديد من الطرق لتكوين إعدادات الفهرس الخاص بك لضبط الملاءمة الإجمالية، ولكن أهمها هي السمات القابلة للبحث والسمات التي تعكس شعبية السجل . يمكنك تكوينها بالكود التالي:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ algoliaSettings = [
' searchableAttributes ' => [
' id ' ,
' name ' ,
],
' customRanking ' => [
' desc(popularity) ' ,
' asc(name) ' ,
],
];
}
يمكنك نشر (حفظ) الإعدادات في algolia باستخدام طريقة setSetting
:
Contact :: setSettings ();
يتم استخدام المرادفات لإخبار المحرك بالكلمات أو التعبيرات التي يجب اعتبارها متساوية فيما يتعلق بأهمية النص.
تم تصميم واجهة برمجة تطبيقات المرادفات الخاصة بنا لإدارة مجموعة كبيرة من المرادفات للفهرس ونسخه المتماثلة بسهولة قدر الإمكان.
يمكنك استخدام واجهة برمجة تطبيقات المرادفات عن طريق إضافة synonyms
في خاصية فئة $algoliaSettings
مثل هذا:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ algoliaSettings = [
' synonyms ' => [
[
' objectID ' => ' red-color ' ,
' type ' => ' synonym ' ,
' synonyms ' => [ ' red ' , ' another red ' , ' yet another red ' ]
]
]
];
}
يمكنك نشر (حفظ) الإعدادات في algolia باستخدام طريقة setSetting
:
Contact :: setSettings ();
تميل تطبيقات البحث التقليدية إلى أن يكون لديها منطق بحث ووظيفة في الواجهة الخلفية. كان هذا منطقيًا عندما كانت تجربة البحث تتألف من قيام المستخدم بإدخال استعلام بحث، وتنفيذ هذا البحث، ثم إعادة توجيهه إلى صفحة نتائج البحث.
لم يعد تنفيذ البحث على الواجهة الخلفية ضروريًا. في الواقع، يكون ذلك ضارًا بالأداء في معظم الحالات بسبب الشبكة الإضافية وزمن وصول المعالجة. نوصي بشدة باستخدام عميل JavaScript API الخاص بنا لإصدار جميع طلبات البحث مباشرةً من متصفح المستخدم النهائي أو جهازه المحمول أو عميله. سيؤدي ذلك إلى تقليل زمن الوصول الإجمالي للبحث أثناء تفريغ خوادمك في نفس الوقت.
في كود JavaScript الخاص بك، يمكنك القيام بما يلي:
var client = algoliasearch ( 'ApplicationID' , 'Search-Only-API-Key' ) ;
var index = client . initIndex ( 'YourIndexName' ) ;
index . search ( 'something' , function ( success , hits ) {
console . log ( success , hits )
} , { hitsPerPage : 10 , page : 0 } ) ;
يمكنك أيضًا استخدام طريقة search
، ولكن لا يُنصح بتنفيذ تجربة بحث فورية/في الوقت الفعلي من الواجهة الخلفية (يوفر البحث في الواجهة الأمامية تجربة أفضل للمستخدم):
Contact :: search ( ' jon doe ' );
في كل مرة يتم حفظ السجل؛ سيتم فهرسته - بشكل غير متزامن. من ناحية أخرى، في كل مرة يتم فيها تدمير السجل، سيتم إزالته - بشكل غير متزامن - من الفهرس.
يمكنك تعطيل الفهرسة التلقائية والإزالة التلقائية عن طريق ضبط الخيارات التالية:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public static $ autoIndex = false ;
public static $ autoDelete = false ;
}
يمكنك تعطيل الفهرسة التلقائية مؤقتًا. يتم ذلك غالبًا لأسباب تتعلق بالأداء.
Contact :: $ autoIndex = false ;
Contact :: clearIndices ();
for ( $ i = 0 ; $ i < 10000 ; $ i ++) {
$ contact = Contact :: firstOrCreate ([ ' name ' => ' Jean ' ]);
}
Contact :: reindex (); // Will use batch operations.
Contact :: $ autoIndex = true ;
يمكنك أيضًا إنشاء شرط ديناميكي لهاتين المعلمتين عن طريق إنشاء autoDelete method
autoIndex
و/أو الحذف التلقائي في النموذج الخاص بك
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public function autoIndex ()
{
if ( App :: environment () === ' test ' ) {
return false ;
}
return true ;
}
public static autoDelete()
{
if ( App ::environment() === 'test') {
return false ;
}
return true ;
}
}
كن حذرًا في تحديد هاتين الطريقتين في AlgoliaEloquentTrait. عند وضع هذه الأساليب في فئة أصل، سيتم "مسحها" بواسطة AlgoliaEloquentTrait إذا تم استخدامها في فئة فرعية (بسبب وراثة php).
افتراضيًا، سيكون اسم الفهرس هو اسم الفئة بصيغة الجمع، على سبيل المثال "جهات الاتصال". يمكنك تخصيص اسم الفهرس باستخدام خيار $indices
:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ indices = [ ' contact_all ' ];
}
يمكنك إضافة اسم الفهرس إلى بيئة التطبيق الحالية باستخدام الخيار التالي:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public static $ perEnvironment = true ; // Index name will be 'Contacts_{App::environnement()}';
}
objectID
المخصص افتراضيًا، يعتمد objectID
على keyName
الخاص بسجلك ( id
افتراضيًا). يمكنك تغيير هذا السلوك من خلال تحديد خيار objectIdKey
(تأكد من استخدام حقل uniq).
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public static $ objectIdKey = ' new_key ' ;
}
يمكنك إضافة قيود تتحكم في ما إذا كان يجب فهرسة السجل عن طريق تحديد طريقة indexOnly()
.
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public function indexOnly ( $ index_name )
{
return ( bool ) $ condition ;
}
}
بشكل افتراضي، ستقوم حزمة Algolia بجلب العلاقات المحملة .
إذا كنت تريد فهرسة السجلات التي لم تقم بتحميل أي علاقات بعد، فيمكنك القيام بذلك عن طريق تحميلها في getAlgoliaRecord
الذي يمكنك إنشاؤه في النموذج الخاص بك.
سوف تبدو مثل:
public function getAlgoliaRecord ()
{
/**
* Load the categories relation so that it's available
* in the laravel toArray method
*/
$ this -> categories ;
return $ this -> toArray ();
}
في الكائن الناتج، سيكون لديك فئات تم تحويلها إلى مصفوفة بواسطة Laravel. إذا كنت تريد بنية علاقة مخصصة، فستفعل بدلاً من ذلك شيئًا مثل:
public function getAlgoliaRecord ()
{
/**
* Load the categories relation so that it's available
* in the laravel toArray method
*/
$ extra_data = [];
$ extra_data [ ' categories ' ] = array_map ( function ( $ data ) {
return $ data [ ' name ' ];
}, $ this -> categories -> toArray ());
return array_merge ( $ this -> toArray (), $ extra_data );
}
افتراضيًا، لن تتمكن Algolia إلا من الوصول إلى السمات المرئية لنموذجك. لذلك، على سبيل المثال، سوف تتلقى استثناء No content in PUT request
عند استخدام رمز المثال هذا، لأن مفتاح invisible_attribute
يُرجع متغيرًا فارغًا/فارغًا.
protected $ visible = [ ' visible_attribute ' , ' other_visible_attribute ' ];
public function getAlgoliaRecord ()
{
return [
' invisible_attribute ' => $ this -> invisible_attribute
];
}
قبل الفهرسة، تأكد من إدراج سماتك المرئية بشكل صحيح. لتجاوز قناع الأمان الذي يفرضه Laravel، يمكنك استخدام $this->attributes['invisible_attribute']
للوصول مباشرة إلى السمة حتى لو لم تكن مرئية، ولكن التوصية هي تجنب هذا النوع من الوصول إلى السمات في النموذج الخاص بك.
يمكنك تشغيل الفهرسة باستخدام طريقة مثيل pushToIndex
.
$ contact = Contact :: firstOrCreate ([ ' name ' => ' Jean ' ]);
$ contact -> pushToIndex ();
وقم بتشغيل الإزالة باستخدام طريقة مثيل removeFromIndex
.
$ contact = Contact :: firstOrCreate ([ ' name ' => ' Jean ' ]);
$ contact -> removeFromIndex ();
لإعادة فهرسة جميع سجلاتك بأمان (فهرسة إلى فهرس مؤقت + نقل الفهرس المؤقت إلى الفهرس الحالي ذريًا)، استخدم طريقة فئة reindex
:
Contact :: reindex ();
لإعادة فهرسة جميع سجلاتك (في مكانها الصحيح، دون حذف السجلات القديمة):
Contact :: reindex ( false );
لتعيين الإعدادات أثناء عملية إعادة الفهرسة:
Contact :: reindex ( true , true );
للاحتفاظ بالإعدادات التي قمت بتعيينها على لوحة معلومات Algolia عند إعادة فهرسة الإعدادات وتغييرها:
Contact :: reindex ( true , true , true );
لتنفيذ رد اتصال يتم استدعاؤه في كل مرة تتم فهرسة مجموعة من الكيانات:
Contact :: reindex ( true , true , false , function ( $ entities )
{
foreach ( $ entities as $ entity )
{
var_dump ( $ entity -> id ); // Contact::$id
}
});
لمسح فهرس، استخدم طريقة فئة clearIndices
:
Contact :: clearIndices ( ) ;
يمكنك تحديد فهارس النسخ المتماثلة باستخدام المتغير $algolia_settings
:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ algoliaSettings = [
' searchableAttributes ' => [
' id ' ,
' name ' ,
],
' customRanking ' => [
' desc(popularity) ' ,
' asc(name) ' ,
],
' replicas ' => [
' contacts_desc ' ,
],
];
public $ replicasSettings = [
' contacts_desc ' => [
' ranking ' => [
' desc(name) ' ,
' typo ' ,
' geo ' ,
' words ' ,
' proximity ' ,
' attribute ' ,
' exact ' ,
' custom '
]
]
];
}
للبحث باستخدام نسخة طبق الأصل، استخدم الكود التالي:
Book :: search ( ' foo bar ' , [ ' index ' => ' contacts_desc ' ]);
يمكنك فهرسة سجل في عدة فهارس باستخدام الخاصية $indices
:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ indices = [
' contact_public ' ,
' contact_private ' ,
];
public function indexOnly ( $ indexName )
{
if ( $ indexName == ' contact_public ' )
return true ;
return $ this -> private ;
}
}
للبحث باستخدام فهرس إضافي استخدم الكود التالي:
Book :: search ( ' foo bar ' , [ ' index ' => ' contacts_private ' ]);
عمل:
Ad :: where ( ' id ' , $ id )-> update ( $ attributes );
لن يؤدي ذلك إلى تشغيل أي شيء في النموذج (لذلك لن يحدث أي تحديث في Algolia). وذلك لأنها ليست دعوة بليغة. إنها مجرد طريقة ملائمة لإنشاء الاستعلام المخفي خلف النموذج.
لجعل هذا الاستعلام يعمل مع Algolia، عليك القيام بذلك على النحو التالي:
Ad :: find ( $ id )-> update ( $ attributes );
متوافق مع تطبيقات 5.x