brief: | i18n.site දැන් serverless full-text search සඳහා සහය දක්වයි.

IndexedDB විසින් ගොඩනගා ඇති ප්රතිලෝම දර්ශකය, උපසර්ග සෙවීම, වචන ඛණ්ඩනය ප්රශස්තකරණය සහ බහු-භාෂා සහාය ඇතුළුව පිරිසිදු ඉදිරිපස සම්පූර්ණ පෙළ සෙවුම් තාක්ෂණය ක්රියාත්මක කිරීම මෙම ලිපියෙන් හඳුන්වා දෙයි.

පවතින විසඳුම් සමඟ සසඳන විට, i18n.site හි පිරිසිදු ඉදිරිපස සම්පූර්ණ පෙළ සෙවීම ප්රමාණයෙන් කුඩා සහ වේගවත්, ලේඛන සහ බ්ලොග් වැනි කුඩා සහ මධ්යම ප්රමාණයේ වෙබ් අඩවි සඳහා සුදුසු වන අතර නොබැඳිව ලබා ගත හැකිය.


Pure front-end inverted full-text search

අනුපිළිවෙල

සති කිහිපයක & පසු markdown i18n.site

මෙම ලිපිය i18n.site pure front-end full-text search හි තාක්ෂණික ක්රියාත්මක කිරීම බෙදාහදා ගනීවි i18n.site

කේත / මූලාශ්රය :

සේවාදායක රහිත සම්පූර්ණ පෙළ සෙවුම් විසඳුම් පිළිබඳ සමාලෝචනයක්

ලේඛන/පුද්ගලික බ්ලොග් වැනි කුඩා සහ මධ්යම ප්රමාණයේ තනිකරම ස්ථිතික වෙබ් අඩවි සඳහා, ස්වයං-සාදන ලද සම්පූර්ණ-පෙළ සෙවුම් පසුබිමක් ගොඩ නැගීම බර වැඩියි, සහ සේවා-නිදහස් සම්පූර්ණ-පෙළ සෙවීම වඩාත් පොදු තේරීම වේ.

සර්වර් රහිත සම්පූර්ණ පෙළ සෙවුම් විසඳුම් පුළුල් කාණ්ඩ දෙකකට වැටේ:

පළමුව, algolia.com තුන්වන පාර්ශ්ව සෙවුම් සේවා සපයන්නන් සම්පූර්ණ පෙළ සෙවීම සඳහා ඉදිරිපස කොටස් සපයයි.

එවැනි සේවාවන්ට සෙවුම් පරිමාව මත පදනම්ව ගෙවීමක් අවශ්ය වන අතර, වෙබ් අඩවියට අනුකූල වීම වැනි ගැටළු හේතුවෙන් චීනයේ ප්රධාන භූමියේ සිටින පරිශීලකයින්ට ඒවා බොහෝ විට ලබා ගත නොහැක.

එය නොබැඳි ලෙස භාවිතා කළ නොහැක, අන්තර් ජාලයේ භාවිතා කළ නොහැක, සහ විශාල සීමාවන් ඇත. මෙම ලිපිය බොහෝ දේ සාකච්ඡා නොකරයි.

දෙවැන්න නම් pure front-end full-text search වේ.

වර්තමානයේ, පොදු පිරිසිදු ඉදිරිපස සම්පූර්ණ-පෙළ සෙවුම් 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 විස්තරාත්මකව හඳුන්වා දෙනු ඇත.

බහුභාෂා වචන ඛණ්ඩනය

Word segmentation බ්රවුසරයේ ස්වදේශීය වචන ඛණ්ඩනය Intl.Segmenter භාවිතා කරයි, සහ සියලුම ප්රධාන ධාරාවේ බ්රව්සර් මෙම අතුරු මුහුණතට සහය දක්වයි.

segmentation 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()

තුළ:

දර්ශක ගොඩනැගීම

වස්තු ගබඩා වගු 5 ක් IndexedDB හි නිර්මාණය කරන ලදී :

ලේඛන url සහ අනුවාද අංක ver අරාව තුළට ගොස්, ලේඛනය doc වගුවේ තිබේදැයි සොයන්න. එය නොපවතියි නම්, ප්රතිලෝම දර්ශකයක් සාදන්න. ඒ සමගම, සම්මත නොකළ ලේඛන සඳහා ප්රතිලෝම දර්ශකය ඉවත් කරන්න.

මේ ආකාරයෙන්, වර්ධක සුචිගත කිරීම ලබා ගත හැකි අතර ගණනය කිරීමේ ප්රමාණය අඩු වේ.

ඉදිරිපස-අන්ත අන්තර්ක්රියා / , පළමු වරට පූරණය වන විට ප්රමාදය වළක්වා ගැනීමට දර්ශකයේ පූරණ ප්රගති තීරුව පෙන්විය හැක " තනි එකක් මත පදනම් වූ සජීවිකරණ තීරුව progress + පිරිසිදු css ක්රියාත්මක කිරීම" බලන්න.

IndexedDB ඉහළ සමගාමී ලිවීම

IndexedDB හි අසමමුහුර්ත සංග්රහය මත පදනම්ව ව්යාපෘතිය idb ඇත.

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 අඩංගු ප්රතිඵල ලබා දෙනු ඇත.

ප්රථමයෙන් දර්ශනය වන සෙවුම් ප්රතිඵල විමසුමේ නිරවද්යතාවය සහතික කරන අතර පසුව පූරණය කරන ලද ප්රතිඵල (load more බොත්තම ක්ලික් කරන්න) නැවත කැඳවීමේ අනුපාතය සහතික කරයි.

ඉල්ලුම මත පැටවීම

ප්රතිචාර වේගය වැඩි දියුණු කිරීම සඳහා, ඉල්ලුම මත පැටවීම ක්රියාත්මක කිරීමට සෙවීම 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 විවෘත මූලාශ්ර ස්වයං-සංවර්ධිත pure front-end search, කුඩා ප්රමාණයෙන් සහ වේගවත් ප්රතිචාරයක්, දැනට පවතින pure front-end full-text search හි අඩුපාඩු නිරාකරණය කර වඩා හොඳ පරිශීලක අත්දැකීමක් සපයයි.