brief: | i18n.site သည် ယခုအခါ ဆာဗာမဲ့ စာသားအပြည့်အစုံ ရှာဖွေမှုကို ပံ့ပိုးပေးပါသည်။

ဤဆောင်းပါးသည် IndexedDB မှတည်ဆောက်ထားသော ပြောင်းပြန်အညွှန်း၊ ရှေ့ဆုံးရှာဖွေမှု၊ စကားလုံးအပိုင်းခွဲခြင်းဆိုင်ရာ ပိုမိုကောင်းမွန်အောင်ပြုလုပ်ခြင်းနှင့် ဘာသာစကားပေါင်းစုံပံ့ပိုးမှုအပါအဝင် သန့်စင်သောရှေ့ဆုံးစာသားရှာဖွေမှုနည်းပညာကို မိတ်ဆက်ထားသည်။

လက်ရှိဖြေရှင်းချက်များနှင့် နှိုင်းယှဉ်ပါက i18n.site ၏ သန့်ရှင်းသော ရှေ့ဆုံး-စာသား အပြည့်အစုံရှာဖွေမှုသည် အရွယ်အစားသေးငယ်ပြီး မြန်ဆန်သည်၊ စာရွက်စာတမ်းများနှင့် ဘလော့ဂ်များကဲ့သို့သော အသေးစားနှင့် အလတ်စားဝဘ်ဆိုဒ်များအတွက် သင့်လျော်ပြီး အော့ဖ်လိုင်းတွင် ရရှိနိုင်ပါသည်။


သန့်ရှင်းသော ရှေ့ဆုံးတွင် ပြောင်းပြန်လှန်ထားသော စာသားအပြည့်အစုံ ရှာဖွေမှု

sequence

ရက်သတ္တပတ်အတော်ကြာ ဖွံ့ဖြိုးတိုးတက်ပြီးနောက် i18n.site (ရိုးရှင်းသော markdown ဘာသာစကားမျိုးစုံဘာသာပြန်ဆိုခြင်း & ဝဘ်ဆိုဒ်တည်ဆောက်ခြင်းကိရိယာ) သည် ယခုအခါ စာသားအပြည့်အစုံရှာဖွေမှုကို ပံ့ပိုးပေးပါသည်။

ဤဆောင်းပါးသည် ရှာဖွေမှုအကျိုးသက်ရောက်မှုကို တွေ့ကြုံ i18n.site ရန် i18n.site ၏ ရှေ့ဆုံး-အဆုံး စာသားရှာဖွေမှုကို မျှဝေပါမည်။

ကုဒ်ဖွင့ သည့် / :

serverless full-text ရှာဖွေမှုဖြေရှင်းချက်၏ ခြုံငုံသုံးသပ်ချက်

စာရွက်စာတမ်း/ကိုယ်ရေးကိုယ်တာ ဘလော့ဂ်များကဲ့သို့သော အသေးစားနှင့် အလတ်စား သက်သက်ငြိမ်ဝဘ်ဆိုဒ်များအတွက်၊ ကိုယ်တိုင်တည်ဆောက်ထားသော စာသားအပြည့်အစုံ ရှာဖွေမှု ကျောထောက်နောက်ခံကို တည်ဆောက်ခြင်းသည် လေးလံလွန်းပြီး ဝန်ဆောင်မှုမပါဘဲ စာသားအပြည့်အစုံရှာဖွေမှုသည် ပို၍အသုံးများသော ရွေးချယ်မှုဖြစ်သည်။

ဆာဗာမရှိသော စာသားအပြည့်အစုံရှာဖွေမှုဖြေရှင်းချက်များအား အမျိုးအစားနှစ်ခုအဖြစ် ကျယ်ဝန်းသည်-

ပထမ၊ အလားတူ algolia.com Third-party ရှာဖွေရေးဝန်ဆောင်မှုပေးသူများသည် စာသားအပြည့်အစုံရှာဖွေမှုအတွက် ရှေ့ဆုံးအစိတ်အပိုင်းများကို ပံ့ပိုးပေးပါသည်။

ဤဝန်ဆောင်မှုများသည် ရှာဖွေမှုပမာဏအပေါ်အခြေခံ၍ ငွေပေးချေမှု လိုအပ်ပြီး ဝဘ်ဆိုဒ်လိုက်နာမှုကဲ့သို့သော ပြဿနာများကြောင့် တရုတ်ပြည်မကြီးရှိ သုံးစွဲသူများအတွက် မကြာခဏ မရနိုင်ပါ။

အော့ဖ်လိုင်းသုံး၍မရပါ၊ အင်ထရာနက်ပေါ်တွင် အသုံးမပြုနိုင်သည့်အပြင် ကန့်သတ်ချက်များစွာရှိသည်။ ဒီဆောင်းပါးက အများကြီး မဆွေးနွေးပါဘူး။

ဒုတိယမှာ စာသားအပြည့်အစုံ ရှာဖွေမှုဖြစ်သည်။

