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 style=";text-align:right;direction:rtl"><li style=";text-align:right;direction:rtl">
split('.')ہے کیونکہ
Firefoxبراؤزر لفظ سیگمنٹیشن سیگمنٹ
. ` نہیں کرتا ہے۔
5 آبجیکٹ اسٹوریج ٹیبل IndexedDB
میں بنائے گئے تھے :
word
: id -doc
: id - url - دستاویز کا ورژن نمبرdocWord
:prefix
: - لفظ 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
درج کیا جاتا ہے، تو 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
تمام مضامین کو کیش کرتا ہے، ایک بار جب صارف تلاش کرتا ہے، تلاش سمیت پوری ویب سائٹ آف لائن دستیاب ہوتی ہے۔
i18n.site
کا خالص فرنٹ اینڈ سرچ حل MarkDown
دستاویزات کے لیے موزوں ہے۔
تلاش کے نتائج دکھاتے وقت، باب کا نام ظاہر ہو جائے گا اور کلک کرنے پر باب نیویگیٹ ہو جائے گا۔
الٹی مکمل متن کی تلاش مکمل طور پر سامنے والے سرے پر لاگو ہوتی ہے، کسی سرور کی ضرورت نہیں ہے۔ یہ چھوٹی اور درمیانے درجے کی ویب سائٹس جیسے دستاویزات اور ذاتی بلاگز کے لیے بہت موزوں ہے۔
i18n.site
اوپن سورس سیلف ڈیولپڈ خالص فرنٹ اینڈ سرچ، سائز میں چھوٹی اور تیز رسپانس، موجودہ خالص فرنٹ اینڈ فل ٹیکسٹ سرچ کی خامیوں کو دور کرتی ہے اور صارف کا بہتر تجربہ فراہم کرتی ہے۔