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. बहुभाषिकसन्धानस्य समर्थनं करोति तथा च आकारेण लघुः भवति 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()

इत्यस्मिन्:

अनुक्रमणिका भवन

IndexedDB मध्ये 5 वस्तुसञ्चयसारणीः निर्मिताः :

दस्तावेज url तथा संस्करणसङ्ख्या ver इत्यस्य सरणीं गच्छन्तु, तथा च अन्वेषणं कुर्वन्तु यत् दस्तावेजं सारणी doc मध्ये अस्ति वा यदि नास्ति तर्हि उल्टा अनुक्रमणिकां रचयन्तु । तस्मिन् एव काले ये दस्तावेजाः न पारिताः आसन् तेषां कृते विपर्यस्तसूचकाङ्कं निष्कासयन्तु ।

एवं प्रकारेण वृद्धिशीलं अनुक्रमणिकाकरणं प्राप्तुं शक्यते, गणनायाः परिमाणं न्यूनीकरोति च ।

अग्र-अन्त-अन्तरक्रियायां, प्रथमवारं लोड्-करणसमये विलम्बं परिहरितुं अनुक्रमणिकायाः लोडिंग्-प्रगति-पट्टिकां प्रदर्शयितुं शक्यते "एनीमेशन-सहितं प्रगति-पट्टिका, एकैकस्य progress + शुद्ध css कार्यान्वयनस्य आधारेण" English / Chinese

IndexedDB उच्च समवर्ती लेखन

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 सर्वान् लेखान् संग्रहयति, एकवारं उपयोक्ता अन्वेषणं कृत्वा अन्वेषणसहितं सम्पूर्णं जालपुटं अफलाइनरूपेण उपलभ्यते ।

MarkDown दस्तावेजानां अनुकूलनं प्रदर्शयन्तु

i18n.site 's शुद्धं अग्रभाग-अन्त-अन्वेषण-समाधानं MarkDown दस्तावेजानां कृते अनुकूलितम् अस्ति ।

अन्वेषणपरिणामान् प्रदर्शयन्ते सति अध्यायस्य नाम प्रदर्शितं भविष्यति तथा च क्लिक् कृते अध्यायः नेविगेट् भविष्यति ।

सारांशं कुरुत

विपर्यस्तपूर्णपाठसन्धानं केवलं अग्रभागे कार्यान्वितम्, सर्वरस्य आवश्यकता नास्ति । दस्तावेजानां, व्यक्तिगतब्लॉग् इत्यादीनां लघुमध्यम-आकारस्य जालपुटानां कृते अतीव उपयुक्तम् अस्ति ।

i18n.site मुक्तस्रोतः स्वयमेव विकसितः शुद्धः अग्रभागः अन्वेषणः, आकारेण लघुः द्रुतप्रतिसादः च, वर्तमानशुद्धस्य अग्रभागस्य पूर्णपाठसन्धानस्य दोषाणां समाधानं करोति तथा च उत्तमं उपयोक्तृअनुभवं प्रदाति