brief: | i18n.site saiki ndhukung telusuran teks lengkap tanpa server.
Artikel iki ngenalake implementasi teknologi telusuran teks lengkap ngarep sing murni, kalebu indeks terbalik sing dibangun dening IndexedDB, telusuran awalan, optimasi segmentasi tembung lan dhukungan multi-basa.
Dibandhingake karo solusi sing wis ana, i18n.site murni telusuran teks lengkap ngarep-mburi ukurane cilik lan cepet, cocok kanggo situs web cilik lan medium kayata dokumen lan blog, lan kasedhiya offline.
Sawise pirang-pirang minggu pembangunan, i18n.site (alat bangunan situs web & terjemahan markdown statis) saiki ndhukung telusuran teks lengkap ing ngarep.
Artikel iki bakal nuduhake implementasi teknis i18n.site
telusuran teks lengkap ing ngarep kanggo i18n.site efek telusuran.
Kode open source : Telusuri kernel / antarmuka interaktif
Kanggo situs web statis ukuran cilik lan medium kayata dokumen / blog pribadi, mbangun backend telusuran teks lengkap sing dibangun dhewe banget abot, lan telusuran teks lengkap tanpa layanan minangka pilihan sing luwih umum.
Solusi telusuran teks lengkap tanpa server kalebu rong kategori:
algolia.com , panyedhiya layanan telusuran pihak katelu sing padha nyedhiyakake komponen ngarep kanggo telusuran teks lengkap.
Layanan kasebut mbutuhake pambayaran adhedhasar volume telusuran, lan asring ora kasedhiya kanggo pangguna ing daratan China amarga ana masalah kayata kepatuhan situs web.
Ora bisa digunakake offline, ora bisa digunakake ing intranet, lan duwe watesan gedhe. Artikel iki ora ngrembug akeh.
Kapindho yaiku telusuran teks lengkap ngarep-mburi.
Saiki, telusuran teks lengkap ngarep murni umum kalebu lunrjs lan ElasticLunr.js (adhedhasar lunrjs
pangembangan sekunder).
lunrjs
Ana rong cara kanggo mbangun indeks, lan loro-lorone duwe masalah dhewe.
File indeks sing wis dibangun
Amarga indeks kasebut ngemot tembung saka kabeh dokumen, ukurane gedhe. Saben dokumen ditambahake utawa diowahi, file indeks anyar kudu dimuat. Bakal nambah wektu tunggu pangguna lan nggunakake bandwidth akeh.
Muat dokumen lan mbangun indeks kanthi cepet
Mbangun indeks punika tugas komputasi intensif Mbangun maneh indeks saben-saben sampeyan ngakses bakal nimbulaké lags ketok lan pengalaman pangguna miskin.
Saliyane lunrjs
, ana sawetara solusi telusuran teks lengkap liyane, kayata :
fusejs , ngitung podho antarane strings kanggo nggoleki.
Kinerja solusi iki arang banget lan ora bisa digunakake kanggo nggoleki teks lengkap (ndeleng Fuse.js Pitakonan dawa njupuk luwih saka 10 detik, carane ngoptimalake? ).
TinySearch , gunakake Filter Bloom kanggo nggoleki, ora bisa digunakake kanggo telusuran awalan (contone, ketik goo
, telusuran good
, google
), lan ora bisa entuk efek rampung otomatis sing padha.
Amarga kekurangan saka solusi sing wis ana, i18n.site
ngembangake solusi telusuran teks lengkap ngarep murni anyar, sing nduweni ciri ing ngisor iki :
gzip
yaiku 6.9KB
(kanggo mbandhingake, ukuran lunrjs
yaiku 25KB
).indexedb
, kang njupuk munggah memori kurang lan cepet.Ing ngisor iki, i18n.site
rincian implementasi teknis bakal ditepungi kanthi rinci.
Segmentasi tembung nggunakake segmentasi tembung asli browser Intl.Segmenter
, lan kabeh browser utama ndhukung antarmuka iki.
Tembung segmentasi coffeescript
kode kaya ing ngisor iki
SEG = new Intl.Segmenter 0, granularity: "word"
seg = (txt) =>
r = []
for {segment} from SEG.segment(txt)
for i from segment.split('.')
i = i.trim()
if i and !'| `'.includes(i) and !/\p{P}/u.test(i)
r.push i
r
export default seg
export segqy = (q) =>
seg q.toLocaleLowerCase()
ing:
/\p{P}/
minangka ekspresi reguler sing cocog karo simbol sing cocog khusus kalebu: ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _
{ | } ~. .</p><ul><li>
split('.')amarga segmentasi tembung
Firefoxbrowser ora dadi segmen
. ` .
5 tabel panyimpenan obyek digawe ing IndexedDB
:
word
: id -doc
: id - Dokumen url - Nomer versi dokumendocWord
: Array saka dokumen id - tembung idprefix
: Susunan ater-ater - tembung idrindex
: Word id - Dokumen id : Array nomer barisPass ing Uploaded document url
lan versi nomer ver
, lan telusuri apa document ana ing Tabel doc
Yen ora ana, nggawe indeks kuwalik. Ing wektu sing padha, mbusak indeks terbalik kanggo dokumen sing ora dilebokake.
Kanthi cara iki, indeksasi tambahan bisa digayuh lan jumlah pitungan dikurangi.
css interaksi ngarep-mburi, bar kemajuan loading saka indeks bisa ditampilake kanggo ngindhari lag / loading progress + .
Proyek kasebut idb adhedhasar enkapsulasi asinkron saka IndexedDB
IndexedDB maca lan nulis ora sinkron. Nalika nggawe indeks, dokumen bakal dimuat bebarengan kanggo nggawe indeks.
Supaya ora mundhut data sebagean disebabake nulis competitive, sampeyan bisa deleng coffeescript
kode ing ngisor iki lan nambah ing
cache antarane maca lan nulis kanggo nyegat nulis saingan.
pusher = =>
ing = new Map()
(table, id, val)=>
id_set = ing.get(id)
if id_set
id_set.add val
return
id_set = new Set([val])
ing.set id, id_set
pre = await table.get(id)
li = pre?.li or []
loop
to_add = [...id_set]
li.push(...to_add)
await table.put({id,li})
for i from to_add
id_set.delete i
if not id_set.size
ing.delete id
break
return
rindexPush = pusher()
prefixPush = pusher()
Panelusuran pisanan bakal ngetung tembung kunci sing dilebokake pangguna.
Asumsi yen ana N
tembung sawise tembung segmentasi Nalika ngasilake asil, asil sing ngemot kabeh tembung kunci bakal dibalekake dhisik, banjur asil sing ngemot N-1
, N-2
,..., 1
tembung kunci bakal dibalekake.
Asil panelusuran sing ditampilake luwih dhisik njamin akurasi pitakon, lan asil dimuat sabanjure (klik tombol muat liyane) njamin tingkat kelingan.
Kanggo nambah kacepetan respon, telusuran nggunakake generator yield
kanggo ngleksanakake loading on-demand, lan bali limit
asil ditakoni.
Elinga yen saben sampeyan nggoleki maneh sawise yield
, sampeyan kudu mbukak maneh transaksi pitakon IndexedDB
.
Kanggo nampilake asil panelusuran nalika pangguna ngetik, contone, nalika wor
dilebokake, tembung sing diawali karo wor
kayata words
lan work
ditampilake.
Kernel telusuran bakal nggunakake tabel prefix
kanggo tembung pungkasan sawise segmentasi tembung kanggo nemokake kabeh tembung sing diawali, lan telusuran kanthi urutan.
Fungsi anti-goyang debounce
uga digunakake ing interaksi ngarep-mburi (dilaksanakake kaya ing ngisor iki) kanggo nyuda frekuensi input pangguna sing nyebabake telusuran lan nyuda jumlah pitungan.
export default (wait, func) => {
var timeout;
return function(...args) {
clearTimeout(timeout);
timeout = setTimeout(func.bind(this, ...args), wait);
};
}
Tabel indeks ora nyimpen teks asli, mung tembung, sing nyuda jumlah panyimpenan.
Nyorot asil panelusuran mbutuhake ngisi maneh teks asli, lan sing cocog karo service worker
bisa nyegah panjaluk jaringan sing bola-bali.
Ing wektu sing padha, amarga service worker
nyimpen kabeh artikel, yen pangguna nindakake panelusuran, kabeh situs web, kalebu panelusuran, kasedhiya offline.
Solusi telusuran ngarep murni murni i18n.site
dioptimalake kanggo MarkDown
dokumen.
Nalika nampilake asil panelusuran, jeneng bab bakal ditampilake lan bab bakal navigasi nalika diklik.
Panelusuran teks lengkap sing dibalik ditindakake mung ing ngarep, ora ana server sing dibutuhake. Cocog banget kanggo situs web ukuran cilik lan medium kayata dokumen lan blog pribadi.
i18n.site
Panelusuran ngarep-mburi murni sing dikembangake dhewe kanthi sumber terbuka, ukurane cilik lan respon cepet, ngrampungake kekurangan saka telusuran teks lengkap ngarep murni saiki lan menehi pengalaman pangguna sing luwih apik.