brief: | i18n.site азыр серверсиз толук тексттик издөөнү колдойт.

Бул макалада IndexedDB тарабынан курулган инверттелген индексти, префикстерди издөөнү, сөздү сегментациялоону оптималдаштырууну жана көп тилдүү колдоону камтыган таза алдыңкы толук тексттик издөө технологиясын ишке ашыруу сунушталат.

Учурдагы чечимдерге салыштырмалуу, i18n.site'тин таза алдыңкы толук тексттик издөө көлөмү кичинекей жана ылдам, документтер жана блогдор сыяктуу чакан жана орто веб-сайттарга ылайыктуу жана оффлайн режиминде жеткиликтүү.


Таза Алдыңкы Инверттелген Толук Тексттик Издөө

Ырааттуулугу

Бир нече жума иштеп чыгуудан кийин, i18n.site (таза статикалык markdown көп тилдүү котормо & веб-сайт куруу куралы) азыр таза фронталдык толук тексттик издөөнү колдойт.

Бул макалада издөө эффектин i18n.site үчүн i18n.site таза толук тексттик издөөнү бөлүшөт.

Код ачык булак : Издөө ядросу / интерактивдүү интерфейс

Серверсиз Толук Тексттик Издөө Чечимдерин Карап Чыгуу

Документтер/жеке блогдор сыяктуу чакан жана орто көлөмдөгү таза статикалык веб-сайттар үчүн өз алдынча курулган толук тексттик издөө серверин түзүү өтө оор жана кызматсыз толук текстти издөө кеңири таралган тандоо.

Серверсиз толук тексттик издөө чечимдер эки кеңири категорияга бөлүнөт:

Биринчиден, algolia.com сыяктуу үчүнчү тараптын издөө кызмат көрсөтүүчүлөрү толук текстти издөө үчүн алдыңкы компоненттерди беришет.

Мындай кызматтар издөө көлөмүнүн негизинде төлөмдү талап кылат жана веб-сайттын шайкештиги сыяктуу маселелерден улам материктик Кытайдагы колдонуучуларга көп учурда жеткиликсиз.

Аны оффлайн режиминде колдонууга болбойт, интранетте колдонууга болбойт жана чоң чектөөлөр бар. Бул макалада көп сөз жок.

Экинчиси - бул толук текстти издөө.

Азыркы учурда, жалпы таза алдыңкы толук тексттик издөөлөр lunrjs жана ElasticLunr.js ( lunrjs экинчилик иштеп чыгуунун негизинде) камтыйт.

lunrjs Индекстерди түзүүнүн эки жолу бар, экөөнүн тең өз көйгөйлөрү бар.

  1. Алдын ала түзүлгөн индекс файлдары

    Индекс бардык документтердеги сөздөрдү камтыгандыктан, көлөмү чоң. Документ кошулган же өзгөртүлгөн сайын жаңы индекс файлы жүктөлүшү керек. Бул колдонуучунун күтүү убактысын көбөйтөт жана өткөрүү жөндөмдүүлүгүн көп талап кылат.

  2. Документтерди жүктөңүз жана индекстерди түзүңүз

    Индексти түзүү - бул интенсивдүү эсептөөчү иш. Индекс ага кирген сайын аны кайра куруу анык артта калууларга жана колдонуучунун начар тажрыйбасына алып келет.


lunrjs башка дагы толук тексттик издөө чечимдери бар, мисалы :

fusejs издөө үчүн саптардын окшоштугун эсептеңиз.

Бул чечимдин иштеши өтө начар жана аны толук тексттик издөө үчүн колдонуу мүмкүн эмес (караңыз Fuse.js Узак суроо 10 секунддан ашык убакытты талап кылат, аны кантип оптималдаштыруу керек? ).

TinySearch , издөө үчүн Блум чыпкасын колдонуңуз, префиксти издөө үчүн колдонулбайт (мисалы, goo , издөө good , google ) жана окшош автоматтык бүтүрүү эффектине жетише албайт.

Колдонуудагы чечимдердин кемчиликтеринен улам, i18n.site төмөнкү мүнөздөмөлөргө ээ болгон жаңы таза алдыңкы толук тексттик издөө чечимин иштеп чыкты :

  1. Көп тилдүү издөөнү колдойт жана gzip пакеттен кийинки издөө ядросунун өлчөмү 6.9KB (салыштыруу үчүн lunrjs өлчөмү 25KB )
  2. Азыраак эстутумду ээлейт жана тез indexedb негизинде инверттелген индексти түзүңүз.
  3. Документтерди кошкондо/өзгөрткөндө, бир гана кошулган же өзгөртүлгөн документтер кайра индекстелет, бул эсептөөлөрдүн көлөмүн азайтат.
  4. Префикс менен издөөнү колдойт жана колдонуучу жазып жатканда издөө натыйжаларын реалдуу убакытта көрсөтө алат.
  5. Оффлайн режиминде жеткиликтүү

Төмөндө, 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()

ичинде:

Индекс Куруу

IndexedDB -жылы 5 объект сактагыч таблица түзүлдү :

Документтин url массивине жана ver версиясына өтүп, документ doc таблицада бар-жогун издеңиз. Эгерде ал жок болсо, тескери индексти түзүңүз. Ошол эле учурда, өтпөгөн документтер үчүн тескери индексти алып салыңыз.

Ушундай жол менен, кошумча индекстөө жетишүүгө болот жана эсептөө көлөмүн азайтат.

Фронттук өз ара аракеттенүүдө, биринчи жолу жүктөөдө артта калуудан качуу үчүн индекстин жүктөлүшүнүн жүрүшү көрсөтүлүшү мүмкүн "Бирдиктүү progress + Таза css / ашырууга негизделген прогресс тилкесин" караңыз.

IndexedDB Жогорку Параллелдүү Жазуу

Долбоор асинхрондук инкапсуляциянын негизинде 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 бардык макалаларды кэштейт, анткени колдонуучу издөө жүргүзгөндөн кийин, бүт веб-сайт, анын ичинде издөө, оффлайн режиминде жеткиликтүү болот.

MarkDown Документтерин Оптималдаштыруу

i18n.site нин таза алдыңкы издөө чечими MarkDown документке оптималдаштырылган.

Издөө натыйжаларын көрсөткөндө бөлүмдүн аты көрсөтүлөт жана басылганда бөлүм багыт алат.

Жыйынтыктоо

Толук текстти тескери издөө фронттун бетинде гана ишке ашырылат, сервер талап кылынбайт. Бул документтер жана жеке блогдор сыяктуу чакан жана орто веб-сайттар үчүн абдан ылайыктуу.

i18n.site Ачык булак өз алдынча иштеп чыккан таза алдыңкы издөө, көлөмү кичинекей жана тез жооп берүү, учурдагы таза фронталдык толук тексттик издөөнүн кемчиликтерин чечет жана колдонуучу тажрыйбасын жакшыртат.