আপনার পাইথন অ্যাপ্লিকেশনে সার্চের ক্ষমতা উন্মোচন করুন। ইলাস্টিকসার্চ ইনস্টল, সংযোগ, ইনডেক্স এবং কোয়েরি করা শিখুন অফিসিয়াল পাইথন ক্লায়েন্ট ব্যবহার করে। ডেভেলপারদের জন্য একটি ধাপে ধাপে নির্দেশিকা।
সার্চে দক্ষতা: পাইথন ও ইলাস্টিকসার্চ ইন্টিগ্রেট করার একটি সম্পূর্ণ নির্দেশিকা
আজকের ডেটা-নির্ভর বিশ্বে, প্রায় রিয়েল-টাইমে বিপুল পরিমাণ তথ্য সার্চ, বিশ্লেষণ এবং ভিজ্যুয়ালাইজ করার ক্ষমতা আর কোনো বিলাসিতা নয়—এটি একটি অপরিহার্যতা। লক্ষ লক্ষ পণ্য সহ ই-কমার্স সাইট থেকে শুরু করে প্রতিদিন টেরাবাইট ডেটা প্রক্রিয়াকরণকারী লগ বিশ্লেষণ সিস্টেম পর্যন্ত, একটি শক্তিশালী সার্চ ইঞ্জিন আধুনিক অ্যাপ্লিকেশনগুলির মেরুদণ্ড। এখানেই ইলাস্টিকসার্চ তার শ্রেষ্ঠত্ব প্রমাণ করে, এবং বিশ্বের সবচেয়ে জনপ্রিয় প্রোগ্রামিং ভাষাগুলির মধ্যে একটি, পাইথনের সাথে যুক্ত হলে, এটি বিশ্বব্যাপী ডেভেলপারদের জন্য একটি শক্তিশালী সংমিশ্রণ তৈরি করে।
এই সম্পূর্ণ নির্দেশিকাটি ডেভেলপার, ডেটা ইঞ্জিনিয়ার এবং আর্কিটেক্টদের একটি আন্তর্জাতিক দর্শকের জন্য ডিজাইন করা হয়েছে। আমরা আপনাকে অফিসিয়াল ক্লায়েন্ট, elasticsearch-py ব্যবহার করে আপনার পাইথন অ্যাপ্লিকেশনগুলিতে ইলাস্টিকসার্চ ইন্টিগ্রেট করার প্রতিটি ধাপের মধ্য দিয়ে নিয়ে যাব। আমরা আপনার পরিবেশ সেট আপ করা থেকে শুরু করে জটিল কোয়েরি করা পর্যন্ত সবকিছু কভার করব, যখন যেকোনো পেশাদার পরিবেশে প্রযোজ্য সর্বোত্তম অনুশীলনগুলির উপর মনোযোগ দেবো।
কেন ইলাস্টিকসার্চ এবং পাইথন? নিখুঁত অংশীদারিত্ব
আমরা প্রযুক্তিগত বিশদ বিবরণে ডুব দেওয়ার আগে, আসুন বুঝি কেন এই সংমিশ্রণটি এত শক্তিশালী।
ইলাস্টিকসার্চ কেবল একটি সার্চ ইঞ্জিন নয়। এটি অ্যাপাচি লুসিন-এর উপর নির্মিত একটি ডিস্ট্রিবিউটেড, RESTful সার্চ এবং অ্যানালিটিক্স ইঞ্জিন। এর মূল শক্তিগুলি হলো:
- গতি: এটি গতির জন্য ডিজাইন করা হয়েছে, যা মিলি সেকেন্ডের মধ্যে বিশাল ডেটাসেট থেকে সার্চ ফলাফল ফিরিয়ে দিতে সক্ষম।
- স্কেলেবিলিটি: এটি অনুভূমিকভাবে স্কেলযোগ্য। আপনি একটি নোড দিয়ে শুরু করতে পারেন এবং আপনার ডেটা ও কোয়েরি ভলিউম বাড়ার সাথে সাথে শত শত নোডে স্কেল করতে পারেন।
- ফুল-টেক্সট সার্চ: এটি অত্যাধুনিক ফুল-টেক্সট সার্চে পারদর্শী, টাইপো, সমার্থক শব্দ, ভাষা-নির্দিষ্ট বিশ্লেষণ এবং প্রাসঙ্গিকতা স্কোরিং বক্সের বাইরেও পরিচালনা করে।
- অ্যানালিটিক্স: এটি শক্তিশালী অ্যাগ্রিগেশন ক্ষমতা প্রদান করে, যা আপনাকে ট্রেন্ড এবং ইনসাইট উন্মোচন করতে আপনার ডেটা ভাগ করতে এবং বিশ্লেষণ করতে দেয়।
- নমনীয়তা: ডকুমেন্ট-ভিত্তিক এবং স্কিমা-নমনীয় হওয়ায়, এটি জটিল, অসংগঠিত JSON ডকুমেন্ট সংরক্ষণ এবং ইনডেক্স করতে পারে।
অন্যদিকে, পাইথন তার সরলতা, পঠনযোগ্যতা এবং লাইব্রেরিগুলির বিশাল ইকোসিস্টেমের জন্য বিখ্যাত। এই অংশীদারিত্বে এর ভূমিকা হল বহুমুখী অর্কেস্ট্রেটর হওয়া:
- দ্রুত উন্নয়ন: পাইথনের পরিষ্কার সিনট্যাক্স ডেভেলপারদের দ্রুত অ্যাপ্লিকেশন তৈরি এবং প্রোটোটাইপ করতে সাহায্য করে।
- ডেটা সায়েন্স ও এআই হাব: এটি ডেটা সায়েন্স, মেশিন লার্নিং এবং এআই-এর জন্য ডি ফ্যাক্টো ভাষা, যা প্রক্রিয়াজাত ডেটা ইলাস্টিকসার্চের মতো অ্যানালিটিক্যাল ইঞ্জিনে ফিড করার প্রয়োজন এমন অ্যাপ্লিকেশনগুলির জন্য এটিকে একটি স্বাভাবিক পছন্দ করে তোলে।
- শক্তিশালী ওয়েব ফ্রেমওয়ার্ক: জ্যাঙ্গো, ফ্লাস্ক এবং ফাস্টএপিআই-এর মতো ফ্রেমওয়ার্কগুলি ওয়েব পরিষেবা এবং এপিআই তৈরির জন্য নিখুঁত ভিত্তি প্রদান করে যা ব্যাকএন্ডে ইলাস্টিকসার্চের সাথে ইন্টারঅ্যাক্ট করে।
- শক্তিশালী কমিউনিটি এবং অফিসিয়াল ক্লায়েন্ট: একটি সু-রক্ষণাবেক্ষণ করা অফিসিয়াল ক্লায়েন্ট,
elasticsearch-py, এর অস্তিত্ব ইন্টিগ্রেশনকে নির্বিঘ্ন এবং নির্ভরযোগ্য করে তোলে।
একসাথে, তারা ডেভেলপারদের উন্নত সার্চ ক্ষমতা সহ অত্যাধুনিক অ্যাপ্লিকেশন তৈরি করতে সক্ষম করে, যেমন লগ মনিটরিং ড্যাশবোর্ড, ই-কমার্স পণ্য ক্যাটালগ, কন্টেন্ট ডিসকভারি প্ল্যাটফর্ম এবং বিজনেস ইন্টেলিজেন্স টুলস।
আপনার বৈশ্বিক উন্নয়ন পরিবেশ সেট আপ করা
শুরু করতে, আমাদের দুটি উপাদান প্রয়োজন: একটি চলমান ইলাস্টিকসার্চ ইনস্ট্যান্স এবং পাইথন ক্লায়েন্ট লাইব্রেরি। আমরা প্ল্যাটফর্ম-অ্যাগনস্টিক পদ্ধতিগুলির উপর মনোযোগ দেবো, যা বিশ্বের যেকোনো স্থানের ডেভেলপারদের জন্য কাজ করে তা নিশ্চিত করবে।
1. ডকার দিয়ে ইলাস্টিকসার্চ চালানো
যদিও আপনি বিভিন্ন অপারেটিং সিস্টেমে সরাসরি ইলাস্টিকসার্চ ইনস্টল করতে পারেন, ডকার ব্যবহার করা সবচেয়ে সহজবোধ্য এবং প্রজননযোগ্য পদ্ধতি, যা OS-নির্দিষ্ট জটিলতাগুলিকে দূর করে।
প্রথমে, আপনার মেশিনে ডকার ইনস্টল করা আছে তা নিশ্চিত করুন। তারপরে, আপনি একটি একক কমান্ড দিয়ে উন্নয়নের জন্য একটি একক-নোড ইলাস্টিকসার্চ ক্লাস্টার চালাতে পারেন:
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:8.10.4
আসুন এই কমান্ডটি বিশ্লেষণ করি:
-p 9200:9200: এটি আপনার স্থানীয় মেশিনের পোর্ট 9200 কে ডকার কন্টেইনারের ভিতরে পোর্ট 9200 এ ম্যাপ করে। এটি REST API-এর জন্য পোর্ট।-e "discovery.type=single-node": এটি ইলাস্টিকসার্চকে একক-নোড মোডে শুরু করতে বলে, যা স্থানীয় উন্নয়নের জন্য উপযুক্ত।docker.elastic.co/elasticsearch/elasticsearch:8.10.4: এটি অফিসিয়াল ইলাস্টিকসার্চ ইমেজ এবং একটি নির্দিষ্ট সংস্করণ নির্দিষ্ট করে। অপ্রত্যাশিত পরিবর্তন এড়াতে সংস্করণটি পিন করা সর্বদা একটি ভাল অনুশীলন।
আপনি যখন এটি প্রথমবার চালাবেন, ডকার ইমেজটি ডাউনলোড করবে। স্টার্টআপে, ইলাস্টিকসার্চ অন্তর্নির্মিত elastic ব্যবহারকারীর জন্য একটি পাসওয়ার্ড এবং একটি এনরোলমেন্ট টোকেন তৈরি করবে। জেনারেট করা পাসওয়ার্ডটি কপি করে কোথাও নিরাপদে সংরক্ষণ করতে ভুলবেন না। আপনার পাইথন ক্লায়েন্ট থেকে সংযোগ করতে এটি আপনার প্রয়োজন হবে।
ইলাস্টিকসার্চ চলছে কিনা তা যাচাই করতে, আপনার ওয়েব ব্রাউজার খুলুন অথবা curl এর মতো একটি টুল ব্যবহার করে http://localhost:9200 অ্যাক্সেস করুন। যেহেতু নিরাপত্তা ডিফল্টভাবে সক্ষম, এটি একটি ব্যবহারকারীর নাম (elastic) এবং আপনি সবেমাত্র সংরক্ষণ করা পাসওয়ার্ডের জন্য অনুরোধ করবে। আপনি আপনার ক্লাস্টার সম্পর্কে তথ্য সহ একটি JSON প্রতিক্রিয়া দেখতে পাবেন।
2. পাইথন ইলাস্টিকসার্চ ক্লায়েন্ট ইনস্টল করা
পাইথন কমিউনিটিতে প্রকল্প নির্ভরতাগুলি পরিচালনা করার জন্য ভার্চুয়াল পরিবেশ ব্যবহার করা একটি শক্তিশালী সেরা অনুশীলন। এটি প্রকল্পগুলির মধ্যে বিরোধ এড়ায়।
প্রথমে, একটি ভার্চুয়াল পরিবেশ তৈরি এবং সক্রিয় করুন:
# Create a virtual environment
python -m venv venv
# Activate it (syntax differs by OS)
# On macOS/Linux:
source venv/bin/activate
# On Windows:
.\venv\Scripts\activate
এখন, আপনার ভার্চুয়াল পরিবেশ সক্রিয় থাকাকালীন, pip ব্যবহার করে অফিসিয়াল ক্লায়েন্ট লাইব্রেরি ইনস্টল করুন:
pip install elasticsearch
এই কমান্ডটি elasticsearch-py লাইব্রেরি ইনস্টল করে, যা আমরা আমাদের ইলাস্টিকসার্চ ক্লাস্টারের সাথে সমস্ত ইন্টারঅ্যাকশনের জন্য ব্যবহার করব।
ইলাস্টিকসার্চের সাথে একটি সুরক্ষিত সংযোগ স্থাপন
সেটআপ সম্পূর্ণ হওয়ার পর, ক্লাস্টারে সংযোগ করার জন্য আমাদের প্রথম পাইথন স্ক্রিপ্টটি লিখি। আপনার পরিবেশের (স্থানীয় উন্নয়ন, ক্লাউড ডিপ্লয়মেন্ট ইত্যাদি) উপর নির্ভর করে ক্লায়েন্টকে বিভিন্ন উপায়ে কনফিগার করা যেতে পারে।
একটি স্থানীয়, সুরক্ষিত ইনস্ট্যান্সে সংযোগ করা
যেহেতু ইলাস্টিকসার্চের আধুনিক সংস্করণগুলিতে ডিফল্টভাবে নিরাপত্তা সক্ষম করা থাকে, তাই আপনাকে ক্রেডেনশিয়াল প্রদান করতে হবে। এছাড়াও আপনি স্থানীয় উন্নয়নের জন্য একটি সেলফ-সাইনড সার্টিফিকেট ব্যবহার করছেন, যার জন্য কিছুটা অতিরিক্ত কনফিগারেশন প্রয়োজন।
connect.py নামের একটি ফাইল তৈরি করুন:
from elasticsearch import Elasticsearch
# You might need to adjust the host and port if you are not running on localhost
# Replace 'your_password' with the password generated by Elasticsearch on startup
ES_PASSWORD = "your_password"
# Create the client instance
client = Elasticsearch(
"http://localhost:9200",
basic_auth=("elastic", ES_PASSWORD)
)
# Successful response!
print("Successfully connected to Elasticsearch!")
# You can also get cluster information
cluster_info = client.info()
print(f"Cluster Name: {cluster_info['cluster_name']}")
print(f"Elasticsearch Version: {cluster_info['version']['number']}")
নিরাপত্তা সম্পর্কে গুরুত্বপূর্ণ নোট: একটি প্রোডাকশন পরিবেশে, আপনার সোর্স কোডে পাসওয়ার্ডগুলি কখনও হার্ডকোড করবেন না। পরিবেশ ভেরিয়েবল, একটি সিক্রেটস ম্যানেজমেন্ট সিস্টেম (যেমন HashiCorp Vault বা AWS Secrets Manager), বা অন্যান্য নিরাপদ কনফিগারেশন পদ্ধতি ব্যবহার করুন।
একটি ক্লাউড সার্ভিসে সংযোগ করা (যেমন, ইলাস্টিক ক্লাউড)
উৎপাদন এবং স্টেজিং পরিবেশের জন্য, আপনি সম্ভবত ইলাস্টিক ক্লাউডের মতো একটি পরিচালিত পরিষেবা ব্যবহার করছেন। এটিতে সংযোগ করা আরও সহজ, কারণ এটি আপনার জন্য নিরাপত্তা এবং নেটওয়ার্কিং জটিলতাগুলি পরিচালনা করে। আপনি সাধারণত একটি ক্লাউড আইডি এবং একটি API কী ব্যবহার করে সংযোগ করেন।
from elasticsearch import Elasticsearch
# Found in the Elastic Cloud console
CLOUD_ID = "Your_Cloud_ID"
API_KEY = "Your_Encoded_API_Key"
# Create the client instance
client = Elasticsearch(
cloud_id=CLOUD_ID,
api_key=API_KEY
)
# Verify the connection
if client.ping():
print("Successfully connected to Elastic Cloud!")
else:
print("Could not connect to Elastic Cloud.")
এই পদ্ধতিটি অত্যন্ত সুপারিশ করা হয় কারণ এটি নিরাপদ এবং অন্তর্নিহিত হোস্ট URL গুলিকে অ্যাবস্ট্রাক্ট করে।
মূল ধারণা: ইনডেক্স, ডকুমেন্ট এবং ইনডেক্সিং
আমরা ডেটা সার্চ করার আগে, আমাদের ইলাস্টিকসার্চে কিছু ডেটা রাখতে হবে। আসুন কিছু মূল পরিভাষা স্পষ্ট করি।
- ডকুমেন্ট: তথ্যের মৌলিক একক যা ইনডেক্স করা যায়। এটি একটি JSON অবজেক্ট। এটিকে একটি ডেটাবেস টেবিলের একটি সারির মতো ভাবুন।
- ইনডেক্স: ডকুমেন্টগুলির একটি সংগ্রহ যা মোটামুটি একই রকম বৈশিষ্ট্যযুক্ত। এটিকে একটি রিলেশনাল ডেটাবেসের একটি টেবিলের মতো ভাবুন।
- ইনডেক্সিং: একটি ইনডেক্সে একটি ডকুমেন্ট যোগ করার প্রক্রিয়া। একবার ইনডেক্স করা হলে, একটি ডকুমেন্ট সার্চ করা যায়।
একটি একক ডকুমেন্ট ইনডেক্স করা
index পদ্ধতিটি একটি নির্দিষ্ট ইনডেক্সে একটি ডকুমেন্ট যোগ বা আপডেট করতে ব্যবহৃত হয়। যদি ইনডেক্সটি বিদ্যমান না থাকে, ইলাস্টিকসার্চ ডিফল্টভাবে এটি স্বয়ংক্রিয়ভাবে তৈরি করবে।
আসুন একটি বই সম্পর্কে একটি ডকুমেন্ট ইনডেক্স করার জন্য indexing_single.py নামে একটি স্ক্রিপ্ট তৈরি করি।
from elasticsearch import Elasticsearch
ES_PASSWORD = "your_password"
client = Elasticsearch(
"http://localhost:9200",
basic_auth=("elastic", ES_PASSWORD)
)
# Define the index name
index_name = "books"
# The document to be indexed
document = {
"title": "The Hitchhiker's Guide to the Galaxy",
"author": "Douglas Adams",
"publication_year": 1979,
"genre": "Science Fiction",
"summary": "A comedic science fiction series following the adventures of the last surviving man, Arthur Dent."
}
# Index the document
# We can provide a specific ID, or let Elasticsearch generate one
response = client.index(index=index_name, id=1, document=document)
print(f"Indexed document with ID 1. Result: {response['result']}")
আপনি যখন এই স্ক্রিপ্টটি চালাবেন, তখন এটি `books` নামে একটি ইনডেক্স তৈরি করবে (যদি এটি ইতিমধ্যেই বিদ্যমান না থাকে) এবং `1` আইডি সহ ডকুমেন্টটি যোগ করবে। আপনি যদি এটি আবার চালান, তবে এটি একই বিষয়বস্তু সহ বিদ্যমান ডকুমেন্ট `1` আপডেট করবে, এর সংস্করণ সংখ্যা বৃদ্ধি করবে।
উচ্চ কার্যকারিতার জন্য বাল্ক ইনডেক্সিং
প্রতিটি অনুরোধের নেটওয়ার্ক ওভারহেডের কারণে ডকুমেন্টগুলি একে একে ইনডেক্স করা অদক্ষ। যেকোনো বাস্তব-বিশ্ব অ্যাপ্লিকেশনের জন্য, আপনার বাল্ক এপিআই ব্যবহার করা উচিত। পাইথন ক্লায়েন্ট এর জন্য একটি সুবিধাজনক সহায়ক ফাংশন প্রদান করে।
আসুন ডকুমেন্টগুলির একটি তালিকা ইনডেক্স করার জন্য indexing_bulk.py নামে একটি স্ক্রিপ্ট তৈরি করি।
from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk
ES_PASSWORD = "your_password"
client = Elasticsearch(
"http://localhost:9200",
basic_auth=("elastic", ES_PASSWORD)
)
index_name = "books"
# A list of documents
documents = [
{
"_id": 2,
"title": "1984",
"author": "George Orwell",
"publication_year": 1949,
"genre": "Dystopian",
"summary": "A novel about the dangers of totalitarianism."
},
{
"_id": 3,
"title": "Pride and Prejudice",
"author": "Jane Austen",
"publication_year": 1813,
"genre": "Romance",
"summary": "A classic romance novel focusing on character development and social commentary."
},
{
"_id": 4,
"title": "To Kill a Mockingbird",
"author": "Harper Lee",
"publication_year": 1960,
"genre": "Classic",
"summary": "A novel about innocence, injustice, and racism in the American South."
}
]
# Prepare actions for the bulk helper
def generate_actions(docs):
for doc in docs:
yield {
"_index": index_name,
"_id": doc["_id"],
"_source": {
"title": doc["title"],
"author": doc["author"],
"publication_year": doc["publication_year"],
"genre": doc["genre"],
"summary": doc["summary"],
}
}
# Perform the bulk indexing
success, failed = bulk(client, generate_actions(documents))
print(f"Successfully indexed {success} documents.")
if failed:
print(f"Failed to index {len(failed)} documents.")
এই পদ্ধতিটি উল্লেখযোগ্যভাবে দ্রুত, কারণ এটি একটি একক API কলে ইলাস্টিকসার্চে একাধিক ডকুমেন্ট পাঠায়, যা বিশাল ডেটাসেট ইনডেক্স করার জন্য অপরিহার্য।
শক্তিশালী সার্চ তৈরি করা: দ্য কোয়েরি ডিএসএল
এখন যেহেতু আমাদের ইনডেক্সে ডেটা আছে, আমরা সার্চ শুরু করতে পারি। ইলাস্টিকসার্চ একটি সমৃদ্ধ, JSON-ভিত্তিক কোয়েরি ডোমেন-নির্দিষ্ট ভাষা (DSL) প্রদান করে যা আপনাকে সাধারণ টেক্সট সার্চ থেকে শুরু করে জটিল, বহু-স্তরীয় কোয়েরি পর্যন্ত সবকিছু তৈরি করতে দেয়।
সমস্ত সার্চ অপারেশন ক্লায়েন্টের search পদ্ধতি ব্যবহার করে সম্পাদিত হয়।
বেসিক সার্চ: সমস্ত ডকুমেন্ট পুনরুদ্ধার করা
সবচেয়ে সহজ কোয়েরি হল `match_all`, যা নাম থেকেই বোঝা যায়, একটি ইনডেক্সের সমস্ত ডকুমেন্টকে মেলে।
response = client.search(
index="books",
query={
"match_all": {}
}
)
print(f"Found {response['hits']['total']['value']} books.")
for hit in response['hits']['hits']:
print(f"- {hit['_source']['title']} by {hit['_source']['author']}")
ফুল-টেক্সট সার্চ: `match` কোয়েরি
এটি ফুল-টেক্সট সার্চের কর্মশক্তি। `match` কোয়েরি সার্চ স্ট্রিং এবং ইনডেক্স করা টেক্সট বিশ্লেষণ করে প্রাসঙ্গিক ডকুমেন্ট খুঁজে বের করে। উদাহরণস্বরূপ, "adventures in galaxy" এর জন্য সার্চ করলে সম্ভবত আমাদের প্রথম বই, "The Hitchhiker's Guide to the Galaxy" এর সাথে মিলবে, কারণ টেক্সটটি টোকেনাইজড (শব্দে বিভক্ত), লোয়ারকেস করা এবং সাধারণ শব্দ (যেমন "in") প্রায়শই উপেক্ষা করা হয়।
response = client.search(
index="books",
query={
"match": {
"summary": "adventures galaxy"
}
}
)
print("--- Search results for 'adventures galaxy' in summary ---")
for hit in response['hits']['hits']:
print(f"Found: {hit['_source']['title']} (Score: {hit['_score']})")
আউটপুটে `_score` লক্ষ্য করুন। এটি ইলাস্টিকসার্চ দ্বারা গণনা করা একটি প্রাসঙ্গিকতা স্কোর, যা নির্দেশ করে যে ডকুমেন্টটি কোয়েরির সাথে কতটা ভালভাবে মেলে।
স্ট্রাকচার্ড সার্চ: `term` কোয়েরি
কখনও কখনও আপনাকে একটি সঠিক মানের জন্য সার্চ করতে হয়, বিশ্লেষণ করা টেক্সটের জন্য নয়। উদাহরণস্বরূপ, একটি নির্দিষ্ট জেনারে বা প্রকাশের বছর দ্বারা ফিল্টার করা। এখানেই `term` কোয়েরিগুলি ব্যবহার করা হয়। তারা সঠিক টার্মের জন্য খোঁজে এবং ইনপুট বিশ্লেষণ করে না।
এটি একটি গুরুত্বপূর্ণ পার্থক্য: `summary` বা `title` এর মতো ফুল-টেক্সট ক্ষেত্রগুলির জন্য match ব্যবহার করুন, এবং ট্যাগ, আইডি বা স্ট্যাটাস কোডের মতো কিওয়ার্ড-সদৃশ ক্ষেত্রগুলির জন্য term ব্যবহার করুন।
# Find all books in the 'Dystopian' genre
response = client.search(
index="books",
query={
"term": {
"genre.keyword": "Dystopian" # Note the .keyword suffix
}
}
)
print("--- Dystopian Books ---")
for hit in response['hits']['hits']:
print(hit['_source']['title'])
`.keyword` সম্পর্কে একটি দ্রুত নোট: ডিফল্টভাবে, ইলাস্টিকসার্চ একটি টেক্সট ক্ষেত্রের দুটি সংস্করণ তৈরি করে: একটি `analyzed` সংস্করণ (ফুল-টেক্সট সার্চের জন্য) এবং একটি `keyword` সংস্করণ যা টেক্সটটিকে একটি একক, সঠিক স্ট্রিং হিসাবে সংরক্ষণ করে। যখন আপনি একটি সঠিক স্ট্রিং মানের উপর ফিল্টার বা অ্যাগ্রিগেট করতে চান, তখন আপনার `.keyword` সাফিক্স ব্যবহার করা উচিত।
`bool` কোয়েরি দিয়ে কোয়েরি একত্রিত করা
বাস্তব-বিশ্বের সার্চগুলি খুব কমই সহজ হয়। আপনাকে প্রায়শই একাধিক মাপকাঠি একত্রিত করতে হয়। `bool` (বুলিয়ান) কোয়েরি এটি করার উপায়। এটির চারটি প্রধান ধারা রয়েছে:
must: এই বিভাগের সমস্ত ধারা অবশ্যই মিলতে হবে। তারা প্রাসঙ্গিকতা স্কোরে অবদান রাখে। (`AND` এর সমতুল্য)।should: এই বিভাগের ধারাগুলির মধ্যে অন্তত একটি মিলতে হবে। তারা প্রাসঙ্গিকতা স্কোরে অবদান রাখে। (`OR` এর সমতুল্য)।must_not: এই বিভাগের সমস্ত ধারা মিলতে পারবে না। (`NOT` এর সমতুল্য)।filter: এই বিভাগের সমস্ত ধারা অবশ্যই মিলতে হবে, তবে তারা একটি নন-স্কোরিং, ক্যাশিং-বান্ধব প্রসঙ্গে সম্পাদিত হয়। এটি সঠিক-মিল ফিল্টারিংয়ের (যেমন `term` কোয়েরি) জন্য আদর্শ এবং কার্যকারিতা উল্লেখযোগ্যভাবে উন্নত করে।
আসুন একটি বই খুঁজে বের করি যা একটি 'ক্লাসিক' কিন্তু 1950 সালের পরে প্রকাশিত হয়েছিল।
response = client.search(
index="books",
query={
"bool": {
"must": [
{"match": {"genre": "Classic"}}
],
"filter": [
{
"range": {
"publication_year": {
"gt": 1950 # gt means 'greater than'
}
}
}
]
}
}
)
print("--- Classics published after 1950 ---")
for hit in response['hits']['hits']:
print(f"{hit['_source']['title']} ({hit['_source']['publication_year']})")
এখানে, আমরা প্রাসঙ্গিকতার জন্য `must` ধারায় `match` কোয়েরি ব্যবহার করেছি এবং দক্ষ, নন-স্কোরিং ফিল্টারিংয়ের জন্য একটি `filter` ধারার ভিতরে `range` কোয়েরি ব্যবহার করেছি।
পেজিনেশন এবং সর্টিং
ডিফল্টভাবে, ইলাস্টিকসার্চ শীর্ষ 10টি ফলাফল প্রদান করে। পেজিনেশন বাস্তবায়ন করতে, আপনি `from` এবং `size` প্যারামিটার ব্যবহার করতে পারেন।
size: ফিরিয়ে দেওয়া হিটগুলির সংখ্যা (যেমন, পৃষ্ঠার আকার)।from: শুরুর অফসেট (যেমন, `(page_number - 1) * size`)।
আপনি এক বা একাধিক ক্ষেত্র দ্বারা ফলাফলগুলি সাজাতেও পারেন।
# Get the first 2 books, sorted by publication year in ascending order
response = client.search(
index="books",
query={"match_all": {}},
size=2,
from_=0,
sort=[
{
"publication_year": {
"order": "asc" # 'asc' for ascending, 'desc' for descending
}
}
]
)
print("--- First 2 books sorted by publication year ---")
for hit in response['hits']['hits']:
print(f"{hit['_source']['title']} ({hit['_source']['publication_year']})")
আপনার ডেটা পরিচালনা: আপডেট এবং ডিলিট অপারেশন
আপনার ডেটা স্থির নয়। আপনার অ্যাপ্লিকেশন বিকশিত হওয়ার সাথে সাথে আপনাকে ডকুমেন্টগুলি আপডেট এবং ডিলিট করতে হবে।
একটি ডকুমেন্ট আপডেট করা
আপনি `update` পদ্ধতি ব্যবহার করে একটি ডকুমেন্ট আপডেট করতে পারেন। আপনি যদি শুধুমাত্র কয়েকটি ক্ষেত্র পরিবর্তন করেন তবে এটি পুরো ডকুমেন্টটি পুনরায় ইনডেক্স করার চেয়ে বেশি কার্যকর।
# Let's add a list of tags to our '1984' book (ID 2)
client.update(
index="books",
id=2,
doc={
"tags": ["political fiction", "social science fiction"]
}
)
print("Document 2 updated.")
একটি ডকুমেন্ট ডিলিট করা
একটি ডকুমেন্ট সরাতে, ইনডেক্সের নাম এবং ডকুমেন্ট আইডি সহ `delete` পদ্ধতি ব্যবহার করুন।
# Let's say we want to delete 'Pride and Prejudice' (ID 3)
response = client.delete(index="books", id=3)
if response['result'] == 'deleted':
print("Document 3 successfully deleted.")
একটি সম্পূর্ণ ইনডেক্স ডিলিট করা
সতর্কতা: এই অপারেশনটি অপরিবর্তনীয়! একটি ইনডেক্স ডিলিট করার সময় খুব সতর্ক থাকুন, কারণ এর সমস্ত ডেটা স্থায়ীভাবে হারিয়ে যাবে।
# To delete the entire 'books' index
# client.indices.delete(index="books")
# print("Index 'books' deleted.")
শক্তিশালী, বৈশ্বিক অ্যাপ্লিকেশনগুলির জন্য সেরা অনুশীলনগুলি
একটি সাধারণ স্ক্রিপ্ট তৈরি করা এক জিনিস; একটি প্রোডাকশন-রেডি অ্যাপ্লিকেশন তৈরি করা অন্য জিনিস। এখানে কিছু সেরা অনুশীলন রয়েছে যা মনে রাখতে হবে।
- সুরুচিপূর্ণ ত্রুটি হ্যান্ডলিং: নেটওয়ার্ক সংযোগ ব্যর্থ হতে পারে এবং ডকুমেন্টগুলি খুঁজে পাওয়া নাও যেতে পারে। লাইব্রেরি থেকে নির্দিষ্ট ব্যতিক্রমগুলি হ্যান্ডেল করতে আপনার ক্লায়েন্ট কলগুলিকে `try...except` ব্লকে আবদ্ধ করুন, যেমন
elasticsearch.ConnectionErrorবাelasticsearch.NotFoundError। - কনফিগারেশন ম্যানেজমেন্ট: যেমন উল্লেখ করা হয়েছে, ক্রেডেনশিয়াল বা হোস্টনামগুলি কখনও হার্ডকোড করবেন না। একটি শক্তিশালী কনফিগারেশন সিস্টেম ব্যবহার করুন যা পরিবেশ ভেরিয়েবল বা একটি ডেডিকেটেড কনফিগারেশন ফাইল থেকে পড়ে। বিভিন্ন পরিবেশে (উন্নয়ন, স্টেজিং, প্রোডাকশন) আপনার অ্যাপ্লিকেশন স্থাপন করার জন্য এটি অত্যন্ত গুরুত্বপূর্ণ।
- সুনির্দিষ্ট ম্যাপিং: যদিও ইলাস্টিকসার্চ আপনার ক্ষেত্রগুলির ডেটা প্রকারগুলি অনুমান করতে পারে (ডাইনামিক ম্যাপিং নামক একটি প্রক্রিয়া), প্রোডাকশনে একটি সুনির্দিষ্ট ম্যাপিং সংজ্ঞায়িত করা একটি সেরা অনুশীলন। একটি ম্যাপিং আপনার ইনডেক্সের জন্য একটি স্কিমা সংজ্ঞার মতো। এটি আপনাকে প্রতিটি ক্ষেত্র কীভাবে ইনডেক্স করা হয় তা সঠিকভাবে নিয়ন্ত্রণ করতে দেয়, যা কার্যকারিতা, স্টোরেজ অপ্টিমাইজেশন এবং বহু-ভাষা বিশ্লেষণের মতো উন্নত বৈশিষ্ট্যগুলির জন্য অত্যন্ত গুরুত্বপূর্ণ।
- ক্লায়েন্ট ইনস্ট্যানসিয়েশন: আপনার অ্যাপ্লিকেশনটির জীবনচক্রের জন্য `Elasticsearch` ক্লায়েন্টের একটি একক, দীর্ঘস্থায়ী ইনস্ট্যান্স তৈরি করুন। ক্লায়েন্ট তার নিজস্ব সংযোগ পুল পরিচালনা করে এবং প্রতিটি অনুরোধের জন্য নতুন ইনস্ট্যান্স তৈরি করা অত্যন্ত অদক্ষ।
- লগিং: একটি কেন্দ্রীভূত উপায়ে অনুরোধ, প্রতিক্রিয়া এবং সম্ভাব্য সমস্যাগুলি নিরীক্ষণের জন্য আপনার অ্যাপ্লিকেশনটির লগিং ফ্রেমওয়ার্কের সাথে ইলাস্টিকসার্চ ক্লায়েন্টের লগিংকে একত্রিত করুন।
উপসংহার: আপনার যাত্রা এখন শুরু হচ্ছে
আমরা পাইথন-ইলাস্টিকসার্চ অংশীদারিত্বের মৌলিক 'কেন' থেকে শুরু করে এটি বাস্তবায়নের ব্যবহারিক 'কীভাবে' পর্যন্ত যাত্রা করেছি। আপনি আপনার পরিবেশ সেট আপ করতে, নিরাপদে সংযোগ করতে, স্বতন্ত্রভাবে এবং বাল্কে ডেটা ইনডেক্স করতে এবং কোয়েরি ডিএসএল ব্যবহার করে বিভিন্ন শক্তিশালী সার্চ কোয়েরি তৈরি করতে শিখেছেন। আপনি এখন আপনার পাইথন অ্যাপ্লিকেশনগুলিতে একটি বিশ্ব-মানের সার্চ ইঞ্জিনকে একত্রিত করার জন্য মূল দক্ষতা দিয়ে সজ্জিত।
এটি কেবল শুরু। ইলাস্টিকসার্চের বিশ্ব বিশাল এবং শক্তিশালী বৈশিষ্ট্যে পূর্ণ যা অন্বেষণের অপেক্ষায় রয়েছে। আমরা আপনাকে আরও গভীরে ডুব দিতে উৎসাহিত করি:
- অ্যাগ্রিগেশন: জটিল ডেটা বিশ্লেষণ এবং ড্যাশবোর্ড তৈরির জন্য।
- আরও উন্নত কোয়েরি: যেমন `multi_match`, `should` সহ `bool`, এবং ফাংশন স্কোর কোয়েরি প্রাসঙ্গিকতা সূক্ষ্ম-সমন্বয় করার জন্য।
- ভাষা অ্যানালাইজার: নির্দিষ্ট মানব ভাষার জন্য সার্চ অপ্টিমাইজ করার জন্য, বৈশ্বিক অ্যাপ্লিকেশনগুলির জন্য একটি গুরুত্বপূর্ণ বৈশিষ্ট্য।
- সম্পূর্ণ ইলাস্টিক স্ট্যাক: ভিজ্যুয়ালাইজেশনের জন্য কিবানা এবং ডেটা ইনজেশনের জন্য লগস্ট্যাশ/বিটস সহ।
পাইথন এবং ইলাস্টিকসার্চের ক্ষমতা ব্যবহার করে, আপনি দ্রুততর, স্মার্ট এবং আরও অন্তর্দৃষ্টিপূর্ণ অ্যাপ্লিকেশন তৈরি করতে পারেন যা ব্যতিক্রমী ব্যবহারকারীর অভিজ্ঞতা প্রদান করে। শুভ অনুসন্ধান!