البحث القائم على LunrJS عن الوسيط.
أضف هذا السطر إلى ملف Gemfile الخاص بالتطبيق الخاص بك:
gem 'middleman-search'
ومن ثم تنفيذ:
$ bundle
أو قم بتثبيته بنفسك على النحو التالي:
$ gem install middleman-search
تحتاج إلى تنشيط الوحدة في config.rb
الخاص بك، وإخبار الامتداد بكيفية فهرسة مواردك:
activate :search do | search |
search . resources = [ 'blog/' , 'index.html' , 'contactus/index.html' ]
search . index_path = 'search/lunr-index.json' # defaults to `search.json`
search . lunr_dirs = [ 'source/vendor/lunr-custom/' ] # optional alternate paths where to look for lunr js files
search . language = 'es' # defaults to 'en'
search . fields = {
title : { boost : 100 , store : true , required : true } ,
content : { boost : 50 } ,
url : { index : false , store : true } ,
author : { boost : 30 }
}
end
حيث resources
هي قائمة بداية عنوان URL للموارد المطلوب فهرستها (تم اختبارها باستخدام String#start_with?
)، index_path
هو المسار النسبي لملف الفهرس الذي تم إنشاؤه في موقعك، fields
عبارة عن تجزئة بإدخال واحد لكل حقل ليتم فهرستها، مع تجزئة الخيارات المرتبطة:
boost
يحدد تعزيز الصلة القمرية عند البحث في هذا الحقلstore
ما إذا كان سيتم تخزين هذا الحقل في خريطة المستند (انظر أدناه)، فإن القيمة الافتراضية هي falseindex
ما إذا كان سيتم فهرسة هذا الحقل، فإن القيمة الافتراضية هي صحيحrequired
لن تتم فهرسة المورد إذا كان الحقل المحدد على أنه مطلوب يحتوي على قيمة فارغة أو فارغة لاحظ أنه يتم تضمين id
الحقل الخاص تلقائيًا، مع معرف يتم إنشاؤه تلقائيًا لاستخدامه ref
للمستند.
يتم استرداد جميع قيم الحقول من data
المورد (أي المادة الأمامية لها)، أو من options
الموجودة في بيانات resource.metadata
(أي أي خيارات محددة في صفحة proxy
)، باستثناء:
url
وهو عنوان url الفعلي للموردcontent
النص المستخرج من المورد المقدم، دون تضمين تخطيطه يمكنك بعد ذلك الاستعلام عن الفهرس من Javascript عبر كائن lunrIndex
(راجع ملف الفهرس لمزيد من المعلومات):
var max_search_entries = 50 ;
var result = [ ] ; //initialize empty array
lunrIndex . search ( request . term ) . forEach ( function ( item , index ) {
if ( index < max_search_entries ) {
result . push ( lunrData . docs [ item . ref ] ) ;
}
} ) ;
(شكرًا @Jeepler على تعديل كود lodash v3 الذي اعتدنا استخدامه في Manas)
تتضمن هذه الجوهرة أصولًا للغات البديلة كما هو منصوص عليه في MihaiValentin/lunr-languages. يرجى الرجوع إلى هذا المستودع للحصول على قائمة باللغات المتاحة.
إذا كنت تريد العمل باستخدام لغة غير مضمنة، فقم بإعداد ملف lunr.yourlang.js
في مجلد في مشروعك، وأضف هذا المجلد إلى lunr_dirs
حتى تعرف الجوهرة مكان البحث عنه.
يمكنك تخصيص المحتوى بالكامل ليتم فهرسته وتخزينه لكل مورد عن طريق تحديد رد اتصال before_index
:
activate :search do | search |
search . before_index = Proc . new do | to_index , to_store , resource |
if author = resource . data . author
to_index [ :author ] = data . authors [ author ] . name
end
end
end
يقبل هذا الخيار رد الاتصال الذي سيتم تنفيذه لكل مورد، وسيتم تنفيذه مع المستند الذي سيتم فهرسته والخريطة التي سيتم تخزينها، في كائنات index
docs
الخاصة بالمخرجات على التوالي (انظر أدناه)، بالإضافة إلى المورد يجري معالجتها. يمكنك استخدام رد الاتصال هذا لتعديل أي منهما، أو throw(:skip)
لتخطي المورد المعني.
في بعض الحالات، قد ترغب في إضافة وظيفة جديدة إلى مسار lunr، لإنشاء الفهرسة ثم للبحث. يمكنك القيام بذلك عن طريق توفير تجزئة pipeline
بأسماء الوظائف والنص، على سبيل المثال:
activate :search do | search |
search . pipeline = {
tildes : <<-JS
function(token, tokenIndex, tokens) {
return token
.replace('á', 'a')
.replace('é', 'e')
.replace('í', 'i')
.replace('ó', 'o')
.replace('ú', 'u');
}
JS
}
end
سيؤدي هذا إلى تسجيل وظيفة tildes
في مسار lunr وإضافتها عند إنشاء الفهرس. من وثائق لونر:
يتم استدعاء الوظائف في المسار باستخدام ثلاث وسيطات: الرمز المميز الحالي الذي تتم معالجته؛ فهرس هذا الرمز المميز في مجموعة الرموز المميزة، والقائمة الكاملة للرموز المميزة في المستند الذي تتم معالجته. وهذا يتيح معالجة بسيطة للرموز المميزة بالإضافة إلى معالجة n-gram أكثر تعقيدًا.
يجب أن تقوم الوظيفة بإرجاع النسخة المعالجة من النص، والتي سيتم تمريرها بدورها إلى الوظيفة التالية في المسار. ستؤدي العودة غير المحددة إلى منع أي معالجة إضافية للرمز المميز، ولن يصل هذا الرمز المميز إلى الفهرس.
لاحظ أنه إذا قمت بإضافة وظيفة إلى المسار، فسيتم تحميلها أيضًا عند إلغاء تسلسل الفهرس، وسوف يفشل lunr مع Cannot load un-registered function: tildes
إذا لم يتم إعادة تسجيلها. يمكنك إما تسجيلها يدويًا، أو ببساطة تضمين ما يلي في ملف .js.erb
ليتم تنفيذه قبل تحميل الفهرس:
<%= search_lunr_js_pipeline %>
يحتوي ملف الفهرس الذي تم إنشاؤه على كائن JSON بخاصيتين:
index
على فهرس lunr.js المتسلسل، والذي يمكنك تحميله عبر lunr.Index.load(lunrData.index)
docs
عبارة عن خريطة من معرفات المستندات التي تم إنشاؤها تلقائيًا إلى كائن يحتوي على السمات التي تم تكوينها للتخزين ستقوم عادةً بتحميل index
في مثيل فهرس lunr، ثم تستخدم خريطة docs
للبحث عن القيمة التي تم إرجاعها وتقديمها للمستخدم.
يجب عليك أيضًا require
ملف lunr.min.js
في ملف جافا سكريبت الرئيسي الخاص بك (في حالة استخدام مسار الأصول) لتتمكن من تحميل الفهرس فعليًا:
//= require lunr.min
إذا كنت تستخدم إمكانيات i18n الخاصة بـ Lunr، فيجب عليك أيضًا تحميل دعم Stemmer وملفات اللغة (بهذا الترتيب) هنا:
//= require lunr.min
//= require lunr.stemmer.support
//= require lunr.es
لا يتضمن خط أنابيب Middleman (في حالة تمكينه) ملفات json
افتراضيًا، ولكن يمكنك تعديل ذلك بسهولة عن طريق إضافة .json
إلى خيار exts
للامتدادات المقابلة، مثل gzip
و asset_hash
:
activate :asset_hash do | asset_hash |
asset_hash . exts << '.json'
end
لاحظ أنه إذا قمت بتشغيل ملف الفهرس json من خلال امتداد تجزئة الأصول، فستحتاج إلى استرداد عنوان URL الوجهة الفعلي عند تحميل الملف في المتصفح للبحث، باستخدام مساعد عرض search_index_path
:
var lunrIndex = null ;
var lunrData = null ;
// Download index data
$ . ajax ( {
url : "<%= search_index_path %>" ,
cache : true ,
method : 'GET' ,
success : function ( data ) {
lunrData = data ;
lunrIndex = lunr . Index . load ( lunrData . index ) ;
}
} ) ;
شكرا جزيلا ل:
middleman-alias
به، والذي استندنا إليه في تطوير هذا الامتداد.middleman-lunrjs
و middleman-lunr
، والتي كانت بمثابة مصدر إلهام لصنع هذا.lunr.js