လက်ရှိတွင်၊ အများအားဖြင့် စာသားအပြည့်အစုံရှာဖွေမှုများတွင် lunrjs နှင့် ElasticLunr.js ( lunrjs ဆင့်ပွားတိုးတက်မှုအပေါ်အခြေခံသည်)။

lunrjs အညွှန်းကိန်းများတည်ဆောက်ရန် နည်းလမ်းနှစ်သွယ်ရှိပြီး နှစ်ခုစလုံးတွင် ပြဿနာရှိကြသည်။

  1. ကြိုတင်တည်ဆောက်ထားသော အညွှန်းဖိုင်များ

    အညွှန်းတွင် စာရွက်စာတမ်းအားလုံးမှ စကားလုံးများပါ၀င်သောကြောင့် ၎င်းသည် အရွယ်အစားကြီးသည်။ စာရွက်စာတမ်းတစ်ခုကို ထည့်သွင်းသည့်အခါတိုင်း သို့မဟုတ် ပြင်ဆင်သည့်အခါတိုင်း၊ အညွှန်းဖိုင်အသစ်တစ်ခုကို တင်ရပါမည်။ ၎င်းသည် အသုံးပြုသူ၏စောင့်ဆိုင်းချိန်ကို တိုးစေပြီး bandwidth အများအပြားကို သုံးစွဲမည်ဖြစ်သည်။

  2. စာရွက်စာတမ်းများတင်ပြီး အညွှန်းကိန်းများကို အလျင်အမြန်တည်ဆောက်ပါ။

    အညွှန်းတစ်ခုတည်ဆောက်ခြင်းသည် ကွန်ပြူတာဆိုင်ရာ အထူးကြပ်မတ်သည့်အလုပ်ဖြစ်ပြီး ၎င်းကိုသင်ဝင်ရောက်သည့်အခါတိုင်း အညွှန်းကိုပြန်လည်တည်ဆောက်ခြင်းသည် သိသာထင်ရှားသောနောက်ကျမှုများနှင့် သုံးစွဲသူအတွေ့အကြုံကို ညံ့ဖျင်းစေသည်။


lunrjs အပြင်၊ ကဲ့သို့သော အခြားသော စာသားအပြည့်အစုံ ရှာဖွေမှုဖြေရှင်းချက်အချို့လည်း ရှိသေးသည် :

fusejs ၊ ရှာဖွေရန် စာကြောင်းများကြား တူညီမှုကို တွက်ချက်ပါ။

