brief: | i18n.site-ն այժմ աջակցում է առանց սերվերի ամբողջական տեքստի որոնում:

Այս հոդվածը ներկայացնում է ամբողջական տեքստի ամբողջական որոնման տեխնոլոգիայի ներդրումը, ներառյալ IndexedDB-ի կողմից կառուցված շրջված ինդեքսը, նախածանցների որոնումը, բառերի հատվածավորման օպտիմալացումը և բազմալեզու աջակցությունը:

Համեմատած գոյություն ունեցող լուծումների հետ՝ i18n.site-ի ամբողջական ամբողջական տեքստային որոնումը փոքր է և արագ, հարմար է փոքր և միջին կայքերի, ինչպիսիք են փաստաթղթերն ու բլոգները, և հասանելի է անցանց:


Մաքուր Ճակատային Շրջված Ամբողջական Տեքստի Որոնում

Հաջորդականությունը

Մի քանի շաբաթների մշակումից հետո i18n.site զուտ ստատիկ markdown բազմալեզու թարգմանության & վեբկայքի ստեղծման գործիք) այժմ աջակցում է ամբողջական տեքստային որոնումը:

Այս հոդվածը կներկայացնի i18n.site մաքուր ամբողջական տեքստային որոնման տեխնիկական իրագործումը i18n.site

Կոդ բաց : Որոնման միջուկ / ինտերակտիվ ինտերֆեյս

Առանց Սերվերի Ամբողջական Տեքստի Որոնման Լուծումների Վերանայում

Փոքր և միջին չափի զուտ ստատիկ կայքերի համար, ինչպիսիք են փաստաթղթերը/անձնական բլոգները, ինքնուրույն կառուցված ամբողջական տեքստային որոնման հետին պլան կառուցելը չափազանց ծանր է, և առանց ծառայության ամբողջական տեքստի որոնումն առավել տարածված ընտրությունն է:

Առանց սերվերի ամբողջական տեքստի որոնման լուծումները բաժանվում են երկու լայն կատեգորիաների.

algolia.com , երրորդ կողմի որոնման ծառայություններ մատուցողները ապահովում են ամբողջական տեքստային որոնման համար նախատեսված բաղադրիչներ:

Նման ծառայությունները պահանջում են վճարում՝ հիմնված որոնման ծավալի վրա, և հաճախ անհասանելի են մայրցամաքային Չինաստանի օգտատերերի համար՝ վեբ կայքի համապատասխանության հետ կապված խնդիրների պատճառով:

Այն չի կարող օգտագործվել անցանց ռեժիմում, չի կարող օգտագործվել ինտրանետում և ունի մեծ սահմանափակումներ: Այս հոդվածը շատ բան չի քննարկում:

Երկրորդը մաքուր ճակատային ամբողջական տեքստային որոնումն է:

Ներկայում, ElasticLunr.js ամբողջական տեքստային որոնումները lunrjs են lunrjs

lunrjs Ինդեքսներ ստեղծելու երկու եղանակ կա, և երկուսն էլ ունեն իրենց խնդիրները:

  1. Նախապես կառուցված ինդեքսային ֆայլեր

    Քանի որ ինդեքսը պարունակում է բառեր բոլոր փաստաթղթերից, այն մեծ է չափերով: Ամեն անգամ, երբ փաստաթուղթ ավելացվում կամ փոփոխվում է, պետք է բեռնվի նոր ինդեքսային ֆայլ: Դա կավելացնի օգտվողի սպասման ժամանակը և կսպառի մեծ թողունակություն:

  2. Բեռնել փաստաթղթերը և կառուցել ինդեքսներ անմիջապես

    Ինդեքս կառուցելը հաշվողականորեն ինտենսիվ խնդիր է Ամեն անգամ, երբ մուտք գործեք ինդեքսը, կառաջացնի ակնհայտ ուշացումներ և վատ օգտատերերի փորձ:


Բացի lunrjs -ից, կան ամբողջական տեքստի որոնման այլ լուծումներ, ինչպիսիք են :

fusejs հաշվարկեք որոնման տողերի նմանությունը:

Այս լուծման արդյունավետությունը չափազանց վատ է և չի կարող օգտագործվել ամբողջական տեքստի որոնման համար (տես Fuse.js Երկար հարցումը տևում է ավելի քան 10 վայրկյան, ինչպե՞ս այն օպտիմալացնել: ):

TinySearch օգտագործեք Bloom ֆիլտրը որոնման համար, չի կարող օգտագործվել նախածանցի որոնման համար (օրինակ, մուտքագրեք goo , որոնեք good , google ) և չի կարող հասնել նմանատիպ ավտոմատ ավարտման էֆեկտի:

Գոյություն ունեցող լուծումների թերությունների պատճառով i18n.site մշակեց նոր մաքուր ճակատային ամբողջական տեքստի որոնման լուծում, որն ունի հետևյալ բնութագրերը :

  1. Աջակցում է բազմալեզու որոնմանը և չափսերով փոքր է որոնման միջուկի չափը gzip փաթեթավորումից հետո 6.9KB է (համեմատության համար lunrjs -ի չափը 25KB է):
  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()

մեջ: