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
ఒక కొత్త స్వచ్ఛమైన ఫ్రంట్-ఎండ్ ఫుల్-టెక్స్ట్ సెర్చ్ సొల్యూషన్ను అభివృద్ధి చేసింది, ఇది క్రింది లక్షణాలను కలిగి ఉంది :
gzip
ప్యాకేజింగ్ తర్వాత శోధన కెర్నల్ పరిమాణం 6.9KB
(పోలిక కోసం, lunrjs
పరిమాణం 25KB
)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><li>
split('.')ఎందుకంటే
Firefoxబ్రౌజర్ వర్డ్ సెగ్మెంటేషన్ సెగ్మెంట్
. ` కాదు.
5 ఆబ్జెక్ట్ నిల్వ పట్టికలు IndexedDB
లో సృష్టించబడ్డాయి :
word
: id -doc
: id - డాక్యుమెంట్ url - డాక్యుమెంట్ వెర్షన్ నంబర్docWord
: పత్రం id - పదం idprefix
: ఉపసర్గ - పదం idrindex
: వర్డ్ id - డాక్యుమెంట్ id : లైన్ నంబర్ల శ్రేణిపత్రం url
మరియు సంస్కరణ సంఖ్య ver
శ్రేణిలో పాస్ చేయండి మరియు పత్రం పట్టిక doc
లో ఉందో లేదో శోధించండి. అది ఉనికిలో లేకుంటే, విలోమ సూచికను సృష్టించండి. అదే సమయంలో, పాస్ చేయని పత్రాల కోసం విలోమ సూచికను తీసివేయండి.
ఈ విధంగా, ఇంక్రిమెంటల్ ఇండెక్సింగ్ సాధించవచ్చు మరియు గణన మొత్తం తగ్గించబడుతుంది.
ఫ్రంట్-ఎండ్ ఇంటరాక్షన్లో, మొదటి సారి లోడ్ అవుతున్నప్పుడు లాగ్ను నివారించడానికి ఇండెక్స్ యొక్క లోడ్ ప్రోగ్రెస్ బార్ ప్రదర్శించబడుతుంది "ఒకే ఆధారంగా progress + ప్యూర్ css ఇంప్లిమెంటేషన్" ఇంగ్లీష్ / చైనీస్ .
యొక్క అసమకాలిక ఎన్క్యాప్సులేషన్ ఆధారంగా ప్రాజెక్ట్ 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
నమోదు చేసినప్పుడు, words
మరియు work
వంటి wor
తో ప్రిఫిక్స్ చేయబడిన పదాలు ప్రదర్శించబడతాయి.
సెర్చ్ కెర్నల్ దానితో ప్రిఫిక్స్ చేయబడిన అన్ని పదాలను కనుగొనడానికి మరియు క్రమంలో శోధించడానికి పద విభజన తర్వాత చివరి పదం కోసం 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
ఓపెన్ సోర్స్ స్వీయ-అభివృద్ధి చెందిన స్వచ్ఛమైన ఫ్రంట్-ఎండ్ శోధన, పరిమాణంలో చిన్నది మరియు వేగవంతమైన ప్రతిస్పందన, ప్రస్తుత స్వచ్ఛమైన ఫ్రంట్-ఎండ్ పూర్తి-టెక్స్ట్ శోధన యొక్క లోపాలను పరిష్కరిస్తుంది మరియు మెరుగైన వినియోగదారు అనుభవాన్ని అందిస్తుంది.