brief: | i18n.site азыр серверсиз толук тексттик издөөнү колдойт.
Бул макалада IndexedDB тарабынан курулган инверттелген индексти, префикстерди издөөнү, сөздү сегментациялоону оптималдаштырууну жана көп тилдүү колдоону камтыган таза алдыңкы толук тексттик издөө технологиясын ишке ашыруу сунушталат.
Учурдагы чечимдерге салыштырмалуу, i18n.site'тин таза алдыңкы толук тексттик издөө көлөмү кичинекей жана ылдам, документтер жана блогдор сыяктуу чакан жана орто веб-сайттарга ылайыктуу жана оффлайн режиминде жеткиликтүү.
Бир нече жума иштеп чыгуудан кийин, i18n.site (таза статикалык markdown көп тилдүү котормо & веб-сайт куруу куралы) азыр таза фронталдык толук тексттик издөөнү колдойт.
Бул макалада издөө эффектин i18n.site үчүн i18n.site
таза толук тексттик издөөнү бөлүшөт.
Код ачык булак : Издөө ядросу / интерактивдүү интерфейс
Документтер/жеке блогдор сыяктуу чакан жана орто көлөмдөгү таза статикалык веб-сайттар үчүн өз алдынча курулган толук тексттик издөө серверин түзүү өтө оор жана кызматсыз толук текстти издөө кеңири таралган тандоо.
Серверсиз толук тексттик издөө чечимдер эки кеңири категорияга бөлүнөт:
Биринчиден, algolia.com сыяктуу үчүнчү тараптын издөө кызмат көрсөтүүчүлөрү толук текстти издөө үчүн алдыңкы компоненттерди беришет.
Мындай кызматтар издөө көлөмүнүн негизинде төлөмдү талап кылат жана веб-сайттын шайкештиги сыяктуу маселелерден улам материктик Кытайдагы колдонуучуларга көп учурда жеткиликсиз.
Аны оффлайн режиминде колдонууга болбойт, интранетте колдонууга болбойт жана чоң чектөөлөр бар. Бул макалада көп сөз жок.
Экинчиси - бул толук текстти издөө.
Азыркы учурда, жалпы таза алдыңкы толук тексттик издөөлөр lunrjs жана ElasticLunr.js ( lunrjs
экинчилик иштеп чыгуунун негизинде) камтыйт.
lunrjs
Индекстерди түзүүнүн эки жолу бар, экөөнүн тең өз көйгөйлөрү бар.
Алдын ала түзүлгөн индекс файлдары
Индекс бардык документтердеги сөздөрдү камтыгандыктан, көлөмү чоң. Документ кошулган же өзгөртүлгөн сайын жаңы индекс файлы жүктөлүшү керек. Бул колдонуучунун күтүү убактысын көбөйтөт жана өткөрүү жөндөмдүүлүгүн көп талап кылат.
Документтерди жүктөңүз жана индекстерди түзүңүз
Индексти түзүү - бул интенсивдүү эсептөөчү иш. Индекс ага кирген сайын аны кайра куруу анык артта калууларга жана колдонуучунун начар тажрыйбасына алып келет.
lunrjs
башка дагы толук тексттик издөө чечимдери бар, мисалы :
fusejs издөө үчүн саптардын окшоштугун эсептеңиз.
Бул чечимдин иштеши өтө начар жана аны толук тексттик издөө үчүн колдонуу мүмкүн эмес (караңыз Fuse.js Узак суроо 10 секунддан ашык убакытты талап кылат, аны кантип оптималдаштыруу керек? ).
TinySearch , издөө үчүн Блум чыпкасын колдонуңуз, префиксти издөө үчүн колдонулбайт (мисалы, goo
, издөө good
, google
) жана окшош автоматтык бүтүрүү эффектине жетише албайт.
Колдонуудагы чечимдердин кемчиликтеринен улам, i18n.site
төмөнкү мүнөздөмөлөргө ээ болгон жаңы таза алдыңкы толук тексттик издөө чечимин иштеп чыкты :
gzip
пакеттен кийинки издөө ядросунун өлчөмү 6.9KB
(салыштыруу үчүн lunrjs
өлчөмү 25KB
)indexedb
негизинде инверттелген индексти түзүңүз.Төмөндө, i18n.site
техникалык ишке ашыруу деталдары майда-чүйдөсүнө чейин киргизилет.
Сөздү сегменттөө браузердин түпнуска сөз сегментациясын Intl.Segmenter
колдонот жана бардык негизги браузерлер бул интерфейсти колдойт.
Сөз сегменттөө coffeescript
коду төмөнкүдөй
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()
ичинде:
/\p{P}/
- пунктуация белгилерине дал келген кадимки туюнтма: ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _
{ | } . .</p><ul><li>
split('.')себеби,
Firefoxбраузердин сөзүн сегменттөө
. ` бөлбөйт.
IndexedDB
-жылы 5 объект сактагыч таблица түзүлдү :
word
: id -doc
: id - Документ url - Документтин версиясынын номериdocWord
Документтин : id - idprefix
: - idrindex
: Word id - Документ id : Саптын номерлериДокументтин url
массивине жана ver
версиясына өтүп, документ doc
таблицада бар-жогун издеңиз. Эгерде ал жок болсо, тескери индексти түзүңүз. Ошол эле учурда, өтпөгөн документтер үчүн тескери индексти алып салыңыз.
Ушундай жол менен, кошумча индекстөө жетишүүгө болот жана эсептөө көлөмүн азайтат.
Фронттук өз ара аракеттенүүдө, биринчи жолу жүктөөдө артта калуудан качуу үчүн индекстин жүктөлүшүнүн жүрүшү көрсөтүлүшү мүмкүн "Бирдиктүү progress + Таза css / ашырууга негизделген прогресс тилкесин" караңыз.
Долбоор асинхрондук инкапсуляциянын негизинде idb IndexedDB
IndexedDB окуу жана жазуу асинхрондуу. Индекс түзүүдө документтер индексти түзүү үчүн бир эле убакта жүктөлөт.
Атаандаш жазуудан улам жарым-жартылай маалымат жоголуп кетпеш үчүн, сиз төмөндөгү coffeescript
кодуна кайрылып, атаандаш жазууларды токтотуу үчүн окуу менен жазуунун ортосунда ing
кэш кошсоңуз болот.
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()
Издөө адегенде колдонуучу киргизген ачкыч сөздөрдү бөлөт.
Сегменттөө сөзүнөн кийин N
сөз бар деп ойлойлу, натыйжаларды кайтарып жатканда, адегенде бардык ачкыч сөздөрдү камтыган жыйынтыктар кайтарылат, андан кийин N-1
, N-2
,..., 1
ачкыч сөздөрүн камтыган жыйынтыктар кайтарылат.
Адегенде көрсөтүлгөн издөө натыйжалары суроонун тактыгын камсыздайт, ал эми кийин жүктөлгөн натыйжалар (көбүрөөк жүктөө баскычын чыкылдатыңыз) кайра чакырып алуу ылдамдыгын камсыздайт.
Жооп берүү ылдамдыгын жакшыртуу максатында, издөө талап боюнча жүктөөнү ишке ашыруу үчүн yield
генераторун колдонот жана натыйжа суралган limit
кайтарып берет.
yield
кийин кайра издеген сайын IndexedDB
сурам транзакциясын кайра ачуу керек экенин эске алыңыз.
Колдонуучу терип жатканда издөө натыйжаларын көрсөтүү үчүн, мисалы, wor
киргизилгенде, words
жана work
сыяктуу wor
префикстүү сөздөр көрсөтүлөт.
Издөө өзөгү сөз сегментациясынан кийинки акыркы сөз үчүн prefix
таблицасын колдонуп, префикстүү бардык сөздөрдү таап, ырааттуулук менен издейт.
Кыймылга каршы функция debounce
ошондой эле фронттук өз ара аракеттенүүдө колдонулат (төмөндөгүдөй ишке ашырылат) колдонуучу киргизген издөөлөрдүн жыштыгын азайтуу жана эсептөөнүн көлөмүн азайтуу.
export default (wait, func) => {
var timeout;
return function(...args) {
clearTimeout(timeout);
timeout = setTimeout(func.bind(this, ...args), wait);
};
}
Индекс таблицасында баштапкы текст сакталбайт, бир гана сөздөр сакталат, бул сактоо көлөмүн азайтат.
Издөө натыйжаларын бөлүп көрсөтүү түпнуска текстти кайра жүктөөнү талап кылат, ал эми service worker
дал келүү кайталануучу тармак сурамдарынан сактайт.
Ошол эле учурда, service worker
бардык макалаларды кэштейт, анткени колдонуучу издөө жүргүзгөндөн кийин, бүт веб-сайт, анын ичинде издөө, оффлайн режиминде жеткиликтүү болот.
i18n.site
нин таза алдыңкы издөө чечими MarkDown
документке оптималдаштырылган.
Издөө натыйжаларын көрсөткөндө бөлүмдүн аты көрсөтүлөт жана басылганда бөлүм багыт алат.
Толук текстти тескери издөө фронттун бетинде гана ишке ашырылат, сервер талап кылынбайт. Бул документтер жана жеке блогдор сыяктуу чакан жана орто веб-сайттар үчүн абдан ылайыктуу.
i18n.site
Ачык булак өз алдынча иштеп чыккан таза алдыңкы издөө, көлөмү кичинекей жана тез жооп берүү, учурдагы таза фронталдык толук тексттик издөөнүн кемчиликтерин чечет жана колдонуучу тажрыйбасын жакшыртат.