Elasticsearch کا استعمال کرتے ہوئے ویب ایپلیکیشنز میں تلاش کو آسان بنانے کا طریقہ

وہ کہتے ہیں کہ ڈیٹا نیا سونا ہے۔ تاہم، ریکارڈ وقت میں صارفین کے مطالبات کو پورا کرنے کے لیے بڑے ڈیٹا سیٹس کی تلاش بیک اینڈ ڈویلپرز کے لیے درد سر بنی ہوئی ہے۔

روایتی ڈیٹا بیس کے سوالات اکثر درست تلاش کے نتائج حاصل کرنے کے لیے مکمل طور پر قابل اعتماد نہیں ہوتے ہیں۔ لیکن خوش قسمتی سے، Elasticsearch مدد کے لیے حاضر ہے۔

اس مضمون میں، میں آپ کو بتاؤں گا کہ کارکردگی کو برقرار رکھتے ہوئے ڈیٹا بیس کی تلاش اور تجزیہ کو بہتر بنانے کے لیے Elasticsearch کو کیسے استعمال کیا جائے۔

اس ٹیوٹوریل کے لیے ضروری شرائط ہیں:

  • Node.js ماحول

  • بنیادی پسدید علم

اب آئیے شروع کرتے ہیں۔ لیکن سب سے پہلے، Elasticsearch کیا ہے؟

انڈیکس

Elasticsearch کیا ہے؟

Elasticsearch ایک سرچ انجن ہے جو Apache پر بنایا گیا ہے جو الفاظ اور فقروں کو انڈیکس کرکے ایڈوانس ٹیکسٹ اور ویکٹر کی تلاش کی صلاحیت فراہم کرسکتا ہے۔ اس میں دیگر مفید خصوصیات بھی ہیں جیسے تلاش کے تجزیات اور خودکار تکمیل خصوصیات۔

Elasticsearch اشاریہ سازی کی صلاحیتیں فراہم کرتا ہے (مقبول ڈیٹا بیس بھی اسے پیش کرتے ہیں)، لیکن یہ ڈیٹا بیس نہیں ہے۔

پیداواری ماحول میں استعمال ہونے والے اس ٹول کے دوسرے مقبول متبادل میں Algolia، OpenSearch، اور MeiliSearch شامل ہیں۔

Elasticsearch کلیدی شرائط

