Apache Lucene একটি ফ্রি এবং ওপেন সোর্স লাইব্রেরি যা পূর্ণাঙ্গ টেক্সট অনুসন্ধান কার্যক্রম (Full-text search) এবং ইন্ডেক্সিংয়ের জন্য ব্যবহৃত হয়। এটি বড় ডেটাসেটের মধ্যে দ্রুত এবং কার্যকরীভাবে তথ্য অনুসন্ধান করতে সক্ষম। Lucene তে Indexing এবং Searching দুটি মৌলিক কাজ, যা ত্রুটিমুক্ত এবং দ্রুত তথ্য পুনরুদ্ধারের জন্য গুরুত্বপূর্ণ।
এখানে আমরা Lucene তে Index তৈরি এবং ডকুমেন্ট যোগ করার প্রক্রিয়া সম্পর্কে বিস্তারিত আলোচনা করব।
১. Lucene Indexing Overview
Indexing হল একটি প্রক্রিয়া যার মাধ্যমে ডেটাকে একটি কাঠামোবদ্ধ আকারে সংরক্ষণ করা হয়, যাতে দ্রুত অনুসন্ধান (searching) করা যায়। Lucene এ ডেটা Document হিসেবে স্টোর হয় এবং Field এর মাধ্যমে বিভিন্ন প্রপার্টি (যেমন টেক্সট, নাম, ইত্যাদি) সংযুক্ত করা হয়। একে Index বলা হয়, যেখানে এই ডকুমেন্টগুলো এবং তাদের ফিল্ডগুলো সংরক্ষিত থাকে।
Lucene তে Indexing দুটি ধাপে সম্পন্ন হয়:
- Document Creation: প্রথমে একটি ডকুমেন্ট তৈরি করা হয়, যার মধ্যে বিভিন্ন ফিল্ড (যেমন: নাম, বিবরণ, তারিখ) থাকে।
- Document Indexing: তারপর ডকুমেন্টটিকে ইন্ডেক্সে যোগ করা হয়।
২. Lucene তে Index তৈরি করা
Lucene তে একটি ইন্ডেক্স তৈরি করতে হলে আপনাকে IndexWriter ব্যবহার করতে হবে। এটি ইন্ডেক্সে ডকুমেন্ট যোগ করার জন্য ব্যবহৃত হয়।
২.১ Lucene Index Writer Setup
প্রথমে, আপনার প্রোজেক্টে Lucene এর প্রয়োজনীয় ডিপেনডেন্সি যোগ করতে হবে। যদি Maven ব্যবহার করেন, তাহলে pom.xml এ নিচের ডিপেনডেন্সি যোগ করুন:
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>8.10.1</version>
</dependency>
২.২ Index তৈরি এবং Document যোগ করার উদাহরণ
এখন আমরা একটি উদাহরণ দেখি যেখানে একটি ইন্ডেক্স তৈরি করা হবে এবং তার মধ্যে ডকুমেন্ট যোগ করা হবে।
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import java.nio.file.Paths;
public class LuceneIndexExample {
public static void main(String[] args) {
try {
// Index Directory
Directory directory = FSDirectory.open(Paths.get("lucene_index"));
// Analyzer and IndexWriterConfig
StandardAnalyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
// IndexWriter to add documents to the index
IndexWriter writer = new IndexWriter(directory, config);
// Create a new Document
Document doc = new Document();
// Add fields to the document
doc.add(new TextField("title", "Lucene for Beginners", Field.Store.YES));
doc.add(new TextField("content", "This is an introduction to Lucene.", Field.Store.YES));
// Add the document to the index
writer.addDocument(doc);
// Commit changes and close the writer
writer.commit();
writer.close();
System.out.println("Index created and document added successfully.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
এখানে:
- StandardAnalyzer: এটি Lucene এর স্ট্যান্ডার্ড টেক্সট অ্যানালাইজার, যা টেক্সট ফিল্ডগুলোকে টোকেনাইজ এবং প্রসেস করে।
- IndexWriter: এটি ডকুমেন্টগুলো ইন্ডেক্সে যোগ করার জন্য ব্যবহৃত হয়।
- TextField: এটি টেক্সট ডেটার জন্য ফিল্ড টাইপ, যা স্টোর করা হয় এবং অনুসন্ধানযোগ্য থাকে।
- FSDirectory: এটি ফাইল সিস্টেমে একটি ডিরেক্টরি নির্দেশ করে যেখানে ইন্ডেক্স ফাইলগুলো সংরক্ষণ করা হবে।
এভাবে, Lucene তে ডকুমেন্ট তৈরি এবং ইন্ডেক্সে যোগ করা হয়।
৩. Lucene তে Document (ডকুমেন্ট) তৈরি করা
Lucene তে Document হলো এমন একটি অবজেক্ট যা বিভিন্ন ফিল্ড ধারণ করে, এবং এই ফিল্ডগুলোকে ডেটার প্রপার্টি হিসেবে ব্যবহার করা হয়। একটি ডকুমেন্টে একাধিক ফিল্ড থাকতে পারে।
৩.১ Document ফিল্ড তৈরি করা
Lucene তে Field হলো ডেটার একটি ইউনিট, যা একটি ডকুমেন্টের অংশ হিসেবে যুক্ত করা হয়। আপনি বিভিন্ন ধরনের ফিল্ড তৈরি করতে পারেন, যেমন TextField, StringField, IntField, ইত্যাদি।
// Create a Document
Document doc = new Document();
// Add a TextField (which is analyzed and tokenized)
doc.add(new TextField("title", "Lucene for Beginners", Field.Store.YES));
// Add a StringField (which is not analyzed, just stored)
doc.add(new StringField("id", "123", Field.Store.YES));
// Add an IntField (for numeric data)
doc.add(new IntField("age", 30, Field.Store.YES));
৩.২ Field Types:
- TextField: এটি সাধারণত টেক্সট ডেটার জন্য ব্যবহৃত হয়, যা অ্যানালাইজড (tokenized) হয় এবং সার্চ করা যায়।
- StringField: এটি সাধারণত স্টোর করা স্ট্রিং ডেটার জন্য ব্যবহৃত হয়, কিন্তু এটি অ্যানালাইজড হয় না।
- IntField: এটি একক পূর্ণসংখ্যা ডেটার জন্য ব্যবহৃত হয়।
- StoredField: এটি ডেটা শুধুমাত্র স্টোর করে, কিন্তু এটি সার্চযোগ্য নয়।
৪. Lucene তে Document খোঁজা (Searching)
Lucene তে তৈরি করা Index থেকে ডকুমেন্ট খুঁজতে IndexSearcher ব্যবহার করা হয়। এটি ইন্ডেক্সে থাকা ডকুমেন্টগুলির মধ্যে অনুসন্ধান করার জন্য ব্যবহৃত হয়।
৪.১ Searching Example
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.Term;
import java.nio.file.Paths;
public class LuceneSearchExample {
public static void main(String[] args) {
try {
// Open the existing index
Directory directory = FSDirectory.open(Paths.get("lucene_index"));
// Open the index reader
DirectoryReader reader = DirectoryReader.open(directory);
// Create an IndexSearcher
IndexSearcher searcher = new IndexSearcher(reader);
// Create a query (search for documents containing "Lucene")
Query query = new TermQuery(new Term("title", "Lucene"));
// Perform the search and get the top 10 hits
int hitsPerPage = 10;
TopDocs docs = searcher.search(query, hitsPerPage);
// Display the results
for (ScoreDoc scoreDoc : docs.scoreDocs) {
Document doc = searcher.doc(scoreDoc.doc);
System.out.println("Found document: " + doc.get("title"));
}
// Close the reader
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
এখানে:
- TermQuery: এটি একটি বেসিক কোয়েরি যা একটি নির্দিষ্ট টার্ম অনুসারে ডকুমেন্ট খুঁজে।
- IndexSearcher: এটি ইন্ডেক্সে অনুসন্ধান করার জন্য ব্যবহৃত হয়।
- TopDocs: এটি সেই ডকুমেন্টগুলির তালিকা ধারণ করে যা সার্চ কোয়েরি অনুসারে সেরা ফলাফল প্রদান করেছে।
সারাংশ
Lucene একটি শক্তিশালী টুল যা ডেটাকে কার্যকরভাবে ইন্ডেক্স করতে এবং দ্রুত সার্চ করতে সক্ষম। ইন্ডেক্স তৈরি এবং ডকুমেন্ট যোগ করার প্রক্রিয়া খুবই সহজ এবং দ্রুত। এখানে আমরা দেখেছি কিভাবে Lucene Index তৈরি করা হয় এবং Document এর মাধ্যমে ফিল্ড যোগ করে, তারপর সেই ডকুমেন্টগুলো সার্চ করা হয়। Lucene এর মাধ্যমে বিভিন্ন ধরনের ডেটা ম্যাপিং এবং খোঁজার প্রক্রিয়া অনেক সহজ এবং দ্রুত হয়।
Read more