تنفيذ محرك بحث سهل الاستخدام في كيانات العقيدة.
للاستخدام الأساسي ، كل ما عليك فعله هو تحديد خريطة للكيانات التي تم تفتيشها وخصائصها ، وسيقوم محرك البحث بترتيبها ليتم تحميلها بشكل صحيح وسيقوم تلقائيًا بفرز نتائج البحث بناءً على المرشحين الموجودين.
الغرض من الحزمة هو توفير واجهة برمجة تطبيقات بسيطة للبحث عن النص الكامل المتقدم في كيانات المبدأ. في بداية الطلب ، تم تصميم مخطط بحث ويضمن هذه الحزمة تلقائيًا أن يتم العثور على أفضل النتائج وإعادتها بناءً على الأهمية.
لتثبيت ملحن مكالمة الحزمة يدويًا وتنفيذ الأمر التالي:
$ composer require baraja-core/doctrine-fulltext-search ثم قم بتسجيل DoctrineFulltextSearchExtension في التكوين النيون:
extensions :
doctrineFulltextSearch : BarajaSearchDoctrineFulltextSearchExtension أو يمكنك إنشاء مثيل BarajaSearchSearch يدويًا.
يتم إجراء البحث عن طريق بناء استعلام (كيانات رسم الخرائط والأعمدة):
$ results = $ this -> search -> search ( $ query , [
Article ::class => [ ' :title ' ],
User ::class => ' :username ' , // it can also be an ordinary string for a single column
UserLogin ::class => [ ' :ip ' , ' hostname ' , ' userAgent ' ],
]);
echo $ results ; // Uses the default HTML renderer أو يمكنك استخدام SelectorBuilder مع عمليات التحقق الصارمة الكاملة وطرق التلميح لبناء الاستعلام:
$ results = $ this -> search -> selectorBuilder ( $ query )
-> addEntity ( Article ::class)
-> addColumnTitle ( ' title ' )
-> addEntity ( User ::class)
-> addColumnTitle ( ' username ' )
-> addEntity ( UserLogin ::class)
-> addColumnTitle ( ' ip ' )
-> addColumn ( ' hostname ' )
-> addColumnSearchOnly ( ' userAgent ' )
-> search ();
echo $ results ;ليست هناك حاجة للهروب من الإخراج ، يتم حل كل المنطق بواسطة المحرك تلقائيًا.
:username - سيتم استخدام العمود كتعليق
!slug - سيتم استخدام العمود للبحث ، ولكن تم تجاهله في إخراج Perex.
_durationTime - سيتم تحميل العمود في الكيان ، ولكن لن يؤخذ في الاعتبار عند حساب الأهمية ولن يتم تضمينه في Perex.
content.versions.haystack - علاقة بين الكيانات تنشئ تلقائيًا وينضم إلى آخر خاصية.
versions(content) - Getter المخصص (انضم تلقائيًا إلى عمود versions ، ولكن اتصل على getContent() للحصول على البيانات).
إذا استخدمنا القولون في بداية اسم العمود (على سبيل المثال ':username' ) ، فسيتم استخدامه تلقائيًا كعنوان.
سيتم عرض العنوان حتى لو لم يحتوي على كلمات البحث.
قد تكون التسمية التوضيحية فارغة وقد لا تكون موجودة (قد تكون null ).
إذا لم يكن العنوان موجودًا ، فيمكن للمحرك حسابه تلقائيًا وفقًا لأفضل حدوث في النص الموجود.
يتم تطبيع استعلام البحث تلقائيًا وإزالة الكلمات المتوقفة ، والتي لا من المنطقي البحث.
يمكن تجاوز الخوارزمية في مشروع معين من خلال تنفيذ واجهة IQueryNormalizer وكتبه في حاوية DIC.
إخراج طريقة search() هو كيان لنوع SearchResult ، والذي ينفذ واجهة Iterator للقدرة على الدوران بسهولة من خلال النتائج.
نصيحة: إذا كنت بحاجة فقط إلى طباعة نتائج البحث بسرعة ولم تكن متطلبات المظهر عالية جدًا ، فإن كيان
SearchResultينفذ مباشرة طريقة__toString()لسهولة تقديم النتائج مباشرة مثل HTML.
تلخص نتيجة البحث جميع نتائج جميع عمليات البحث في جميع الكيانات. يتم الحصول على جميع النتائج بواسطة طريقة getItems() - سيكون الإخراج مجموعة من الكيانات من نوع SearchItem[] .
ومع ذلك ، نحتاج غالبًا إلى تجميع استعلام بكميات كبيرة ثم القائمة ، على سبيل المثال ، الفئات والمنتجات بشكل منفصل. للقيام بذلك ، استخدم طريقة Helper getItemsOfType(string $type) ، والتي تُرجع مجموعة مقطوعة من نتائج SearchItem[] فقط للكيانات وفقًا للمعلمة التي تم تمريرها.
استخدمنا طريقة getItems() أو getItemsOfType() للحصول على نتائج البحث التي نمر بها. ولكن كيف تعمل بنتيجة محددة؟
من المهم أن نلاحظ أنه في هذه المرحلة لم يعد لدينا طريقة __toString() المتاحة ويجب أن نجعل النتيجة (بشكل مثالي في قالب) أنفسنا.
بالنسبة لمعظم الحالات ، فإن المساعدين الجاهدين سيكونون كافيين:
getTitle() إرجاع عنوان الكيان الذي تم العثور عليه كسلسلة أو فارغة.getTitleHighlighted() استدعاء getTitle() داخليًا ، وإذا كانت النتيجة عبارة عن سلسلة صالحة ، فإنها تلبيس حوادث كل كلمة مع <i class="highlight"> و </i> .getSnippet() إرجاع مقتطف من الكيان الذي تم العثور عليه ، والذي يلخص أفضل مساحة تم العثور عليها في الكيان الأصلي (على سبيل المثال ، مقتطف مقال حيث تحدث كلمات البحث). يمكن إرجاع المزيد من القصاصات (يتم تقسيم الأحداث الفردية بواسطة القولون). يعيد دائمًا سلسلة (يمكن أن تكون فارغة).getTitleHighlighted() يستدعي getSnippet() داخليًا () وحوادث كل كلمة مع <i class="highlight"> و </i> .getScore() إرجاع النسبية (مختلفة سياقًا وفقًا لاستعلام البحث والبيانات المتاحة في كل مشروع).getEntity() يعيد الكيان الأصلي الذي تم العثور عليه أن العقيدة التي أنتجت داخليًا. يتم إجراء البحث باستخدام التحديد الجزئي ، لذلك لا تتوفر جميع الخصائص دائمًا.entityToArray() يعيد نفسه كصفيف. يتم تطبيع السلاسل تلقائيا. كلتا الطريقتين للحصول على النتائج ( getItems() و getItemsOfType() ) تقبل $limit (الافتراضي 10 ) $offset (الافتراضي 0 ).
من الأفضل تنفيذ الترحيل نفسه باستخدام ترقيم ترقيم Nette.
يتم الحصول على إجمالي عدد النتائج بواسطة طريقة getCountResults() فوق كيان SearchResult .
يستخدم محرك البحث PARTIAL لتحميل كيانات قاعدة البيانات ولف الكيانات الناتجة في نتائج البحث ، بحيث يمكنك تحميلها في أي وقت عن طريق الاتصال ->getEntity() فوق نتيجة بحث محددة.
إذا لم يكن من الممكن العثور على نتيجة ، أو أن عددها "صغير" (يتم تحديد التعريف بواسطة الخوارزمية نفسها وفقًا لتحليل مشروع معين) ، قد يكون هناك نصيحة للحصول على أفضل تصحيح لاستعلام البحث (وقد لا) متاحًا.
للمساعدة ، اتصل بالطريقة getDidYouMean() على SearchResult . الإخراج هو إما سلسلة (استعلام بحث أفضل) أو NULL.
يتم الحصول على أفضل تصحيح استعلام البحث بواسطة محرك البحث نفسه استنادًا إلى تحليل البحث المتقدم داخل كل مشروع بشكل منفصل باستخدام أساليب التعلم الآلي . مع كل عملية بحث ، والإحصائيات حول استعلام البحث ، يتم حفظ عدد النتائج والإشارات الأخرى تلقائيًا وتحليلها بأثر رجعي إذا لزم الأمر.
الحصول على المساعدة أمر طبيعي ولا يمكن أن يتأثر بسهولة. يسعى محرك البحث إلى الحد الأقصى للموضوعية ويقدم للمستخدمين كلمات يبحثون عن الآخرين وإرجاع أكبر عدد ممكن من النتائج ذات الصلة وفقًا للسياق الحالي. داخليًا ، يتم استخدام الوظائف الرياضية المعقدة ، والتي نحسنها باستمرار بناءً على التجربة من جميع المشاريع.
عند البحث ، يتم تجميع قائمة المرشحين لنتائج البحث أولاً. يتم تمرير هذه النتائج بشكل فردي من خلال خوارزمية التقييم التي تؤدي التقييم "النسبي" التلقائي في النطاق 0 - 512 (استنادًا إلى إشارات مختلفة مثل استعلام البحث ، وسجل المستخدم الحديث ، واللغة ، ومحتوى الكيان ، والنوع) (النتيجة هي int ).
وفقًا لتقييم النقطة ، يتم فرز النتائج تلقائيًا.
يمكن تجاوز خوارزمية التسجيل من خلال تنفيذ واجهة IScoreCalculator وكتابتها فوق حاوية DIC.
تم ترخيص baraja-core/doctrine-fulltext-search بموجب ترخيص معهد ماساتشوستس للتكنولوجيا. انظر ملف الترخيص لمزيد من التفاصيل.