اس سیکشن میں، ہم Elasticsearch میں استعمال ہونے والی کچھ اہم اصطلاحات کو دیکھیں گے۔ آپ کو سمجھنے میں مدد کے لیے، ہم ڈیٹا بیس کی کچھ عام اصطلاحات کا حوالہ دیں گے۔

  • انڈیکس: آپ جس ڈیٹا کو دریافت کرنا چاہتے ہیں اسے ذخیرہ کرنے کی جگہ کے طور پر کام کرتا ہے۔ یہ Elasticsearch میں ایک ڈیٹا بیس کی طرح ہے۔ DBs دیگر خصوصیات بھی شیئر کرتے ہیں جیسے انفرادیت۔

  • دستاویز: یہ انڈیکس میں ذخیرہ شدہ معلومات کی سب سے چھوٹی اکائی ہے۔ یہ ساختی طور پر MongoDB پر مبنی دستاویز سے مماثل ہے اور SQL پر مبنی ڈیٹا بیس میں قطار کی طرح بھی ہے۔

  • نقشہ سازی: ایک میپنگ قواعد یا رہنما خطوط کے ایک سیٹ کی نمائندگی کرتی ہے جو اس بات کی وضاحت کرتی ہے کہ دستاویزات اور فیلڈز کو Elasticsearch انڈیکس میں کیسے ذخیرہ کیا جاتا ہے۔

  • سکور: یہ Elasticsearch کے ذریعہ بنائے گئے ہیں تاکہ ذخیرہ شدہ انڈیکس میں تلاش کے استفسار کی مطابقت کی ڈگری کی نشاندہی کی جاسکے۔

  • تجزیہ کار: جب ڈیٹا اشاریہ سازی کے لیے Elasticsearch انجن کو بھیجا جاتا ہے، تو یہ ابتدائی طور پر ایک تجزیہ کار سے گزرتا ہے جو اشاریہ سازی سے پہلے متن پر کارروائی کرتا ہے۔ یہ فلٹرز اور ٹوکنائزرز کے ذریعے حاصل کیا جاتا ہے۔

  • ٹوکنائزر: یہ ٹول Elasticsearch انجن کو بھیجے گئے پورے غیر ساختہ ڈیٹا کو مزید پروسیسنگ اور اسٹوریج کے لیے سٹرکچرڈ ڈیٹا ٹوکن میں تبدیل کرتا ہے۔

  • جمع کرنے والا: یہ سرچ ٹول قابل عمل ڈیٹا بصیرت پیدا کرنے کے لیے انڈیکس میں ذخیرہ شدہ ٹوکنز کا تفصیلی تجزیہ کرتا ہے۔ یہ Elasticsearch انجن کا فائدہ ہے۔ Mongo DB کا کلکٹر اسی طرح کی فعالیت فراہم کرتا ہے۔

  • فلٹر: کمانڈز کا ایک مجموعہ جو تجزیہ کے عمل کے دوران پیدا ہونے والے ٹوکنز میں ترمیم کرتا ہے۔ اس کے نتیجے میں فلرز، کیپٹلائزیشن رولز وغیرہ کو ہٹایا جا سکتا ہے۔

  • بلک انڈیکس: اس کا مطلب ہے کہ ایک وقت میں ایک سے زیادہ دستاویزات کو انڈیکس کرنا۔ آپ عام طور پر یہ اس وقت کرتے ہیں جب موجودہ مواد پر مشتمل ڈیٹا بیس کو انڈیکس کرتے ہیں۔

Elasticsearch کو کیسے ترتیب دیا جائے۔

اس ٹیوٹوریل کے لیے، ہم آپ کے مقامی کمپیوٹر پر Elasticsearch کا انسٹالیبل سافٹ ویئر استعمال کریں گے۔ Elasticsearch کا ایک آن لائن میزبان ورژن بھی ہے جو بے عیب کام کرتا ہے۔

یہاں ایک لنک ہے جس میں بتایا گیا ہے کہ ونڈوز پر Elasticsearch کو کیسے ترتیب دیا جائے۔ غیر ونڈوز صارفین کے لیے، آپ Linux/Mac OS پر Elasticsearch کو بھی انسٹال کر سکتے ہیں یا Docker استعمال کر سکتے ہیں۔

میمو ونڈوز صارفین کو انسٹالیشن کی غلطیوں سے بچنے کے لیے ایڈمنسٹریٹر کے طور پر Elasticsearch کو چلانا چاہیے۔

کامیاب تنصیب کے بعد، آپ جانچ کر سکتے ہیں کہ آیا یہ کام کرتا ہے: localhost:9200 یہ Elasticsearch کے لیے پہلے سے طے شدہ مقامی اختتامی نقطہ کے طور پر کام کرتا ہے۔ نیچے دی گئی تصویر کی طرح کامیابی کا پیغام آپ کی سکرین پر ظاہر ہوگا۔

یہ ہمیں پروجیکٹ کو ترتیب دینے اور ElasticSearch کو ڈیمو پروجیکٹ میں ضم کرنے کے اقدامات سے گزرے گا۔

ڈیمو پروجیکٹ کیسے ترتیب دیا جائے۔

اس ٹیوٹوریل میں، ہم نوڈ ایکسپریس جے ایس پر پہلے سے تعمیر شدہ فورم پر مبنی بیک اینڈ ایپلیکیشن کا فائدہ اٹھائیں گے۔ یہاں پراجیکٹ کا لنک ہے:

اپنے پروجیکٹ کو شروع کرنے اور چلانے کے لیے، اس پیکیج کو کلون کریں اور چلائیں۔

