brief: | i18n.site איצט שטיצט סערווערלעסס פול-טעקסט זוכן.
דער אַרטיקל ינטראַדוסיז די ימפּלאַמענטיישאַן פון ריין פראָנט-סוף פול-טעקסט זוכן טעכנאָלאָגיע, אַרייַנגערעכנט ינווערטיד אינדעקס געבויט דורך IndexedDB, פּרעפיקס זוכן, וואָרט סעגמענטאַטיאָן אַפּטאַמאַזיישאַן און מולטי-שפּראַך שטיצן.
קאַמפּערד מיט יגזיסטינג סאַלושאַנז, i18n.site ס ריין פראָנט-סוף פול-טעקסט זוכן איז קליין אין גרייס און שנעל, פּאַסיק פֿאַר קליין און מיטל-סייזד וועבסיטעס אַזאַ ווי דאָקומענטן און בלאָגס, און איז בנימצא אָפפלינע.
נאָך עטלעכע וואָכן פון אַנטוויקלונג, i18n.site (אַ ריין סטאַטיק markdown מאַלטיילינגוואַל טראַנסלאַטיאָן & וועבזייטל בנין געצייַג) שטיצט איצט ריין פראָנט-סוף פול-טעקסט זוכן.
דער אַרטיקל וועט טיילן די טעכניש ימפּלאַמענטיישאַן פון i18n.site
ריין פול-טעקסט זוכן צו דערפאַרונג די זוכן ווירקונג i18n.site
קאָד עפֿן : זוכן קערן / ינטעראַקטיוו צובינד
פֿאַר קליין און מיטל-סייזד ריין סטאַטיק וועבסיטעס אַזאַ ווי דאָקומענטן / פערזענלעכע בלאָגס, בויען אַ זיך-געבויט פול-טעקסט זוכן באַקענד איז צו שווער, און דינסט-פריי פול-טעקסט זוכן איז די מערסט פּראָסט ברירה.
סערווערלעסס פול-טעקסט זוכן סאַלושאַנז פאַלן אין צוויי ברייט קאַטעגאָריעס:
ערשטער, algolia.com דריט-פּאַרטיי זוכן סערוויס פּראַוויידערז צושטעלן פראָנט-סוף קאַמפּאָונאַנץ פֿאַר פול-טעקסט זוכן.
אַזאַ באַדינונגס דאַרפן צאָלונג באזירט אויף זוכן באַנד, און זענען אָפט אַנאַוויילאַבאַל צו יוזערז אין יאַבאָשע טשיינאַ רעכט צו ישוז אַזאַ ווי וועבזייטל העסקעם.
עס קענען ניט זיין געוויינט אָפפלינע, קענען ניט זיין געוויינט אויף די ינטראַנעט און האט גרויס לימיטיישאַנז. דער אַרטיקל טוט נישט דיסקוטירן פיל.
די רגע איז ריין פראָנט-סוף פול-טעקסט זוכן.
דערווייַל, פּראָסט ריין פראָנט lunrjs
ענד פול-טעקסט ElasticLunr.js אַרייַננעמען lunrjs
lunrjs
עס זענען צוויי וועגן צו בויען ינדעקסיז, און ביידע האָבן זייער אייגענע פראבלעמען.
פאַר-געבויט אינדעקס טעקעס
ווייַל דער אינדעקס כּולל ווערטער פון אַלע דאָקומענטן, עס איז גרויס אין גרייס. ווען אַ דאָקומענט איז מוסיף אָדער מאַדאַפייד, אַ נייַע אינדעקס טעקע מוזן זיין לאָודיד. עס וועט פאַרגרעסערן די באַניצער 'ס ווארטן צייט און פאַרנוצן אַ פּלאַץ פון באַנדווידט.
לאָדן דאָקומענטן און בויען ינדעקסיז אויף די פליען
בויען אַן אינדעקס איז אַ קאַמפּיוטישאַנאַלי אינטענסיווע אַרבעט.
אין אַדישאַן צו lunrjs
, עס זענען עטלעכע אנדערע פול-טעקסט זוכן סאַלושאַנז, אַזאַ ווי :
fusejs רעכענען די ענלעכקייט צווישן סטרינגס צו זוכן.
די פאָרשטעלונג פון דעם לייזונג איז גאָר אָרעם און קענען ניט זיין געוויינט פֿאַר פול-טעקסט זוכן (זען Fuse.js לאנג אָנפֿרעג נעמט מער ווי 10 סעקונדעס, ווי צו אַפּטאַמייז עס? ).
TinySearch נוצן בלום פילטער צו זוכן, קענען ניט זיין געוויינט פֿאַר פּרעפיקס זוכן (למשל, אַרייַן goo
, זוכן good
, google
), און קענען נישט דערגרייכן ענלעך אָטאַמאַטיק קאַמפּלישאַן ווירקונג.
ווייַל פון די שאָרטקאָמינגס פון די יגזיסטינג סאַלושאַנז, i18n.site
דעוועלאָפּעד אַ נייַע ריין פראָנט-סוף פול-טעקסט זוכן לייזונג, וואָס האט די פאלגענדע קעראַקטעריסטיקס :
25KB
איז 6.9KB
אין gzip
lunrjs
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 style=";text-align:right;direction:rtl"><li style=";text-align:right;direction:rtl">
split('.')איז ווייַל
Firefoxבלעטערער וואָרט סעגמענטאַטיאָן טוט נישט אָפּשניט
. ` .
5 אַבדזשעקץ סטאָרידזש טישן זענען באשאפן אין IndexedDB
:
word
: id -doc
: id - url - דאָקומענט ווערסיע נומערdocWord
: מענגע פון דאָקומענט id - וואָרט idprefix
: מענגע פון פּרעפיקס - וואָרט idrindex
: וואָרט id - דאָקומענט id : מענגע פון שורה נומערןפאָרן אין די מענגע פון דאָקומענט url
און ווערסיע נומער ver
, און זוכן צי דער דאָקומענט יגזיסץ אין טיש doc
אויב עס טוט נישט עקסיסטירן, שאַפֿן אַ ינווערטיד אינדעקס. אין דער זעלביקער צייט, אַראָפּנעמען די ינווערטיד אינדעקס פֿאַר די דאָקומענטן וואָס זענען נישט דורכגעגאנגען.
אין דעם וועג, ינקראַמענטאַל ינדעקסינג קענען זיין אַטשיווד און די סומע פון כעזשבן איז רידוסט.
אין פראָנט-ענד ינטעראַקשאַן, די css פּראָגרעס באַר פון די אינדעקס קענען זיין געוויזן צו ויסמיידן די progress + ווען לאָודינג / די ערשטער מאָל.
די פּרויעקט איז 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
איז אריין, ווערטער פּרעפיקסעד מיט 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
עפֿן מקור זיך-דעוועלאָפּעד ריין פראָנט-סוף זוכן, קליין אין גרייס און שנעל ענטפער, סאַלווז די כיסאָרן פון די קראַנט ריין פראָנט-סוף פול-טעקסט זוכן און גיט אַ בעסער באַניצער דערפאַרונג.