ဤဖြေရှင်းချက်၏စွမ်းဆောင်ရည်သည် အလွန်ညံ့ဖျင်းပြီး စာသားအပြည့်အစုံရှာဖွေမှုတွင် အသုံးမပြုနိုင်ပါ ( 10 Fuse.js

TinySearch ၊ ရှာဖွေရန် Bloom စစ်ထုတ်မှုကို အသုံးပြုပါ၊ ရှေ့ဆက်ရှာဖွေမှုအတွက် အသုံးမပြုနိုင်ပါ (ဥပမာ၊ goo ၊ ရှာဖွေမှု goodgoogle ) နှင့် အလားတူ အလိုအလျောက် ပြီးဆုံးမှုအကျိုးသက်ရောက်မှုကို မရရှိနိုင်ပါ။

ရှိပြီးသားဖြေရှင်းချက်များ၏ ချို့ယွင်းချက်များကြောင့် i18n.site အောက်ပါလက္ခဏာများပါရှိသော သန့်ရှင်းသော front-end full-text ရှာဖွေမှုဖြေရှင်းချက်အသစ်ကို တီထွင်ခဲ့သည် :

  1. ဘာသာစကားပေါင်းစုံရှာဖွေမှုကို ပံ့ပိုးပေးထားပြီး အရွယ်အစားမှာ gzip ထုပ်ပိုးပြီးနောက် ရှာဖွေမှု kernel ၏အရွယ်အစားမှာ 6.9KB ဖြစ်သည် (နှိုင်းယှဉ်ရန်အတွက် lunrjs ၏အရွယ်အစားမှာ 25KB ဖြစ်သည်)။
  2. မှတ်ဉာဏ်နည်းပြီး မြန်ဆန်သော indexedb ကိုအခြေခံ၍ ပြောင်းပြန်အညွှန်းတစ်ခုတည်ဆောက်ပါ။
  3. စာရွက်စာတမ်းများကို ပေါင်းထည့်ခြင်း/မွမ်းမံသည့်အခါ၊ ထည့်သွင်းထားသော သို့မဟုတ် မွမ်းမံထားသော စာရွက်စာတမ်းများကိုသာ ပြန်လည်ထည့်သွင်းပြီး တွက်ချက်မှုပမာဏကို လျှော့ချပေးသည်။
  4. အသုံးပြုသူ စာရိုက်နေချိန်တွင် ရှာဖွေမှုရလဒ်များကို အချိန်နှင့်တပြေးညီပြသနိုင်သည့် ရှေ့ဆက်ရှာဖွေမှုကို ပံ့ပိုးပေးသည်။
  5. အော့ဖ်လိုင်း ရနိုင်သည်။

အောက်တွင် i18n.site နည်းပညာဆိုင်ရာ အကောင်အထည်ဖော်မှုအသေးစိတ်များကို အသေးစိတ်ဖော်ပြပါမည်။

ဘာသာပေါင်းစုံ စကားလုံး ပိုင်းခြားခြင်း။

Word segmentation သည် browser ၏ မူရင်းစကားလုံး segmentation Intl.Segmenter ကိုအသုံးပြုပြီး ပင်မဘရောက်ဆာများအားလုံးသည် ဤ interface ကို ပံ့ပိုးပေးပါသည်။

စကားလုံး အပိုင်းခွဲခြင်း 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 တွင် အရာဝတ္ထုသိုလှောင်မှုဇယား ၅ ခုကို ဖန်တီးခဲ့သည် :

စာရွက်စာတမ်း url နှင့် ဗားရှင်းနံပါတ် ver ၏ array အတွင်းသို့ ဖြတ်သွားကာ ဇယား doc တွင် စာရွက်စာတမ်းရှိမရှိ ရှာဖွေပါ။ ၎င်းမရှိပါက၊ ပြောင်းပြန်အညွှန်းတစ်ခု ဖန်တီးပါ။ တစ်ချိန်တည်းတွင်၊ မဝင်သောစာရွက်စာတမ်းများအတွက် ပြောင်းပြန်အညွှန်းကို ဖယ်ရှားပါ။

ဤနည်းအားဖြင့် တိုးမြင့်သော အညွှန်းကိန်းကို အောင်မြင်နိုင်ပြီး တွက်ချက်မှုပမာဏကို လျှော့ချနိုင်သည်။

ရှေ့ဆုံးမှအပြန်အလှန်ဆက်သွယ်မှုတွင်၊ ပထမအကြိမ်စတင်သည့်အခါတွင် နောက်ကျခြင်းကိုရှောင်ရှားရန် အညွှန်း၏ဖွင့်ခြင်းတိုးတက်မှုဘားကိုပြသနိုင်သည် "Progress Bar with Animation, Based on a Single progress + Pure css Implementation" English / Chinese .

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-1N-2 ၊... ၊ 1 သော့ချက်စာလုံးများပါရှိသော ရလဒ်များကို ပြန်ပေးပါမည်။

ပထမဆုံးပြသသော ရှာဖွေမှုရလဒ်များသည် မေးမြန်းမှု၏တိကျမှုကိုသေချာစေပြီး နောက်ပိုင်းတွင်တင်သည့်ရလဒ်များ (ဝန်ပိုခလုတ်ကိုနှိပ်ပါ) ပြန်လည်သိမ်းဆည်းမှုနှုန်းကိုသေချာစေသည်။

တောင်းဆိုမှုအပေါ် Load

တုံ့ပြန်မှုအမြန်နှုန်းကို မြှင့်တင်ရန်အတွက်၊ ရှာဖွေမှုသည် လိုအပ်သလောက်တင်ခြင်းအား အကောင်အထည်ဖော်ရန် yield ဂျင်နရေတာကို အသုံးပြုကာ ရလဒ်ကို မေးမြန်းသည့် limit ပြန်လာပါသည်။

yield ပြီးနောက် ထပ်မံရှာဖွေသည့်အခါတိုင်း၊ သင်သည် IndexedDB ၏ query transaction တစ်ခုကို ပြန်ဖွင့်ရန် လိုအပ်ကြောင်း သတိပြုပါ။

အချိန်နှင့်တစ်ပြေးညီ ရှာဖွေမှု ရှေ့ဆက်ပါ။

အသုံးပြုသူက စာရိုက်နေချိန်တွင် ရှာဖွေမှုရလဒ်များကို ပြသရန်အတွက် ဥပမာ၊ wor ထည့်သွင်းသောအခါ၊ words နှင့် work ကဲ့သို့သော wor ရှေ့စာလုံးများကို ပြသမည်ဖြစ်သည်။

Search kernel သည် ၎င်းနှင့်ရှေ့ဆက်ထားသော စကားလုံးအားလုံးကို ရှာဖွေရန် စကားလုံးခွဲခြမ်းပြီးနောက် နောက်ဆုံးစကားလုံးအတွက် prefix ဇယားကို အသုံးပြုမည်ဖြစ်ပြီး ၎င်းနှင့်ရှေ့ဆက်ထားသော စကားလုံးအားလုံးကို ရှာဖွေကာ ဆက်တိုက်ရှာဖွေမည်ဖြစ်သည်။

Anti-shake လုပ်ဆောင်ချက် 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 Open source ကိုယ်တိုင်ဖန်တီးထားသော သန့်ရှင်းသော ရှေ့ဆုံးရှာဖွေမှု၊ အရွယ်အစားသေးငယ်ပြီး လျင်မြန်သော တုံ့ပြန်မှုသည် လက်ရှိစစ်မှန်သော စာသားအပြည့်အစုံရှာဖွေမှု၏ ချို့ယွင်းချက်များကို ဖြေရှင်းပေးပြီး ပိုမိုကောင်းမွန်သော အသုံးပြုသူအတွေ့အကြုံကို ပေးပါသည်။