brief: | i18n.site ҳоло ҷустуҷӯи пурраи матнии бе серверро дастгирӣ мекунад.
Ин мақола татбиқи технологияи ҷустуҷӯи пурраи матни пештараро муаррифӣ мекунад, аз ҷумла индекси инверсите, ки аз ҷониби IndexedDB сохта шудааст, ҷустуҷӯи префикс, оптимизатсияи сегментатсияи калимаҳо ва дастгирии бисёрзабонӣ.
Дар муқоиса бо қарорҳои мавҷуда, ҷустуҷӯи пурраи матнии i18n.site аз ҷиҳати ҳаҷм хурд ва зуд аст, барои вебсайтҳои хурд ва миёна, ба монанди ҳуҷҷатҳо ва блогҳо мувофиқ аст ва дар ҳолати офлайн дастрас аст.
Пас аз чанд ҳафтаи таҳия, i18n.site (асбоби соф статикии markdown multilingualtranslation & ) ҳоло ҷустуҷӯи пурраи матнро дастгирӣ мекунад.
Ин мақола татбиқи техникии 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калимаи браузер сегментатсияро сегменти
. ` намекунад.
5 ҷадвали нигоҳдории объект дар IndexedDB
:
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-2
калимаҳои N-1
доранд 1
баргардонида мешаванд.
Натоиҷи ҷустуҷӯи намоишшуда аввал дурустии дархостро таъмин мекунад ва натиҷаҳое, ки баъдан бор карда мешаванд (тугмаи бештарро зер кунед) суръати бозхондиро таъмин мекунанд.
Бо мақсади беҳтар кардани суръати посух, ҷустуҷӯ генератори yield
ро барои амалӣ кардани боркунии талабот истифода мебарад ва limit
дафъае, ки натиҷа пурсиш мешавад, бармегардад.
Дар хотир доред, ки ҳар дафъае, ки шумо пас аз yield
дубора ҷустуҷӯ мекунед, шумо бояд амалиёти дархости IndexedDB
-ро боз кунед.
Барои намоиш додани натиҷаҳои ҷустуҷӯ ҳангоми навиштани корбар, масалан, ҳангоми ворид кардани wor
, калимаҳои пешоянди wor
ба монанди words
ва work
намоиш дода мешаванд.
Ядрои ҷустуҷӯ ҷадвали 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
Ҷустуҷӯи поки фронталӣ, ки аз ҷиҳати ҳаҷм хурд ва вокуниши зуд таҳия шудааст, манбаи кушода, камбудиҳои ҷустуҷӯи пурраи матнии ҳозираро ҳал мекунад ва таҷрибаи беҳтари корбарро таъмин мекунад.