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. שטיצט מאַלטי-שפּראַך זוכן 25KB איז 6.9KB אין gzip lunrjs
  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()

אין:

אינדעקס בנין

5 אַבדזשעקץ סטאָרידזש טישן זענען באשאפן אין IndexedDB :

פאָרן אין די מענגע פון דאָקומענט 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 קאַש אַלע אַרטיקלען, אַמאָל דער באַניצער פּערפאָרמז אַ זוכן, די גאנצע וועבזייטל, אַרייַנגערעכנט די זוכן, איז בנימצא אָפפלינע.

ווייַז אַפּטאַמאַזיישאַן פון MarkDown דאָקומענטן

i18n.site ס ריין פראָנט-סוף זוכן לייזונג איז אָפּטימיזעד פֿאַר MarkDown דאָקומענטן.

ווען ווייַזנדיק זוכן רעזולטאַטן, די קאַפּיטל נאָמען וועט זיין געוויזן און די קאַפּיטל וועט זיין נאַוואַגייטיד ווען קליקט.

סאַמערייז

ינווערטיד פול-טעקסט זוכן ימפּלאַמענאַד ריין אויף די פראָנט סוף, קיין סערווער פארלאנגט. עס איז זייער פּאַסיק פֿאַר קליין און מיטל-סייזד וועבסיטעס אַזאַ ווי דאָקומענטן און פּערזענלעך בלאָגס.

i18n.site עפֿן מקור זיך-דעוועלאָפּעד ריין פראָנט-סוף זוכן, קליין אין גרייס און שנעל ענטפער, סאַלווז די כיסאָרן פון די קראַנט ריין פראָנט-סוף פול-טעקסט זוכן און גיט אַ בעסער באַניצער דערפאַרונג.