npm start

MySQL اسے اس ٹیوٹوریل کے لیے ڈیفالٹ ڈیٹا بیس کے طور پر استعمال کیا جائے گا۔ اب اگلے حصے کی طرف چلتے ہیں۔

اپنے پروجیکٹ میں Elasticsearch کو کیسے ترتیب دیا جائے۔

موجودہ ڈیمو پروجیکٹ ایک فورم سائٹ کا بیک اینڈ پر عمل درآمد ہے جہاں صارف ٹیکسٹ مواد پوسٹ کر سکتے ہیں اور زمرہ پر مبنی تھریڈز کے ذریعے بحث کو فروغ دے سکتے ہیں۔

Elasticsearch منفرد مطلوبہ الفاظ کا استعمال کرتے ہوئے کلیدی مواد کی نشاندہی کرنے کے لیے ان پوسٹس اور تھریڈز کو چھاننے میں صارفین کی مدد کرتا ہے۔ یہ روایتی ڈیٹا بیس کی تلاش کے سوالات کے استعمال سے زیادہ موثر ہے، جو کہ بوجھل ہو سکتی ہے۔

Elasticsearch کو ترتیب دینے کے لیے، پہلے Elasticsearch کو انسٹال کریں۔ npm پیکج ایسا کرنے کے لیے، اپنی پروجیکٹ ڈائرکٹری سے نیچے دی گئی کمانڈ کو چلائیں:

npm install @elastic/elasticsearch

کامیاب تنصیب کے بعد config.js یہ وہ فائل ہے جو ڈرائیور کو Elasticsearch ایپلیکیشن سے جڑنے کے لیے سیٹ کرتی ہے۔

const { Client } = require('@elastic/elasticsearch');

const esClient = new Client({
  node: 'http://localhost:9200',
  auth: {
    username: process.env.ELASTICSEARCH_USERNAME,
    password: process.env.ELASTICSEARCH_PASSWORD
  },
  maxRetries: 5,
  requestTimeout: 60000,
  tls: {
    rejectUnauthorized: process.env.NODE_ENV !== 'development'
  }
});

module.exports = esClient;

اپنی بیک اینڈ ایپلیکیشن کے اندر Elasticsearch کی خصوصیات تک رسائی اور استعمال کرنے کے لیے، آپ کو Elasticsearch ڈرائیور کو سیٹ اپ اور کنفیگر کرنے کی ضرورت ہے۔ تفصیلات اوپر کنفیگریشن فائل کوڈ میں بیان کی گئی ہیں۔

جیسا کہ پہلے ذکر کیا گیا ہے، Elasticsearch پر چلتا ہے: localhost:9200 بندرگاہ لہذا Elasticsearch نوڈ لوکل ہوسٹ پورٹ سے جڑ جاتا ہے۔ آن لائن ہوسٹ کردہ Elasticsearch نوڈس بھی اسی طرح کے منظرناموں میں کام کرتے ہیں۔

اگلا، کنفیگریشن فائل میں Elasticsearch تک رسائی کے لیے درکار تصدیقی اسناد فراہم کریں۔ درخواست کردہ صارف نام اور پاس ورڈ تصدیقی آبجیکٹ کے اندر فراہم کیے گئے ہیں۔ اگر آپ مقامی طور پر Elasticsearch چلاتے ہیں، تو تصدیق کی ضرورت نہیں ہو سکتی جب تک کہ سیکیورٹی فعال نہ ہو۔

اس منظر نامے میں MaxRetries Elasticsearch تک رسائی کی ناکام کوششوں کی زیادہ سے زیادہ تعداد کی نشاندہی کرتا ہے۔ اس معاملے میں، ہم نے اسے 5 کوششوں میں ٹھیک کیا۔ requestTimeout ملی سیکنڈز کی تعداد جس کے بعد کوئی درخواست پر کارروائی نہ ہونے کی صورت میں خود بخود ختم ہو جائے گی۔

