brief: | i18n.site ayeuna ngadukung milarian téks lengkep tanpa server.
Artikel ieu ngenalkeun palaksanaan téknologi pilarian full-text murni hareup-tungtung, kaasup indéks inverted diwangun ku IndexedDB, pilarian awalan, optimasi segmentation kecap jeung rojongan multi-basa.
Dibandingkeun sareng solusi anu tos aya, pamilarian téks lengkep i18n.site murni dina ukuranana leutik sareng gancang, cocog pikeun halaman wéb leutik sareng sedeng sapertos dokumén sareng blog, sareng sayogi offline.
Sanggeus sababaraha minggu pangwangunan, i18n.site (alat wangunan ramatloka & markdown multibasa statik murni) ayeuna ngadukung panéangan téks lengkep hareup-tungtung.
Tulisan ieu bakal ngabagikeun palaksanaan téknis i18n.site
milarian téks lengkep hareup-tungtung i18n.site ngalaman éfék milarian.
Kodeu open source : Pilarian kernel / panganteur interaktif
Pikeun situs web statik ukuran leutik sareng sedeng sapertos dokumén / blog pribadi, ngawangun backend milarian téks lengkep anu diwangun diri beurat teuing, sareng milarian téks lengkep gratis jasa mangrupikeun pilihan anu langkung umum.
Solusi milarian téks lengkep tanpa server digolongkeun kana dua kategori anu lega:
Kahiji, panyadia ladenan pilarian pihak katilu nu algolia.com nyadiakeun komponén hareup-tungtung pikeun pilarian-téks lengkep.
Ladenan sapertos kitu ngabutuhkeun pamayaran dumasar kana volume pamilarian, sareng sering henteu sayogi pikeun pangguna di daratan Cina kusabab masalah sapertos patuh halaman wéb.
Teu bisa dipaké offline, teu bisa dipaké dina intranet, sarta ngabogaan watesan hébat. Tulisan ieu henteu seueur ngabahas.
Anu kadua nyaéta milarian téks lengkep hareup-tungtung murni.
Ayeuna, pamilarian téks lengkep hareup lunrjs
tungtung anu ElasticLunr.js kalebet lunrjs
lunrjs
Aya dua cara pikeun ngawangun indéks, sareng duanana gaduh masalah sorangan.
Pra-diwangun file indéks
Kusabab indéks ngandung kecap tina sakabéh dokumén, éta badag dina ukuran. Iraha waé dokumén ditambah atanapi dirobih, file indéks énggal kedah dimuat. Éta bakal ningkatkeun waktos ngantosan pangguna sareng ngonsumsi seueur bandwidth.
Muat dokumén sareng ngawangun indéks dina laleur
Ngawangun indéks mangrupa tugas komputasi intensif Rebuilding indéks unggal waktos Anjeun ngakses eta bakal ngabalukarkeun lags atra jeung pangalaman pamaké goréng.
Salian lunrjs
, aya sababaraha solusi pilarian téks lengkep lianna, kayaning :
fusejs , itung kasaruaan antara senar pikeun milarian.
Kinerja leyuran ieu pisan goréng jeung teu bisa dipaké pikeun milarian full-téks (tingali Fuse.js query lila nyokot leuwih ti 10 detik, kumaha carana ngaoptimalkeun eta? ).
TinySearch , paké Bloom filter pikeun milarian, teu tiasa dianggo pikeun milarian awalan (contona, lebetkeun goo
, milarian good
, google
), sareng henteu tiasa ngahontal éfék lengkep otomatis anu sami.
Kusabab kakurangan tina solusi anu aya, i18n.site
ngembangkeun solusi milarian téks lengkep hareup-tungtung murni anu anyar, anu ngagaduhan ciri-ciri ieu :
gzip
nyaéta 6.9KB
(pikeun babandingan, ukuran lunrjs
nyaéta 25KB
).indexedb
, nu nyokot memori kirang na gancang.Di handap, i18n.site
rinci palaksanaan teknis bakal diwanohkeun dina jéntré.
Segmentasi kecap ngagunakeun segmentasi kecap asli browser Intl.Segmenter
, sareng sadaya browser mainstream ngadukung antarmuka ieu.
Kecap segmentasi coffeescript
kode ieu di handap
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()
di:
/\p{P}/
mangrupikeun ekspresi biasa anu cocog sareng tanda baca anu cocog sareng simbol khusus kalebet: ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _
{ | } ~. .</p><ul><li>
split('.')sabab
Firefoxpanyungsi kecap segmentation henteu bagean
. ` .
5 tabel gudang objék dijieun dina IndexedDB
:
word
: id - kecapdoc
: id - Dokumén url - Dokumén nomer versidocWord
: Array dokumén id - kecap idprefix
: Susunan awalan - kecap idrindex
: Word id - Dokumén id : Array nomer barisLulus dina Asép Sunandar Sunarya ti dokumén url
jeung nomer versi ver
, sarta néangan naha dokumen teh aya dina tabel doc
Lamun teu aya, nyieun hiji indéks inverted. Dina waktos anu sami, cabut indéks inverted pikeun dokumén anu henteu dilebetkeun.
Ku cara kieu, indéks incremental tiasa dihontal sareng jumlah itungan dikirangan.
Dina interaksi hareup-tungtung, bar kamajuan loading tina indéks bisa dipintonkeun pikeun ngahindarkeun lag nalika loading pikeun kahiji kalina Tempo "Progress Bar kalawan Animasi, Dumasar kana Tunggal progress + Murni css Palaksanaan" Inggris / Cina .
Proyék ieu idb dumasar kana éncapsulation asynchronous tina IndexedDB
IndexedDB maca sareng nyerat henteu sinkron. Nalika nyieun indéks, dokumén bakal dimuat sakaligus pikeun nyieun indéks.
Dina raraga ngahindarkeun leungitna data parsial disababkeun ku tulisan kalapa, anjeun tiasa ningali coffeescript
kode handap tur nambahkeun hiji ing
cache antara maca jeung nulis pikeun intercept nulis competing.
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()
Pilarian bakal ngabagi heula kecap konci anu diasupkeun ku pangguna.
Anggap aya N
kecap sanggeus kecap segmentation Lamun mulangkeun hasil, hasilna ngandung sakabéh kecap konci bakal balik heula, lajeng hasilna ngandung N-1
, N-2
,..., 1
kecap konci bakal balik.
Hasil pamilarian anu ditampilkeun heula mastikeun katepatan pamundut, sareng hasilna dimuat saterasna (klik tombol beban langkung seueur) mastikeun laju ngelingan.
Dina raraga ngaronjatkeun kagancangan respon, pilarian ngagunakeun generator yield
pikeun nerapkeun on-demand loading, sarta mulih limit
waktos hasilna ieu queried.
Catet yén unggal waktos anjeun milarian deui saatos yield
, anjeun kedah muka deui transaksi pamundut IndexedDB
.
Pikeun ningalikeun hasil pamilarian nalika pangguna ngetik, contona, nalika wor
diasupkeun, kecap anu diawalan ku wor
sapertos words
sareng work
dipintonkeun.
Kernel pilarian bakal ngagunakeun tabel prefix
pikeun kecap panungtungan sanggeus segmentation kecap pikeun manggihan sakabeh kecap diawalan jeung eta, sarta pilarian dina runtuyan.
Fungsi anti goyang debounce
ogé dipaké dina interaksi hareup-tungtung (dilaksanakeun saperti kieu) pikeun ngurangan frékuénsi input pamaké triggering pilarian sarta ngurangan jumlah itungan.
export default (wait, func) => {
var timeout;
return function(...args) {
clearTimeout(timeout);
timeout = setTimeout(func.bind(this, ...args), wait);
};
}
Méja indéks henteu nyimpen téks asli, ngan ukur kecap, anu ngirangan jumlah neundeun.
Nyorot hasil teangan merlukeun reloading téks aslina, sarta cocog service worker
bisa nyingkahan requests jaringan terus-terusan.
Dina waktos anu sami, kusabab service worker
nyéépkeun sadaya tulisan, saatos pangguna ngalaksanakeun panéangan, sadaya halaman wéb, kalebet pamilarian, sayogi offline.
i18n.site
's solusi pilarian hareup-tungtung murni dioptimalkeun pikeun MarkDown
dokumén.
Lamun mintonkeun hasil teangan, ngaran bab bakal dipintonkeun jeung bab bakal navigated lamun diklik.
Inverted pilarian full-téks dilaksanakeun murni dina tungtung hareup, euweuh server diperlukeun. Éta cocog pisan pikeun situs wéb leutik sareng sedeng sapertos dokumén sareng blog pribadi.
i18n.site
Open source pilarian hareup-tungtung murni anu dikembangkeun ku sorangan, ukuranana leutik sareng réspon gancang, ngarengsekeun kakurangan tina pamilarian téks lengkep hareup-tungtung murni ayeuna sareng nyayogikeun pangalaman pangguna anu langkung saé.