يوفر امتداد بحثًا بسيطًا عن النص الكامل مع الأفكار تحصل من Laravel/Scout و Base على Teamtnt/Tntsearch Wrapper لتسجيل Yii2 النشط.
تتطلب yii2 قابلة للبحث باستخدام الملحن:
composer require vxm/yii2-searchable أخيرًا ، أضف سمة vxmsearchableSearchableTrait وإرفاق vxmsearchableSearchableBehavior إلى السجل النشط الذي ترغب في جعله قابلاً للبحث. سيساعد ذلك في مزامنة النموذج مع بيانات الفهرس.
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
}على الرغم من أنه غير مطلوب بدقة لاستخدام هذا الامتداد ، يجب عليك التفكير بقوة في تكوين yii2-queue قبل استخدام امتداد. سيسمح تشغيل عامل قائمة انتظار بصفته قائمة انتظار جميع العمليات التي تتم مزامنة معلومات النموذج الخاصة بك مع فهارس البحث ، مما يوفر أوقات استجابة أفضل بكثير لواجهة الويب الخاصة بالتطبيق.
بمجرد تكوين مكون قائمة انتظار ، قم بتعيين قيمة خيار قائمة الانتظار في ملف تكوين التطبيق الخاص بك إلى معرف مكون منه أو تكوين صفيف منه.
' components ' => [
' searchable ' => [
' class ' => ' vxmsearchableSearchable ' ,
' queue ' => ' queueComponentId '
]
] بشكل افتراضي ، سيتم إضافة مكون إلى مكونات التطبيق الخاصة بك عبر bootstrapping مع معرف searchable . إذا كنت بحاجة إلى تكوينه ، فيمكنك التكوين اليدوي في ملف تكوين التطبيق الخاص بك:
' components ' => [
' searchable ' => [
' class ' => ' vxmsearchableSearchable ' ,
' storagePath ' => ' @runtime/vxm/search ' ,
' queue ' => null , // an optional not required
' defaultSearchMode ' => vxm searchable Searchable:: FUZZY_SEARCH ,
' asYouType ' => false ,
' fuzziness ' => false ,
' fuzzyPrefixLength ' => 2 ,
' fuzzyMaxExpansions ' => 50 ,
' fuzzyMaxExpansions ' => 50 ,
' fuzzyDistance ' => 50
]
] تتم مزامنة كل نموذج سجل نشط مع index بحث معين ، والذي يحتوي على جميع السجلات القابلة للبحث لهذا النموذج. بمعنى آخر ، يمكنك التفكير في كل فهرس مثل جدول MySQL. بشكل افتراضي ، سيتم استمرار كل نموذج في فهرس يطابق اسم table النموذجي للنموذج. عادة ، هذا هو الشكل الجمع لاسم النموذج ؛ ومع ذلك ، فأنت حر في تخصيص اسم index من خلال تجاوز الطريقة الثابتة searchableIndex في فئة نموذج السجل النشط:
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
/**
* Get the index name for the model class.
*
* @return string
*/
public static function searchableIndex (): string
{
return ' articles_index ' ;
}
} بشكل افتراضي ، سيتم استمرار نموذج toArray بأكمله لنموذج معين في مؤشر البحث الخاص به. إذا كنت ترغب في تخصيص البيانات التي تتم مزامنتها مع فهرس البحث ، فيمكنك تجاوز طريقة toSearchableArray على النموذج:
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
/**
* Get the indexable data array for the model.
*
* @return array
*/
public function toSearchableArray (): array
{
$ array = $ this -> toArray ();
// Customize array...
return $ array ;
}
} بشكل افتراضي ، اسم المفتاح الأساسي للنموذج باعتباره المعرف الفريد المخزن في فهرس البحث. إذا كنت بحاجة إلى تخصيص هذا السلوك ، فيمكنك تجاوز الطريقة الثابتة searchableKey في النموذج:
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
/**
* Get searchable key by default primary key will be use.
*
* @return string key name.
*/
public static function searchableKey (): string
{
return ' id ' ;
}
}إذا كنت تقوم بتثبيت ملحق في مشروع موجود ، فقد يكون لديك بالفعل سجلات قاعدة بيانات تحتاج إلى استيرادها إلى برنامج تشغيل البحث. يوفر هذا الامتداد إجراء استيراد قد تستخدمه لاستيراد جميع السجلات الموجودة في فهارس البحث الخاصة بك:
php yii searchable/import -- models ="app models Post " يمكنك استيراد فئات النماذج متعددة النماذج عن طريق الفاصل , :
php yii searchable/import -- models ="app models Post , app models Category " بمجرد إضافة vxmsearchableSearchableTrait وربط سلوك vxmsearchableSearchableBehavior إلى نموذج ، كل ما عليك فعله هو حفظ مثيل النموذج وسيتم إضافته تلقائيًا إلى فهرس البحث. إذا كنت قد قمت بتكوين قائمة انتظار ، فسيتم تنفيذ هذه العملية في الخلفية بواسطة عامل قائمة الانتظار الخاص بك:
$ post = new app models Post ;
// ...
$ post -> save (); إذا كنت ترغب في إضافة نتائج استعلام نشطة إلى فهرس البحث الخاص بك ، فيمكنك استخدام طريقة makeSearchable في نتيجة استعلام نشطة. ستؤدي الطريقة makeSearchable إلى قطع نتائج الاستعلام وإضافة السجلات إلى فهرس البحث الخاص بك. مرة أخرى ، إذا كنت قد قمت بتكوين قائمة انتظار ، فسيتم إضافة جميع القطع في الخلفية من قبل عمال قائمة الانتظار:
// Adding via Active Query result...
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: makeSearchable ( $ models ); يمكن اعتبار الطريقة makeSearchable عملية upsert . بمعنى آخر ، إذا كان سجل النموذج موجودًا بالفعل في الفهرس ، فسيتم تحديثه. إذا لم يكن موجودًا في فهرس البحث ، فسيتم إضافته إلى الفهرس.
لتحديث نموذج قابل للبحث ، تحتاج فقط إلى تحديث خصائص مثيل النموذج وحفظ النموذج في قاعدة البيانات الخاصة بك. سيستمر هذا الامتداد تلقائيًا التغييرات في فهرس البحث الخاص بك:
$ post = app models Post:: findOne ( 1 );
// Update the post...
$ post -> save (); يمكنك أيضًا استخدام الطريقة makeSearchable في فئة سجل نشطة لتحديث المثيل. إذا لم تكن النماذج موجودة في فهرس البحث ، فسيتم إنشاءها:
// Updating via Active Query result...
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: makeSearchable ( $ models );لحذف سجل من الفهرس الخاص بك ، حذف النموذج من قاعدة البيانات:
$ post = app models Post:: findOne ( 1 );
$ post -> delete (); إذا كنت ترغب في حذف نتيجة استعلام نشطة من فهرس البحث الخاص بك ، فيمكنك استخدام طريقة deleteSearchable في فئة سجل نشطة:
// Deleting via Active Query result...
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: deleteSearchable ( $ models ); في بعض الأحيان قد تحتاج إلى إجراء مجموعة من عمليات السجل النشط على نموذج دون مزامنة بيانات النموذج مع فهرس البحث الخاص بك. يمكنك القيام بذلك باستخدام طريقة withoutSyncingToSearch . تقبل هذه الطريقة رد اتصال واحد سيتم تنفيذه على الفور. لن يتم مزامنة أي عمليات نموذجية تحدث داخل رد الاتصال مع فهرس النموذج:
app models Post:: withoutSyncingToSearch ( function () {
$ post = app models Post:: findOne ( 1 );
$ post -> save (); // will not syncing with index data
}); في بعض الأحيان ، قد تحتاج إلى جعل نموذج قابل للبحث فقط في ظل ظروف معينة. على سبيل المثال ، تخيل أن لديك نموذج appmodelsArticle الذي قد يكون في إحدى دولتين: draft published . قد ترغب فقط في السماح للمنشورات published بأن تكون قابلة للبحث. لإنجاز هذا ، يمكنك تحديد طريقة shouldBeSearchable على النموذج الخاص بك:
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
/**
* Determine if the model should be searchable.
*
* @return bool
*/
public static function shouldBeSearchable ()
{
return $ this -> is_published ;
}
} لا يتم تطبيق طريقة shouldBeSearchable إلا عند معالجة النماذج من خلال طريقة حفظ. سيؤدي صنع النماذج مباشرة باستخدام الطريقة searchable أو makeSearchable إلى تجاوز نتيجة طريقة shouldBeSearchable :
// Will respect "shouldBeSearchable"...
$ post = app models Post:: findOne ( 1 );
$ post -> save ();
// Will override "shouldBeSearchable"...
$ post -> searchable ();
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: makeSearchable ( $ models ); يمكنك البدء في البحث عن نموذج باستخدام طريقة search . تقبل طريقة البحث سلسلة واحدة سيتم استخدامها للبحث في النماذج الخاصة بك. هذه الطريقة تُرجع ActiveQuery يمكنك إضافة المزيد من الحالة أو العلاقة مثل استعلام الأصل.
ملاحظة عند إضافة المزيد من شرط الاستعلام ، يجب ألا تستخدم
whereاستخدام الطريقةandWhereأوorWhereبدلاً من ذلك لأنه سيتجاوز نتيجة شرط معرفات البحث.
$ posts = app models Post:: search ( ' vxm ' )-> all ();
$ posts = app models Post:: search ( ' vxm ' )-> andWhere ([ ' author_id ' => 1 ])-> all ();
// not use
$ posts = app models Post:: search ( ' vxm ' )-> where ([ ' author_id ' => 1 ])-> all (); يمكنك الانضمام إلى العلاقات في استعلام البحث مع دعم العلاقات searchable :
$ posts = app models Post:: search ( ' vxm ' )-> joinWith ( ' category ' )-> andWhere (Category:: search ( ' vxm category ' )); يمكنك اختيار وضع بحث boolean أو fuzzy كمعلمة ثانية إذا لم يتم تعيين defaultSearchMode للمكون Searchable :
$ posts = app models Post:: search ( ' vxm ' , ' fuzzy ' , [ ' fuzziness ' => true ])-> all ();
$ posts = app models Post:: search ( ' vxm ' , ' boolean ' )-> all ();لمزيد من التفاصيل عن وضع البحث ، يرجى الرجوع إلى TeamTnt/Tntsearch لمشاهدة المستند الكامل.