brief: | i18n.site இப்போது சேவையகமற்ற முழு உரை தேடலை ஆதரிக்கிறது.
IndexedDB ஆல் கட்டமைக்கப்பட்ட தலைகீழ் குறியீடு, முன்னொட்டு தேடல், சொல் பிரிவினை மேம்படுத்தல் மற்றும் பல மொழி ஆதரவு உள்ளிட்ட தூய முன்-இறுதி முழு-உரை தேடல் தொழில்நுட்பத்தை செயல்படுத்துவதை இந்தக் கட்டுரை அறிமுகப்படுத்துகிறது.
ஏற்கனவே உள்ள தீர்வுகளுடன் ஒப்பிடும்போது, i18n.site இன் தூய முன்-இறுதி முழு-உரை தேடல் அளவு சிறியது மற்றும் வேகமானது, ஆவணங்கள் மற்றும் வலைப்பதிவுகள் போன்ற சிறிய மற்றும் நடுத்தர அளவிலான இணையதளங்களுக்கு ஏற்றது மற்றும் ஆஃப்லைனில் கிடைக்கிறது.
பல & markdown பிறகு, i18n.site
இந்த கட்டுரை 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
ஓப்பன் சோர்ஸ் சுய-மேம்படுத்தப்பட்ட தூய முன்-இறுதி தேடல், சிறிய அளவு மற்றும் வேகமான பதில், தற்போதைய தூய முன்-இறுதி முழு-உரை தேடலின் குறைபாடுகளைத் தீர்த்து, சிறந்த பயனர் அனுபவத்தை வழங்குகிறது.