এক্সপ্রেস থেকে ইলাস্টিক সার্চ ব্যবহার

কিভাবে এক্সপ্রেস API ব্যবহার করে ইলাস্টিক সার্চে ডেটা স্টোর এবং ডেটা সার্চ করা যায়, তা দেখব এই পোস্টে।

ইলাস্টিক সার্চ কি

ইলাস্টিক সার্চ হচ্ছে সার্চ এবং এনালিটিক্স ইঞ্জিন। বলতে পারেন নিজস্ব গুগলের মত সার্চ ইঞ্জিন প্লাটফর্ম। যে প্লাটফর্ম ব্যবহার করে ডেটা স্টোর, অনেক বিশাল ডেটাসেট থেকে খুব দ্রুত কোন ডেটা খুঁজে বের করা এবং ডেটা এনালাইসিস করতে পারব। রেগুলার ডেটাবেজে কীওয়ার্ড ম্যাচ না করলে ডেটা খুঁজে বের করা যায় না। ইলাস্টিক সার্চে আমরা কাছাকাছি কিওয়ার্ড দিয়েও ডেটা খুঁজে বের করতে পারব। ইলাস্টিক সার্চ বলতে ইলাস্টিক স্ট্যাককে (ELK স্ট্যাক) বুঝায়।

  • E = ইলাস্টিক সার্চ (সার্চ ইঞ্জিন)
  • L = লংস্ট্যাস (ডেটা প্রসেসিং পাইপ লাইন)
  • K = Kibana (ডেটা ভিজুয়ালাইজেশন ড্যাশবোর্ড)

আমরা যে কোন ডেটা ইলাস্টিক সার্চে স্টোর করে রাখতে পারব। সাধারণত JSON ফরমেটে ডেটা স্টোর করে রাখা হয়। এরপর বিভিন্ন কিওয়ার্ড অথবা ফিল্টার ব্যবহার করে সার্চ করতে পারব। যা খুব দ্রুত ডেটা বের করে দিবে।

লোকালি ইলাস্টিকসার্চ ইন্সটল এবং ব্যবহার

লোকালি ইলাস্টিক সার্চ ইন্সটল করে ব্যবহার করার জন্য ডকার ইন্সটল করে নিব। এরপর ডকার রান করব। এরপর টার্মিনাল বা কমান্ডলাইনে গিয়ে লেখবঃ

curl -fsSL https://elastic.co/start-local | sh

ইলাস্টিক সার্চ ইন্সটল হয়ে গেলো। অফিশিয়াল গাইড

এতটুকুই!

আমাদেরকে ইলাস্টিকসার্চ এবং কিবানার URL দেখাবে। যেমন http://localhost:9200 হচ্ছে ইলাস্টিক সার্চের URL. এই বেজ URL এ গেলে ইলাস্টিক সার্চের কোন ভার্সন ইন্সটল আছে এসব তথ্য দেখা যাবে। এই URL ব্যবহার করে আমরা যে কোন GET, POST এসব API কল করে ডেটা ইনসার্ট এবং রিট্রিভ করতে পারব।

কিভানার URL হচ্ছে http://localhost:5601 ।এখানে গেলে ভিজ্যালি ডেটা গুলো দেখার পাশাপশি এনালিটিক্স দেখতে পাবো।।

এখানে যদি পাসওয়ার্ড চায়, আমাদের পাসওয়ার্ড রিসেট করে নিতে হতে পারে। তার জন্য টার্মিনাল বা কমান্ডলাইনে গিয়ে এই কমান্ড রান করব।

docker exec -it es-local-dev bin/elasticsearch-reset-password -u elastic

তাহলে আমাদের নতুন পাসওয়ার্ড দিবে। এই ইউজারনেম হচ্ছে elastic এবং নতুন পাসওয়ার্ড দিয়ে আমরা লগিন করতে পারব।

ইলাস্টিক সার্চে ডেটা ইনসার্ট

ইনিশিয়ালি কোন ডেটা থাকবে না। আমরা ডেটা ইন্সার্ট করতে পারি এভাবেঃ

curl -X POST "http://localhost:9200/blogs/_doc/" \
  -H "Content-Type: application/json" \
  -u elastic:YOUR_PASSWORD \
  -d '{
        "title": "Hello Elasticsearch",
        "description": "Getting started with Express API"
      }'

