brief: | i18n.site endi serversiz toʻliq matnli qidiruvni qoʻllab-quvvatlaydi.
Ushbu maqolada IndexedDB tomonidan yaratilgan teskari indeks, prefiks qidirish, so'z segmentatsiyasini optimallashtirish va ko'p tilli qo'llab-quvvatlashni o'z ichiga olgan sof front-end to'liq matnli qidiruv texnologiyasini joriy etish taqdim etiladi.
Mavjud yechimlar bilan solishtirganda, i18n.site ning sof frontend toʻliq matnli qidiruvi kichik oʻlchamli va tezkor, hujjatlar va bloglar kabi kichik va oʻrta oʻlchamdagi veb-saytlar uchun mos va oflayn rejimda mavjud.
Bir necha hafta ishlab chiqilgandan so'ng, i18n.site (sof statik markdown ko'p tilli tarjima & veb-sayt yaratish vositasi) endi to'liq matnli qidiruvni qo'llab-quvvatlaydi.
Ushbu maqolada qidiruv effektini i18n.site qilish uchun i18n.site
sof to'liq matnli qidiruvni baham ko'ring.
Kod ochiq manba : Yadro / interaktiv interfeysi
Hujjatlar/shaxsiy bloglar kabi kichik va oʻrta oʻlchamli sof statik veb-saytlar uchun oʻz-oʻzidan qurilgan toʻliq matnli qidiruv serverini yaratish juda ogʻir va xizmatsiz toʻliq matnli qidiruv keng tarqalgan tanlovdir.
Serversiz toʻliq matnli qidiruv yechimlari ikkita keng toifaga boʻlinadi:
Birinchidan, algolia.com o'xshash uchinchi tomon qidiruv xizmati provayderlari to'liq matnli qidiruv uchun front-end komponentlarini taqdim etadilar.
Bunday xizmatlar qidiruv hajmiga qarab to'lovni talab qiladi va veb-saytga muvofiqlik kabi muammolar tufayli materik Xitoydagi foydalanuvchilar uchun ko'pincha mavjud emas.
U oflayn rejimda ishlatilmaydi, intranetda ishlatilmaydi va katta cheklovlarga ega. Ushbu maqolada ko'p muhokama qilinmaydi.
Ikkinchisi sof front-end to'liq matnli qidiruvdir.
Hozirgi vaqtda keng tarqalgan to'liq matnli qidiruvlar lunrjs va ElasticLunr.js ( lunrjs
ikkinchi darajali ishlanma asosida) o'z ichiga oladi.
lunrjs
Indekslarni yaratishning ikki yo'li mavjud va ikkalasining ham o'z muammolari bor.
Oldindan tuzilgan indeks fayllari
Indeks barcha hujjatlardagi so'zlarni o'z ichiga olganligi sababli, u katta hajmga ega. Hujjat qo'shilganda yoki o'zgartirilsa, yangi indeks fayli yuklanishi kerak. Bu foydalanuvchining kutish vaqtini oshiradi va ko'p tarmoqli kengligini sarflaydi.
Hujjatlarni yuklang va indekslarni tezda yarating
Indeks yaratish - bu hisoblashni talab qiladigan ish bo'lib, unga har safar kirganingizda uni qayta tiklash aniq kechikishlar va yomon foydalanuvchi tajribasiga olib keladi.
lunrjs
dan tashqari yana ba'zi to'liq matnli qidiruv echimlari mavjud, masalan :
fusejs qidirish uchun satrlar orasidagi o'xshashlikni hisoblang.
Ushbu yechimning unumdorligi juda past va uni toʻliq matnli qidirish uchun ishlatib boʻlmaydi (qarang Fuse.js Uzoq soʻrov 10 soniyadan koʻproq vaqt oladi, uni qanday optimallashtirish kerak? ).
TinySearch qidirish uchun Bloom filtridan foydalaning, prefiksni qidirish uchun ishlatib bo'lmaydi (masalan, goo
kiriting, good
, google
ni kiriting) va shunga o'xshash avtomatik yakunlash effektiga erishib bo'lmaydi.
Mavjud echimlarning kamchiliklari tufayli i18n.site
quyidagi xususiyatlarga ega bo'lgan yangi sof front-end to'liq matnli qidiruv yechimini ishlab chiqdi :
gzip
qadoqlashdan keyin qidiruv yadrosining o'lchami 6.9KB
ga teng (taqqoslash uchun lunrjs
o'lchami 25KB
ga teng).indexedb
ga asoslangan teskari indeksni yarating, u kamroq xotirani egallaydi va tezdir.Quyida i18n.site
texnik amalga oshirish tafsilotlari batafsil tanishtiriladi.
So'z segmentatsiyasi brauzerning mahalliy so'z segmentatsiyasidan Intl.Segmenter
foydalanadi va barcha asosiy brauzerlar ushbu interfeysni qo'llab-quvvatlaydi.
So'z segmentatsiyasi coffeescript
kodi quyidagicha
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()
ichida:
/\p{P}/
- tinish belgilariga mos keladigan oddiy ibora. Muayyan mos belgilarga quyidagilar kiradi: ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _
{ | } ~. .</p><ul><li>
split('.'), chunki
Firefoxbrauzer so'zini segmentatsiyasi
. ` segmentlamaydi.
IndexedDB
da 5 ta ob'ektni saqlash jadvali yaratilgan :
word
: id -doc
: id - Hujjat url - Hujjat versiya raqamidocWord
: id - id hujjat massiviprefix
- id : massivirindex
: Word id - Document id : qator raqamlariHujjat url
massivini va ver
versiya raqamini kiriting va hujjat doc
jadvalda mavjudligini qidiring. Agar u mavjud bo'lmasa, teskari indeks yarating. Shu bilan birga, o'tkazilmagan hujjatlar uchun teskari indeksni olib tashlang.
Shu tarzda, qo'shimcha indeksatsiyaga erishish mumkin va hisoblash miqdori kamayadi.
Oldindan o'zaro aloqada, birinchi marta yuklashda kechikishning oldini olish uchun indeksning yuklanish jarayoni ko'rsatilishi mumkin "Yagona animatsiyaga asoslangan taraqqiyot paneli progress + Sof css amalga oshirish" Inglizcha / Xitoy .
Loyiha asinxron inkapsulyatsiya asosida idb IndexedDB
IndexedDB o'qish va yozish asinxrondir. Indeks yaratishda hujjatlar indeks yaratish uchun bir vaqtda yuklanadi.
Raqobatchi yozish natijasida maʼlumotlarning qisman yoʻqotilishiga yoʻl qoʻymaslik uchun siz quyidagi coffeescript
kodiga murojaat qilishingiz va raqobatdosh yozishlarni toʻxtatish uchun oʻqish va yozish oʻrtasida ing
kesh qoʻshishingiz mumkin.
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()
Qidiruv avvalo foydalanuvchi kiritgan kalit so‘zlarni segmentlarga ajratadi.
So'zni segmentlashdan keyin N
so'z bor deb hisoblang, natijalarni qaytarishda avval barcha kalit so'zlarni o'z ichiga olgan natijalar, keyin esa N-1
, N-2
,..., 1
ta kalit so'zdan iborat natijalar qaytariladi.
Ko'rsatilgan qidiruv natijalari birinchi navbatda so'rovning to'g'riligini ta'minlaydi va keyin yuklangan natijalar (ko'proq yuklash tugmasini bosing) eslab qolish tezligini ta'minlaydi.
Javob tezligini oshirish uchun qidiruv talab bo'yicha yuklashni amalga oshirish uchun yield
generatoridan foydalanadi va limit
safar natija so'ralganda qaytariladi.
Esda tutingki, har safar yield
dan keyin yana qidirganingizda, IndexedDB
so'rovi tranzaksiyasini qayta ochishingiz kerak.
Foydalanuvchi yozayotganda qidiruv natijalarini ko'rsatish uchun, masalan, wor
kiritilganda, words
va work
kabi wor
prefiksli so'zlar ko'rsatiladi.
Qidiruv yadrosi so'z segmentatsiyasidan keyingi so'nggi so'z uchun prefix
jadvalidan foydalanib, u bilan prefikslangan barcha so'zlarni topadi va ketma-ketlikda qidiradi.
Tebranishga qarshi funksiya debounce
foydalanuvchi kiritish qidiruvlarini tetiklash chastotasini kamaytirish va hisoblash miqdorini kamaytirish uchun front-end shovqinida ham qo'llaniladi (quyidagicha amalga oshiriladi).
export default (wait, func) => {
var timeout;
return function(...args) {
clearTimeout(timeout);
timeout = setTimeout(func.bind(this, ...args), wait);
};
}
Indeks jadvali asl matnni saqlamaydi, faqat so'zlarni saqlaydi, bu esa saqlash hajmini kamaytiradi.
Qidiruv natijalarini ajratib ko'rsatish asl matnni qayta yuklashni talab qiladi va service worker
ga mos kelsa, takroriy tarmoq so'rovlarini oldini oladi.
Shu bilan birga, service worker
barcha maqolalarni keshlashi sababli, foydalanuvchi qidiruvni amalga oshirgandan so'ng, butun veb-sayt, shu jumladan qidiruv, oflayn rejimda mavjud bo'ladi.
i18n.site
ning sof front-end qidiruv yechimi MarkDown
hujjat uchun optimallashtirilgan.
Qidiruv natijalarini ko'rsatishda bo'lim nomi ko'rsatiladi va bosilganda bo'lim navigatsiya qilinadi.
Inverted to'liq matnli qidiruv faqat old tomonda amalga oshiriladi, server talab qilinmaydi. Hujjatlar va shaxsiy bloglar kabi kichik va o'rta veb-saytlar uchun juda mos keladi.
i18n.site
Ochiq manbali o'z-o'zidan ishlab chiqilgan sof oldingi qidiruv, kichik o'lchamli va tezkor javob, hozirgi sof front-end to'liq matnli qidiruvning kamchiliklarini hal qiladi va foydalanuvchi tajribasini yaxshilaydi.