ایک بار جب آپ کنفیگریشن فائل مکمل کر لیتے ہیں، تو ہم اس کنفیگریشن کو درآمد کریں گے اور بیک اینڈ شروع ہونے پر Elasticsearch کلائنٹ کو شروع کریں گے۔

Elasticsearch میں اشاریہ جات کا استعمال کیسے کریں۔

اس سے پہلے کہ آپ Elasticsearch کی پوری طاقت سے فائدہ اٹھا سکیں، آپ کو اپنے پروجیکٹ کے پسدید میں تلاش کی فعالیت کو حسب ضرورت بنانا ہوگا۔ اس میں Elasticsearch Engine کے اندر ایک انڈیکس ترتیب دینا شامل ہے جو آپ کی بیک اینڈ ایپلیکیشن پر لکھی گئی تمام پوسٹس کو انڈیکس کرتا ہے۔

const esClient = require('./config');

const setupIndex = async () => {
  try {
    const indexExists = await esClient.indices.exists({
      index: INDEX_NAME
    });

    if (indexExists) {
      console.log(`Index "${INDEX_NAME}" already exists`);
      return;
    }

    await esClient.indices.create({
      index: INDEX_NAME,
      ...indexMapping
    });

    console.log(`Index "${INDEX_NAME}" created`);
  } catch (err) {
    console.error(err);
    throw err;
  }
};

اوپر کا کوڈ ایک نئے انڈیکس کی تخلیق پر روشنی ڈالتا ہے۔ سب سے پہلے setupIndex() فنکشن اس فنکشن کے اندر، آپ انڈیکس کے لیے ایک ترجیحی نام فراہم کرتے ہیں۔ Elasticsearch پھر یہ دیکھنے کے لیے چیک کرتا ہے کہ آیا وہ نام اس انڈیکس میں پہلے سے موجود ہے۔

اگر انڈیکس کا نام پہلے سے موجود ہے تو فنکشن ختم ہو جاتا ہے (نقل سے بچنے کے لیے)۔ تاہم، اگر یہ موجود نہیں ہے، تو یہ انڈیکس میپنگ کے قواعد کے ساتھ اپنے منفرد نام کا استعمال کرتے ہوئے انڈیکس بنائے گا (اس پر جلد ہی مزید)۔

انڈیکس بنانے کے بعد، آپ کو ایپلی کیشن کنسول میں کامیابی کا پیغام نظر آئے گا۔

انڈیکس کو کیسے حذف کریں۔

تھوڑی دیر کے بعد، ایک انڈیکس اپنا مقصد پورا نہیں کر سکتا اور آپ کو اسے Elasticsearch سے ہٹانے کی ضرورت پڑ سکتی ہے۔

آپ اسے چلا کر کر سکتے ہیں: esClient.indices.delete() ذیل میں کمانڈ جاری کریں:

const deleteIndex = async () => {
  try {
    await esClient.indices.delete({ index: INDEX_NAME });
    console.log(`${INDEX_NAME} deleted`);
  } catch (err) {
    console.error("Error deleting index:", err);
  }
};

اپنے انڈیکس میں پوسٹ کو کیسے حذف کریں۔

کبھی کبھار پوسٹس کو ڈیلیٹ یا ایڈٹ کیا جا سکتا ہے۔ صارفین کو بلاک بھی کیا جا سکتا ہے، جس کے بعد ان کے مواد کو ذخیرہ شدہ ڈیٹا بیس سے ہٹا دیا جانا چاہیے۔

ان صورتوں میں، آپ کو یہ یقینی بنانا چاہیے کہ ڈیٹا بیس اور Elasticsearch انڈیکس اسٹوریج دونوں سے فزیکل ڈیلیٹ ہو جائے۔

ایسا کرنے کے لیے esClient.delete() فنکشن کو Elasticsearch کلائنٹ ID اور پوسٹ کی منفرد ID کو پاس کریں جسے آپ کال بیک آرگیومینٹس کے طور پر حذف کرنا چاہتے ہیں۔ esClient.delete فنکشن