টার্মিনালে গিয়ে উপরের কমান্ড রান করলে ডেটা ইন্সার্ট হবে। এবং নিচের মত রেসপন্স পাবোঃ

{"_index":"blogs","_id":"t5ADHJoBZAd1zomDCcC2","_version":1,"result":"created","_shards":{"total":1,"successful":1,"failed":0},"_seq_no":1,"_primary_term":1}%

এবার ইলাস্টিক সার্চ কাজ করে কিনা, তাও দেখতে পারি। তার জন্য টার্মিনালে গিয়ে লিখবঃ

curl -X GET "http://localhost:9200/blogs/_search?pretty" -u elastic:YOUR_PASSWORD

এরপর দেখব আমাদের ডকুমেন্টটা রিটার্ণ করেছে। ফুল API গাইডলাইন পাওয়া যাবে এখানে।

এক্সপ্রেস থেকে ইলাস্টিক সার্চ ব্যবহার

এবার আমরা এক্সপ্রেস API থেকে ডেটা ইনসার্ট এবং রিড করব। তার জন্য নতুন একটা প্রজেক্ট তৈরি করে নিব।

npm init -y
npm install express @elastic/elasticsearch dotenv

packages.json:

{
  "name": "elastic_search",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "node index.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "type": "module",
  "dependencies": {
    "@elastic/elasticsearch": "^8.19.1",
    "dotenv": "^17.2.3",
    "express": "^5.1.0"
  }
}

index.js:

import express from "express";
import dotenv from "dotenv";
import client from "./elasticsearch.js";

dotenv.config();

const app = express();
app.use(express.json());

// Create index if not exists
async function ensureIndex(index) {
  const exists = await client.indices.exists({ index });
  if (!exists) {
    await client.indices.create({
      index,
      body: {
        mappings: {
          properties: {
            title: { type: "text" },
            description: { type: "text" },
            createdAt: { type: "date" },
          },
        },
      },
    });
    console.log(`✅ Created index: ${index}`);
  }
}

// Index a document
app.post("/api/index/:indexName", async (req, res) => {
  const { indexName } = req.params;
  try {
    await ensureIndex(indexName);
    const result = await client.index({
      index: indexName,
      document: { ...req.body, createdAt: new Date() },
    });

    await client.indices.refresh({ index: indexName });
    res.json({ id: result._id, result: "created" });
  } catch (err) {
    console.error(err.meta ? err.meta.body : err);
    res.status(500).json({ error: err.meta ? err.meta.body : err.message });
  }
});

// Search documents
app.get("/api/index/:indexName/search", async (req, res) => {
  const { indexName } = req.params;
  const q = req.query.q || "";
  try {
    const result = await client.search({
      index: indexName,
      query: {
        multi_match: {
          query: q,
          fields: ["title", "description"],
        },
      },
    });

    res.json(result.hits.hits.map((h) => ({ id: h._id, ...h._source })));
  } catch (err) {
    res.status(500).json({ error: err.meta ? err.meta.body : err.message });
  }
});

app.listen(process.env.PORT || 3000, () =>
  console.log(`🚀 Server running on port ${process.env.PORT || 3000}`)
);

elasticsearch.js:

import { Client } from "@elastic/elasticsearch";
import dotenv from "dotenv";
dotenv.config();

const client = new Client({
  node: process.env.ELASTIC_URL,
  auth: {
    username: process.env.ELASTIC_USER,
    password: process.env.ELASTIC_PASS,
  },
 
});

export default client;

.env:

ELASTIC_URL=http://127.0.0.1:9200
PORT=3000
ELASTIC_USER=elastic
ELASTIC_PASS=YOUR_PASSWORD

এবার npm run dev রান করব। এরপর নিচের রাউটে ভিজিট করি, তাহলে রেজাল্ট দেখতে পাবো।

http://localhost:3000/api/index/blogs/search?q=hello

ডেটা ইনসার্ট

এভাবে ডেটা ইনসার্ট করতে পারবঃ

POST: http://localhost:3000/api/index/blogs
{
    "title": "Hello, world!", 
    "description": "This data inserted from Express api."
}

রেসপন্স পাবো এমনঃ

{
    "id": "uJANHJoBZAd1zomDF8Dj",
    "result": "created"
}

এক্সপ্রেস সহ জাভাস্ক্রিপ্ট নিয়ে আরো কিছু লেখা পাওয়া যাবে বাংলায় জাভাস্ক্রিপ্ট পেইজে।

Leave a Comment