brief: | i18n.site သည် ယခုအခါ ဆာဗာမဲ့ စာသားအပြည့်အစုံ ရှာဖွေမှုကို ပံ့ပိုးပေးပါသည်။
ဤဆောင်းပါးသည် IndexedDB မှတည်ဆောက်ထားသော ပြောင်းပြန်အညွှန်း၊ ရှေ့ဆုံးရှာဖွေမှု၊ စကားလုံးအပိုင်းခွဲခြင်းဆိုင်ရာ ပိုမိုကောင်းမွန်အောင်ပြုလုပ်ခြင်းနှင့် ဘာသာစကားပေါင်းစုံပံ့ပိုးမှုအပါအဝင် သန့်စင်သောရှေ့ဆုံးစာသားရှာဖွေမှုနည်းပညာကို မိတ်ဆက်ထားသည်။
လက်ရှိဖြေရှင်းချက်များနှင့် နှိုင်းယှဉ်ပါက i18n.site ၏ သန့်ရှင်းသော ရှေ့ဆုံး-စာသား အပြည့်အစုံရှာဖွေမှုသည် အရွယ်အစားသေးငယ်ပြီး မြန်ဆန်သည်၊ စာရွက်စာတမ်းများနှင့် ဘလော့ဂ်များကဲ့သို့သော အသေးစားနှင့် အလတ်စားဝဘ်ဆိုဒ်များအတွက် သင့်လျော်ပြီး အော့ဖ်လိုင်းတွင် ရရှိနိုင်ပါသည်။
ရက်သတ္တပတ်အတော်ကြာ ဖွံ့ဖြိုးတိုးတက်ပြီးနောက် i18n.site (ရိုးရှင်းသော markdown ဘာသာစကားမျိုးစုံဘာသာပြန်ဆိုခြင်း & ဝဘ်ဆိုဒ်တည်ဆောက်ခြင်းကိရိယာ) သည် ယခုအခါ စာသားအပြည့်အစုံရှာဖွေမှုကို ပံ့ပိုးပေးပါသည်။
ဤဆောင်းပါးသည် ရှာဖွေမှုအကျိုးသက်ရောက်မှုကို တွေ့ကြုံ i18n.site ရန် i18n.site
၏ ရှေ့ဆုံး-အဆုံး စာသားရှာဖွေမှုကို မျှဝေပါမည်။
စာရွက်စာတမ်း/ကိုယ်ရေးကိုယ်တာ ဘလော့ဂ်များကဲ့သို့သော အသေးစားနှင့် အလတ်စား သက်သက်ငြိမ်ဝဘ်ဆိုဒ်များအတွက်၊ ကိုယ်တိုင်တည်ဆောက်ထားသော စာသားအပြည့်အစုံ ရှာဖွေမှု ကျောထောက်နောက်ခံကို တည်ဆောက်ခြင်းသည် လေးလံလွန်းပြီး ဝန်ဆောင်မှုမပါဘဲ စာသားအပြည့်အစုံရှာဖွေမှုသည် ပို၍အသုံးများသော ရွေးချယ်မှုဖြစ်သည်။
ဆာဗာမဲ့ စာသားအပြည့်အစုံ ရှာဖွေမှုဖြေရှင်းချက်သည် ကျယ်ပြန့်သော အမျိုးအစား နှစ်ခုတွင် ရှိသည်။
ပထမ၊ အလားတူ algolia.com Third-party ရှာဖွေရေးဝန်ဆောင်မှုပေးသူများသည် စာသားအပြည့်အစုံရှာဖွေမှုအတွက် ရှေ့ဆုံးအစိတ်အပိုင်းများကို ပံ့ပိုးပေးပါသည်။
ဤဝန်ဆောင်မှုများသည် ရှာဖွေမှုပမာဏအပေါ်အခြေခံ၍ ငွေပေးချေမှု လိုအပ်ပြီး ဝဘ်ဆိုဒ်လိုက်နာမှုကဲ့သို့သော ပြဿနာများကြောင့် တရုတ်ပြည်မကြီးရှိ သုံးစွဲသူများအတွက် မကြာခဏ မရနိုင်ပါ။
အော့ဖ်လိုင်းသုံး၍မရပါ၊ အင်ထရာနက်ပေါ်တွင် အသုံးမပြုနိုင်သည့်အပြင် ကန့်သတ်ချက်များစွာရှိသည်။ ဒီဆောင်းပါးက အများကြီး မဆွေးနွေးပါဘူး။
ဒုတိယမှာ စာသားအပြည့်အစုံ ရှာဖွေမှုဖြစ်သည်။
လက်ရှိတွင်၊ အများအားဖြင့် စာသားအပြည့်အစုံရှာဖွေမှုများတွင် lunrjs နှင့် ElasticLunr.js ( lunrjs
ဆင့်ပွားတိုးတက်မှုအပေါ်အခြေခံသည်)။
lunrjs
အညွှန်းကိန်းများတည်ဆောက်ရန် နည်းလမ်းနှစ်သွယ်ရှိပြီး နှစ်ခုစလုံးတွင် ပြဿနာရှိကြသည်။
ကြိုတင်တည်ဆောက်ထားသော အညွှန်းဖိုင်များ
အညွှန်းတွင် စာရွက်စာတမ်းအားလုံးမှ စကားလုံးများပါဝင်သောကြောင့် ၎င်းသည် အရွယ်အစားကြီးသည်။ စာရွက်စာတမ်းတစ်ခုကို ထည့်သွင်းသည့်အခါတိုင်း သို့မဟုတ် ပြင်ဆင်သည့်အခါတိုင်း၊ အညွှန်းဖိုင်အသစ်တစ်ခုကို တင်ရပါမည်။ ၎င်းသည် အသုံးပြုသူ၏ စောင့်ဆိုင်းချိန်ကို တိုးစေပြီး bandwidth အများအပြားကို သုံးစွဲမည်ဖြစ်သည်။
စာရွက်စာတမ်းများတင်ပြီး အညွှန်းကိန်းများကို အလျင်အမြန်တည်ဆောက်ပါ။
အညွှန်းတစ်ခုတည်ဆောက်ခြင်းသည် ကွန်ပြူတာအတွက် အထူးကြပ်မတ်သည့်အလုပ်ဖြစ်ပြီး ၎င်းကိုသင်ဝင်ရောက်သည့်အခါတိုင်း အညွှန်းကိုပြန်လည်တည်ဆောက်ခြင်းသည် သိသာထင်ရှားသောနောက်ကျမှုများနှင့် သုံးစွဲသူအတွေ့အကြုံကို ညံ့ဖျင်းစေသည်။
lunrjs
အပြင်၊ ကဲ့သို့သော အခြားသော စာသားအပြည့်အစုံ ရှာဖွေမှုဖြေရှင်းချက်အချို့လည်း ရှိသေးသည် :
fusejs ၊ ရှာဖွေရန် စာကြောင်းများကြား တူညီမှုကို တွက်ချက်ပါ။
ဤဖြေရှင်းချက်၏စွမ်းဆောင်ရည်သည် အလွန်ညံ့ဖျင်းပြီး စာသားအပြည့်အစုံရှာဖွေမှုတွင် အသုံးမပြုနိုင်ပါ ( 10 Fuse.js
TinySearch ၊ ရှာဖွေရန် Bloom စစ်ထုတ်မှုကို အသုံးပြုပါ၊ ရှေ့ဆက်ရှာဖွေမှုအတွက် အသုံးမပြုနိုင်ပါ (ဥပမာ၊ goo
၊ ရှာဖွေမှု good
၊ google
) နှင့် အလားတူ အလိုအလျောက် ပြီးဆုံးမှုအကျိုးသက်ရောက်မှုကို မရရှိနိုင်ပါ။
ရှိပြီးသားဖြေရှင်းချက်များ၏ ချို့ယွင်းချက်များကြောင့် i18n.site
အောက်ပါလက္ခဏာများပါရှိသော သန့်ရှင်းသော front-end full-text ရှာဖွေမှုဖြေရှင်းချက်အသစ်ကို တီထွင်ခဲ့သည် :
gzip
ထုပ်ပိုးပြီးနောက် ရှာဖွေမှု kernel ၏အရွယ်အစားမှာ 6.9KB
ဖြစ်သည် (နှိုင်းယှဉ်ရန်အတွက် lunrjs
၏အရွယ်အစားမှာ 25KB
ဖြစ်သည်)။indexedb
ကိုအခြေခံ၍ ပြောင်းပြန်အညွှန်းတစ်ခုတည်ဆောက်ပါ။အောက်တွင် 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()
တွင်-
/\p{P}/
သည် သတ်ပုံအမှတ်အသားများနှင့် ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _
သော ပုံမှန်အသုံးအနှုန်းတစ်ခုဖြစ်သည် { | } ~။ ။</p><ul><li>
split('.')
Firefoxbrowser word segmentation တွင် segment
. ` မဟုတ်သောကြောင့်ဖြစ်သည်။
IndexedDB
တွင် အရာဝတ္ထုသိုလှောင်မှုဇယား ၅ ခုကို ဖန်တီးခဲ့သည် :
word
: id -doc
: id - Document url - Document ဗားရှင်းနံပါတ်docWord
: စာတမ်း၏ အခင်းအကျင်း id - စကားလုံး idprefix
: ရှေ့စာလုံး - စာလုံး idrindex
: Word id - Document id : လိုင်းနံပါတ်များစာရွက်စာတမ်း url
နှင့် ဗားရှင်းနံပါတ် ver
၏ array အတွင်းသို့ ဖြတ်သွားကာ ဇယား doc
တွင် စာရွက်စာတမ်းရှိမရှိ ရှာဖွေပါ။ ၎င်းမရှိပါက၊ ပြောင်းပြန်အညွှန်းတစ်ခု ဖန်တီးပါ။ တစ်ချိန်တည်းတွင်၊ မဝင်သောစာရွက်စာတမ်းများအတွက် ပြောင်းပြန်အညွှန်းကို ဖယ်ရှားပါ။
ဤနည်းအားဖြင့် တိုးမြင့်သော အညွှန်းကိန်းကို အောင်မြင်နိုင်ပြီး တွက်ချက်မှုပမာဏကို လျှော့ချနိုင်သည်။
ရှေ့ဆုံးမှအပြန်အလှန်ဆက်သွယ်မှုတွင်၊ ပထမအကြိမ်စတင်သည့်အခါတွင် နောက်ကျခြင်းကိုရှောင်ရှားရန် အညွှန်း၏ဖွင့်ခြင်းတိုးတက်မှုဘားကိုပြသနိုင်သည် "Progress Bar with Animation, Based on a Single progress + Pure css Implementation" English / Chinese .
ပရောဂျက်သည် ချိန်ညှိထားသော ကာဗာကို အခြေခံ၍ 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
၏ 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
ကက်ရှ်လုပ်ထားသောကြောင့်၊ အသုံးပြုသူက ရှာဖွေမှုတစ်ခုလုပ်ဆောင်သည်နှင့်၊ ရှာဖွေမှုအပါအဝင် ဝဘ်ဆိုက်တစ်ခုလုံးသည် အော့ဖ်လိုင်းဖြစ်နိုင်သည်။
i18n.site
၏ ရှေ့ဆုံးမှ ရှာဖွေမှုဖြေရှင်းချက်သည် စာရွက်စာတမ်း MarkDown
အတွက် အကောင်းဆုံးဖြစ်အောင် ပြုလုပ်ထားသည်။
ရှာဖွေမှုရလဒ်များကိုပြသသည့်အခါ၊ အခန်းအမည်ကိုပြသမည်ဖြစ်ပြီး ကလစ်နှိပ်လိုက်သောအခါတွင် အခန်းကိုလမ်းညွှန်မည်ဖြစ်သည်။
ပြောင်းပြန်လှန်ထားသော စာသားအပြည့်အစုံရှာဖွေမှုကို ရှေ့ဆုံးတွင်သာ အကောင်အထည်ဖော်သည်၊ ဆာဗာမလိုအပ်ပါ။ စာရွက်စာတမ်းများနှင့် ကိုယ်ပိုင်ဘလော့ဂ်များကဲ့သို့သော အသေးစားနှင့် အလတ်စားဝဘ်ဆိုဒ်များအတွက် အလွန်သင့်လျော်ပါသည်။
i18n.site
Open source ကိုယ်တိုင်ဖန်တီးထားသော သန့်ရှင်းသော ရှေ့ဆုံးရှာဖွေမှု၊ အရွယ်အစားသေးငယ်ပြီး လျင်မြန်သော တုံ့ပြန်မှုသည် လက်ရှိစစ်မှန်သော စာသားအပြည့်အစုံရှာဖွေမှု၏ ချို့ယွင်းချက်များကို ဖြေရှင်းပေးပြီး ပိုမိုကောင်းမွန်သော အသုံးပြုသူအတွေ့အကြုံကို ပေးပါသည်။