Pencarian berbasis LunrJS untuk Middleman.
Tambahkan baris ini ke Gemfile aplikasi Anda:
gem 'middleman-search'
Dan kemudian jalankan:
$ bundle
Atau instal sendiri sebagai:
$ gem install middleman-search
Anda perlu mengaktifkan modul di config.rb
Anda, memberi tahu ekstensi cara mengindeks sumber daya Anda:
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
Dimana resources
adalah daftar awal URL sumber daya yang akan diindeks (diuji dengan String#start_with?
), index_path
adalah jalur relatif dari file indeks yang dihasilkan di situs Anda, dan fields
adalah hash dengan satu entri untuk setiap bidang untuk diindeks, dengan hash opsi yang terkait:
boost
Menentukan peningkatan relevansi lunr saat mencari bidang inistore
Apakah akan menyimpan bidang ini di peta dokumen (lihat di bawah), defaultnya adalah falseindex
Apakah akan mengindeks bidang ini, defaultnya adalah truerequired
Sumber daya tidak akan diindeks jika bidang yang ditandai wajib memiliki nilai kosong atau nol Perhatikan bahwa id
bidang khusus disertakan secara otomatis, dengan pengidentifikasi yang dibuat secara otomatis untuk digunakan sebagai ref
dokumen.
Semua nilai bidang diambil dari data
sumber daya (yaitu materi depannya), atau dari options
di resource.metadata
(yaitu opsi apa pun yang ditentukan di halaman proxy
), kecuali untuk:
url
yang merupakan url sumber daya sebenarnyacontent
teks yang diekstraksi dari sumber daya yang dirender, tanpa menyertakan tata letaknya Anda kemudian dapat menanyakan indeks dari Javascript melalui objek lunrIndex
(lihat file Indeks untuk info lebih lanjut):
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 ] ) ;
}
} ) ;
(Terima kasih @Jeepler karena telah mengadaptasi kode lodash v3 yang biasa kami gunakan di Manas)
Permata ini mencakup aset untuk bahasa alternatif yang disediakan oleh MihaiValentin/lunr-linguals. Silakan merujuk ke repositori tersebut untuk daftar bahasa yang tersedia.
Jika Anda ingin bekerja dengan bahasa yang tidak disertakan, siapkan file lunr.yourlang.js
dalam folder di proyek Anda, dan tambahkan folder tersebut ke lunr_dirs
sehingga permata mengetahui di mana mencarinya.
Anda dapat sepenuhnya menyesuaikan konten yang akan diindeks dan disimpan per sumber daya dengan menentukan callback 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
Opsi ini menerima panggilan balik yang akan dieksekusi untuk setiap sumber daya, dan akan dieksekusi dengan dokumen yang akan diindeks dan peta yang akan disimpan, masing-masing dalam objek index
dan docs
keluaran (lihat di bawah), serta sumber daya sedang diproses. Anda dapat menggunakan panggilan balik ini untuk memodifikasi salah satunya, atau throw(:skip)
untuk melewati sumber daya yang dimaksud.
Dalam beberapa kasus, Anda mungkin ingin menambahkan fungsi baru ke pipeline lunr, baik untuk membuat pengindeksan maupun untuk pencarian. Anda dapat melakukan ini dengan memberikan hash pipeline
dengan nama fungsi dan isi, misalnya:
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
Ini akan mendaftarkan fungsi tildes
di pipa lunr dan menambahkannya saat membuat indeks. Dari dokumentasi Lunr :
Fungsi dalam pipeline dipanggil dengan tiga argumen: token saat ini sedang diproses; indeks token itu dalam array token, dan seluruh daftar token bagian dari dokumen yang sedang diproses. Hal ini memungkinkan pemrosesan token unigram yang sederhana serta pemrosesan n-gram yang lebih canggih.
Fungsi tersebut harus mengembalikan versi teks yang diproses, yang pada gilirannya akan diteruskan ke fungsi berikutnya dalam alur. Mengembalikan tidak terdefinisi akan mencegah pemrosesan token lebih lanjut, dan token tersebut tidak akan masuk ke indeks.
Perhatikan bahwa jika Anda menambahkan fungsi ke pipeline, fungsi tersebut juga akan dimuat saat membatalkan serialisasi indeks, dan lunr akan gagal dengan kesalahan Cannot load un-registered function: tildes
jika belum didaftarkan ulang. Anda dapat mendaftarkannya secara manual, atau cukup memasukkan yang berikut ini ke dalam file .js.erb
untuk dieksekusi sebelum memuat indeks:
<%= search_lunr_js_pipeline %>
File indeks yang dihasilkan berisi objek JSON dengan dua properti:
index
berisi indeks lunr.js berseri, yang dapat Anda muat melalui lunr.Index.load(lunrData.index)
docs
adalah peta dari id dokumen yang dibuat secara otomatis ke objek yang berisi atribut yang dikonfigurasi untuk penyimpanan Anda biasanya akan memuat index
ke dalam instance indeks lunr, lalu menggunakan peta docs
untuk mencari nilai yang dikembalikan dan menyajikannya kepada pengguna.
Anda juga harus require
file lunr.min.js
di file javascript sprocket utama Anda (jika menggunakan pipa aset) agar dapat memuat indeks:
//= require lunr.min
Jika Anda menggunakan kemampuan i18n lunr, Anda juga harus memuat file dukungan dan bahasa Stemmer (dalam urutan itu) di sini:
//= require lunr.min
//= require lunr.stemmer.support
//= require lunr.es
Pipeline Middleman (jika diaktifkan) tidak menyertakan file json
secara default, namun Anda dapat dengan mudah memodifikasinya dengan menambahkan .json
ke opsi exts
dari ekstensi yang sesuai, seperti gzip
dan asset_hash
:
activate :asset_hash do | asset_hash |
asset_hash . exts << '.json'
end
Perhatikan bahwa jika Anda menjalankan file indeks json melalui ekstensi hash aset, Anda perlu mengambil URL tujuan sebenarnya saat memuat file di browser untuk pencarian, menggunakan bantuan tampilan 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 ) ;
}
} ) ;
Terima kasih sebesar-besarnya kepada:
middleman-alias
, yang menjadi basis kami untuk mengembangkan ekstensi ini.middleman-lunrjs
dan middleman-lunr
, yang menjadi inspirasi pembuatan yang satu ini.lunr.js