const deletePost = async (postId) => {
  try {
    await esClient.delete({
      index: INDEX_NAME,
      id: postId.toString(),
    });

    console.log("Post successfully deleted");
    return { success: true, postId };
  } catch (err) {
    console.error(err);
    throw err;
  }
};

اپنی پوسٹس کو کیسے انڈیکس کریں۔

اپنا Elasticsearch انڈیکس ترتیب دینے کے بعد، آپ اپنے ڈیٹا بیس پر لکھی گئی پوسٹس کو اپنے Elasticsearch انڈیکس میں خود بخود انڈیکس کرنا چاہیں گے۔

ایسا کرنے کے لیے، آپ کو یہ یقینی بنانا ہوگا کہ آپ کی پوسٹس آپ کے انڈیکس اسکیما کے ساتھ مطابقت رکھتی ہیں بذریعہ: transformPostTOESRepo فنکشن یہ فیچر Elasticsearch دستاویز کے ڈھانچے سے ملنے کے لیے پوسٹ ڈیٹا کو نکالتا اور فارمیٹ کرتا ہے۔

const transformPostToESDoc = (post) => {
  return {
  id: post.id,
  title: post.title,
  content: post.body,
  author: post.author,
  category: post.category,
  tags: post.tags,
  views: post.views || 0,
  published_at: post.created_at
};

const indexPost = async (postId) => {
  try {
    const postRepo = await getPostRepo();
    const post = await postRepo.findOne({ where: { id: postId } });

    if (!post) {
      throw new Error("Post not available");
    }

    const esDocument = transformPostToESDoc(post);

    await esClient.index({
      index: INDEX_NAME,
      id: post.id.toString(),
      document: esDocument
    });

    console.log("Post successfully indexed");
    return { success: true, postId };
  } catch (err) {
    console.error(err);
    throw err;
  }
};

انڈیکس کی جانے والی پوسٹس کا ایک منفرد ID ہونا ضروری ہے۔ استعمال میں آسانی کے لیے، ہم نے پوسٹ آئی ڈی کی انوکھی رکاوٹ کا استعمال کیا جو باقاعدہ ڈیٹا بیس میں معیاری آتا ہے۔ اختیاری طور پر، آپ اپنی پوسٹ آئی ڈی بنانے کے لیے UUID لائبریری کا بھی استعمال کر سکتے ہیں۔

پھر پوسٹ کی معلومات ہے۔ esClient.index() یہ انڈیکس کرنے کے لیے ایک دستاویز کے طور پر کام کرتا ہے۔ اگر عمل ناکام ہو جاتا ہے تو ہم نے آپ کی ایپ کو کریش ہونے سے روکنے کے لیے غلطی سے نمٹنے کے مناسب اقدامات بھی کیے ہیں۔

لچکدار تلاش کی نقشہ سازی کے قواعد کی وضاحت کیسے کریں۔

Elasticsearch میپنگ اس بات کی وضاحت کرتی ہے کہ ڈیٹا کو کیسے اسٹور اور انڈیکس کیا جاتا ہے۔ ہر فیلڈ کے ڈیٹا کی قسم کی وضاحت کریں اور تلاش کے لیے متن کا تجزیہ کیسے کیا جائے گا۔

ذیل کی مثال انڈیکس کنفیگریشن کی وضاحت کرتی ہے جس میں ہر پوسٹ فیلڈ (عنوان، مواد، مصنف، وغیرہ) کے لیے خودکار تکمیل اور نقشہ سازی کے لیے حسب ضرورت تجزیہ کار شامل ہوتا ہے۔

const indexMapping = {
  settings: {
    analysis: {
      analyzer: {
        autocomplete: {
          type: 'custom',
          tokenizer: 'standard',
          filter: ['lowercase', 'autocomplete_filter']
        },
        autocomplete_search: {
          type: 'custom',
          tokenizer: 'standard',
          filter: ['lowercase']
        }
      },
      filter: {
        autocomplete_filter: {
          type: 'edge_ngram',
          min_gram: 2,
          max_gram: 10
        }
      }
    }
  },
  mappings: {
    properties: {
      id: { type: 'integer' },
      title: {
        type: 'text',
        analyzer: 'autocomplete',
        search_analyzer: 'autocomplete_search',
        fields: {
          keyword: { type: 'keyword' },
          standard: { type: 'text' }
        }
      },
      content: {
        type: 'text',
        analyzer: 'standard'
      },
      category: {
        type: 'keyword'
      },
      tags: { type: 'keyword' },
      author: {
        type: 'text',
        fields: {
          keyword: { type: 'keyword' }
        }
      },
      views: { type: 'integer' },
      published_at: { type: 'date' }
    }
  }
};

کہ indexMapping آبجیکٹ اس بات کی وضاحت کرتے ہیں کہ کس طرح Elasticsearch ڈیٹا کو اسٹور اور پروسیس کرتا ہے۔ یہ دو اہم حصوں پر مشتمل ہے: settings اور mappings.

کہ mappings حصے دستاویز کی ساخت کی وضاحت کرتے ہیں۔ ہر فیلڈ، جیسے title، contentیا authorمندرجہ ذیل اقسام ہیں: text، keyword، integerیا date. یہ Elasticsearch کو بتاتا ہے کہ ان فیلڈز کو کیسے اسٹور اور بازیافت کرنا ہے۔

ٹیکسٹ فیلڈز کے لیے، آپ ایک تجزیہ کار کی بھی وضاحت کر سکتے ہیں۔ تجزیہ کار کنٹرول کرتے ہیں کہ متن کو اشاریہ سازی اور تلاش کے دوران چھوٹے چھوٹے ٹکڑوں (ٹوکنز) میں کیسے تقسیم کیا جاتا ہے۔

پر settings سیکشن میں ہم نے خودکار تکمیل کے لیے ایک حسب ضرورت تجزیہ کار کی وضاحت کی ہے۔ یہ ہے edge_ngram یہ جزوی الفاظ کی مماثلت پیدا کرنے کے لیے فلٹرز کا استعمال کرتا ہے تاکہ صارف ٹائپ کرتے وقت نتائج تلاش کر سکیں۔ ہمارے پاس بھی الگ ہے۔ search_analyzer اس بات کو یقینی بناتا ہے کہ تلاش کی اصطلاحات پر صحیح طریقے سے عمل کیا گیا ہے۔

ایک ساتھ، یہ ترتیبات خودکار تکمیل جیسی خصوصیات کو سپورٹ کرتے ہوئے تلاش کے نتائج کو درست اور موثر رکھنے میں مدد کرتی ہیں۔

تلاش کے نفاذ

تلاش کی فعالیت کو نافذ کرنے کے لیے، آپ کو ایک API بنانا ہوگا۔ اس میں بزنس لاجک سروسز اور API روٹس کی تعمیر شامل ہے۔ تم بھی GET ایک درخواست کریں اور اپنی تلاش کی اصطلاحات بطور استفسار منسلک کریں۔ تیار کردہ نتائج JSON دستاویز کے طور پر موصول ہوتے ہیں۔

اگلا، آئیے سرچ پوسٹ سروس کی فعالیت کو نافذ کریں۔ اس منظر نامے میں، آپ انڈیکس کے اندر جملے تلاش کرنے کے لیے سرچ انجن کی فعالیت کا استعمال کریں گے۔ ہم صفحہ بندی کی تکنیکوں کو بہترین طریقوں کے مطابق استعمال کرتے ہیں تاکہ غیر منقولہ معلومات حاصل کرنے کو کم سے کم کیا جا سکے۔

تلاش کی اصطلاحات میں انڈیکس کا نام، صفحہ بندی کے پیرامیٹرز شامل ہیں (from اور size) واپس آنے والے اور متوقع نتائج کے زیادہ سے زیادہ سائز کو کنٹرول کرتا ہے۔ ہم ایک استفسار آبجیکٹ بھی منسلک کرتے ہیں جو تلاش کے فارم کی وضاحت کرتا ہے جو Elasticsearch انجن کو استعمال کرنا چاہیے۔

const searchElastic = async (query, page = 1, size = 10) => {
  const searchQuery = {
    index: INDEX_NAME,
    from: (page - 1) * size,
    size,
    query: {
      bool: {
        must: [
          {
            multi_match: {
              query,
              fields: ["title^3", "content"],
              type: "best_fields",
              fuzziness: "AUTO"
            }
          }
        ]
      }
    }
  };

  const result = await esClient.search(searchQuery);
  return result.hits.hits;
};

مندرجہ بالا کوڈ میں، فنکشن کا نام ہے: searchElastic. اس فنکشن میں تین متغیرات ہیں جنہیں چلانے کے لیے پاس کرنا ضروری ہے۔ size، page اور query.

کہ size متغیر فی تلاش کی اصطلاح میں واپس کیے جانے والے دستاویزات کی زیادہ سے زیادہ تعداد کی وضاحت کرتا ہے۔ ڈیفالٹ نمبر کوئی بھی عدد ہو سکتا ہے۔

استفسار یہ ہے۔ multi_match ایک شق جو متعدد شعبوں کو تلاش کرتی ہے، جیسے: title اور content. کہ title^3 نحو ٹائٹل میں میچوں کو مضبوط بناتا ہے، انہیں دوسرے شعبوں کے میچوں سے زیادہ متعلقہ بناتا ہے۔

ہم بھی must ایک شق جو ان شرائط کی وضاحت کرتی ہے جو کسی دستاویز کو نتائج میں شامل کرنے کے لیے مماثل ہونا چاہیے۔

تلاش کے نتائج کو عام طور پر تلاش کی اصطلاح سے ان کی مطابقت کی بنیاد پر درجہ بندی کیا جاتا ہے۔

مکمل کوڈ

اب آپ نے یہ ٹیوٹوریل مکمل کر لیا ہے اور Elasticsearch کو اپنے ڈیٹا بیس پر لکھی گئی پوسٹس کو انڈیکس کرنے کے لیے ترتیب دیا ہے۔ مکمل کوڈ ذیل میں ہے:

  1. Elasticsearch کلائنٹ (config.js):
const { Client } = require('@elastic/elasticsearch');

const esClient = new Client({
  node: 'http://localhost:9200',
  auth: {
    username: process.env.ELASTICSEARCH_USERNAME,
    password: process.env.ELASTICSEARCH_PASSWORD
  },
  maxRetries: 5,
  requestTimeout: 60000,
  tls: {
    rejectUnauthorized: process.env.NODE_ENV !== 'development'
  }
});

module.exports = esClient;
  1. انڈیکس میپنگ:
const indexMapping = {
  settings: {
    analysis: {
      analyzer: {
        autocomplete: {
          type: 'custom',
          tokenizer: 'standard',
          filter: ['lowercase', 'autocomplete_filter']
        },
        autocomplete_search: {
          type: 'custom',
          tokenizer: 'standard',
          filter: ['lowercase']
        }
      },
      filter: {
        autocomplete_filter: {
          type: 'edge_ngram',
          min_gram: 2,
          max_gram: 10
        }
      }
    }
  },
  mappings: {
    properties: {
      id: { type: 'integer' },
      title: {
        type: 'text',
        analyzer: 'autocomplete',
        search_analyzer: 'autocomplete_search',
        fields: {
          keyword: { type: 'keyword' },
          standard: { type: 'text' }
        }
      },
      content: {
        type: 'text',
        analyzer: 'standard'
      },
      category: {
        type: 'keyword'
      },
      tags: { type: 'keyword' },
      author: {
        type: 'text',
        fields: {
          keyword: { type: 'keyword' }
        }
      },
      views: { type: 'integer' },
      published_at: { type: 'date' }
    }
  }
};
  1. انڈیکس تخلیق:
const setupIndex = async () => {
  try {
    const indexExists = await esClient.indices.exists({
      index: INDEX_NAME
    });

    if (indexExists) {
      console.log(`Index "${INDEX_NAME}" already exists`);
      return;
    }

    await esClient.indices.create({
      index: INDEX_NAME,
      ...indexMapping
    });

    console.log(`Index "${INDEX_NAME}" created`);
  } catch (err) {
    console.error(err);
    throw err;
  }
};
  1. اشاریہ حذف کریں:
const deleteIndex = async () => {
  try {
    await esClient.indices.delete({ index: INDEX_NAME });
    console.log(`${INDEX_NAME} deleted`);
  } catch (err) {
    console.error("Error deleting index:", err);
  }
};
  1. دستاویز کو حذف کریں (پوسٹ):
const deletePost = async (postId) => {
  try {
    await esClient.delete({
      index: INDEX_NAME,
      id: postId.toString()
    });

    console.log("Post successfully deleted");
    return { success: true, postId };
  } catch (err) {
    console.error(err);
    throw err;
  }
};
  1. تبدیل کریں اور انڈیکس شائع کریں:
const transformPostToESDoc = (post) => {
  return {
  id: post.id,
  title: post.title,
  content: post.body,
  author: post.author,
  category: post.category,
  tags: post.tags,
  views: post.views || 0,
  published_at: post.created_at
};

const indexPost = async (postId) => {
  try {
    const postRepo = await getPostRepo();
    const post = await postRepo.findOne({ where: { id: postId } });

    if (!post) {
      throw new Error("Post not available");
    }

    const esDocument = transformPostToESDoc(post);

    await esClient.index({
      index: INDEX_NAME,
      id: post.id.toString(),
      document: esDocument
    });

    console.log("Post successfully indexed");
    return { success: true, postId };
  } catch (err) {
    console.error(err);
    throw err;
  }
};
  1. تلاش کی تقریب:
const searchElastic = async (query, page = 1, size = 10) => {
  const searchQuery = {
    index: INDEX_NAME,
    from: (page - 1) * size,
    size,
    query: {
      bool: {
        must: [
          {
            multi_match: {
              query,
              fields: ["title^3", "content"],
              type: "best_fields",
              fuzziness: "AUTO"
            }
          }
        ]
      }
    }
  };

  const result = await esClient.search(searchQuery);
  return result.hits.hits;
};

ختم

اب آپ جانتے ہیں کہ اپنی ویب ایپلیکیشنز میں صارف کی تلاش کو بہتر بنانے کے لیے Elasticsearch کا استعمال کیسے کریں۔ Elasticsearch agnostic ہے، لہذا اسے پروگرامنگ زبانوں اور فریم ورک میں استعمال کیا جا سکتا ہے۔ ہمارا بڑا کمیونٹی بیس آن بورڈنگ کو آسان بنانے کے لیے مددگار صارف گائیڈ بھی فراہم کرتا ہے۔

Elasticsearch کی طاقت سے مزید فائدہ اٹھانے کے لیے، آپ اس کے اندر دیگر ٹولز کو تلاش کر سکتے ہیں: ایلک خاص طور پر، ایک اسٹیک (Elasticsearch، Log Stash، اور Kibana) جو انٹرپرائز ایپلی کیشنز میں ڈیٹا کے لیے اعلیٰ معیار کے ڈیٹا ویژولائزیشن بنانے میں مدد کرتا ہے۔

نتیجہ

ان دنوں ویب ایپلیکیشنز میں تیز اور قابل اعتماد سرچ انجن دستیاب نہیں ہیں۔ اس کام کو پورا کرنے کے لیے Elasticsearch ایک ضروری ٹول ہے۔

دوسرے مضامین کو پڑھنے کے لیے جو آپ کے تکنیکی سفر میں اضافہ کریں گے، میری ویب سائٹ یہاں دیکھیں۔ متحرک رہیں!

اوپر تک سکرول کریں۔