Apache Lucene হল একটি শক্তিশালী ওপেন সোর্স তথ্য অনুসন্ধান লাইব্রেরি যা টেক্সট ডেটা ইন্ডেক্সিং এবং অনুসন্ধানের জন্য ব্যবহৃত হয়। এটি বিশেষভাবে দ্রুত এবং নির্ভুল অনুসন্ধান ইঞ্জিন তৈরি করতে সক্ষম। Lucene এর মাধ্যমে ডকুমেন্ট ইন্ডেক্স এবং সেগুলির মধ্যে অনুসন্ধান পরিচালনা করা যায়।
IndexWriter হল Lucene এর একটি ক্লাস যা ডকুমেন্ট ইন্ডেক্সিংয়ের জন্য ব্যবহৃত হয়। এটি ডকুমেন্ট তৈরি, আপডেট এবং মুছে ফেলার কাজ সম্পন্ন করে।
এই টিউটোরিয়ালে, আমরা IndexWriter ব্যবহার করে কিভাবে ডকুমেন্ট ম্যানেজমেন্ট করা যায় তা উদাহরণের মাধ্যমে দেখবো। আমরা একটি ইন্ডেক্স তৈরি করবো, ডকুমেন্ট যুক্ত করবো, এবং সেই ডকুমেন্ট থেকে অনুসন্ধান করবো।
১. Lucene IndexWriter কনফিগারেশন
Lucene ইন্ডেক্স তৈরি এবং পরিচালনা করার জন্য IndexWriter ব্যবহৃত হয়। প্রথমে, আপনাকে Lucene এর ডিপেনডেন্সি pom.xml ফাইলে যুক্ত করতে হবে।
Maven Dependency for Lucene:
<dependencies>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>8.11.0</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>8.11.0</version>
</dependency>
</dependencies>
এখানে, lucene-core এবং lucene-analyzers-common ডিপেনডেন্সি যুক্ত করা হয়েছে, যা ইন্ডেক্সিং এবং অনুসন্ধানের জন্য প্রয়োজনীয়।
২. IndexWriter ব্যবহার করে ডকুমেন্ট ইন্ডেক্সিং
এখন, IndexWriter ব্যবহার করে আমরা Lucene ইন্ডেক্স তৈরি করবো এবং ডকুমেন্ট যোগ করবো। এটি মূলত IndexWriterConfig এবং Analyzer এর মাধ্যমে কনফিগার করা হয়।
উদাহরণ: IndexWriter দিয়ে ডকুমেন্ট ইন্ডেক্স করা
import org.apache.lucene.analysis.standard.StandardAnalyzer;
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.RAMDirectory;
public class LuceneIndexer {
public static void main(String[] args) throws Exception {
// RAM-based directory (in-memory index)
Directory directory = new RAMDirectory();
// Standard analyzer for indexing
StandardAnalyzer analyzer = new StandardAnalyzer();
// IndexWriterConfig for IndexWriter initialization
IndexWriterConfig config = new IndexWriterConfig(analyzer);
// Creating IndexWriter
IndexWriter writer = new IndexWriter(directory, config);
// Creating a document
Document doc = new Document();
doc.add(new TextField("title", "Lucene in Action", Field.Store.YES));
doc.add(new TextField("content", "This is a book about Lucene.", Field.Store.YES));
// Adding document to index
writer.addDocument(doc);
// Committing changes
writer.commit();
// Closing the writer
writer.close();
}
}
এখানে, আমরা RAMDirectory ব্যবহার করেছি যা ইন-মেমরি ডিরেক্টরি তৈরি করে। এতে ডেটা দ্রুত ইনডেক্স করা যায়, এবং এটি টেম্পোরারি, ইন-মেমরি ইন্ডেক্সের জন্য উপযুক্ত।
Document ক্লাসের মাধ্যমে একটি নতুন ডকুমেন্ট তৈরি করা হয় এবং TextField এর মাধ্যমে ডকুমেন্টের ক্ষেত্র (ফিল্ড) যোগ করা হয়। writer.addDocument(doc) দ্বারা ডকুমেন্টটি ইন্ডেক্সে যুক্ত করা হয়।
৩. IndexWriter এর মাধ্যমে ডকুমেন্ট আপডেট এবং মুছে ফেলা
Lucene এ ডকুমেন্ট আপডেট এবং মুছে ফেলা যায়। IndexWriter ক্লাসের মাধ্যমে এই কার্যাবলী করা হয়।
উদাহরণ: ডকুমেন্ট আপডেট এবং মুছে ফেলা
import org.apache.lucene.index.Term;
public class LuceneUpdateDelete {
public static void main(String[] args) throws Exception {
// In-memory index directory
Directory directory = new RAMDirectory();
StandardAnalyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
// Create an IndexWriter
IndexWriter writer = new IndexWriter(directory, config);
// Adding a document
Document doc = new Document();
doc.add(new TextField("title", "Lucene in Action", Field.Store.YES));
doc.add(new TextField("content", "This is a book about Lucene.", Field.Store.YES));
writer.addDocument(doc);
writer.commit();
// Updating a document with new content
Document updatedDoc = new Document();
updatedDoc.add(new TextField("title", "Lucene in Action - Updated", Field.Store.YES));
updatedDoc.add(new TextField("content", "This book covers advanced topics.", Field.Store.YES));
writer.updateDocument(new Term("title", "Lucene in Action"), updatedDoc);
writer.commit();
// Deleting a document by its title
writer.deleteDocuments(new Term("title", "Lucene in Action - Updated"));
writer.commit();
// Closing the writer
writer.close();
}
}
এখানে:
- updateDocument ব্যবহার করে একটি ডকুমেন্টের আপডেট করা হয়েছে যেখানে
Termএর মাধ্যমে ডকুমেন্টের ক্ষেত্রের মানের উপর ভিত্তি করে আপডেট করা হয়েছে। - deleteDocuments ব্যবহার করে ডকুমেন্ট মুছে ফেলা হয়েছে।
৪. ডকুমেন্ট অনুসন্ধান (Searching Documents)
Lucene ইন্ডেক্সিং করার পর ডকুমেন্ট অনুসন্ধান করা সহজ। আমরা IndexSearcher ব্যবহার করে ইন্ডেক্সে খোঁজা চালাতে পারি।
উদাহরণ: ইন্ডেক্স থেকে ডকুমেন্ট অনুসন্ধান
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.store.Directory;
public class LuceneSearcher {
public static void main(String[] args) throws Exception {
// In-memory index directory
Directory directory = new RAMDirectory();
StandardAnalyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter writer = new IndexWriter(directory, config);
// Creating and adding a document
Document doc = new Document();
doc.add(new TextField("title", "Lucene in Action", Field.Store.YES));
doc.add(new TextField("content", "This is a book about Lucene.", Field.Store.YES));
writer.addDocument(doc);
writer.commit();
// Searching the document
DirectoryReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
Query query = new TermQuery(new Term("title", "Lucene in Action"));
TopDocs topDocs = searcher.search(query, 10);
System.out.println("Total Hits: " + topDocs.totalHits);
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
Document d = searcher.doc(scoreDoc.doc);
System.out.println("Found Document: " + d.get("title") + " - " + d.get("content"));
}
reader.close();
writer.close();
}
}
এখানে:
- IndexSearcher ব্যবহার করে আমরা একটি
Queryএর মাধ্যমে ইন্ডেক্সে অনুসন্ধান চালিয়েছি। - TermQuery ব্যবহার করা হয়েছে যেখানে আমরা "title" ক্ষেত্র থেকে ডকুমেন্ট খুঁজেছি।
- TopDocs এবং ScoreDoc ব্যবহার করে ফলাফল প্রদর্শন করা হয়েছে।
সারাংশ
IndexWriter ক্লাস Lucene এ ডকুমেন্ট ইন্ডেক্সিং, আপডেট এবং মুছে ফেলার জন্য প্রধান সরঞ্জাম। এটি ডকুমেন্ট যোগ করতে, আপডেট করতে এবং ডিলিট করতে সাহায্য করে। ইনডেক্সিংয়ের মাধ্যমে, আমরা দ্রুত এবং দক্ষ অনুসন্ধান চালাতে পারি। Lucene ইন্ডেক্সিংয়ের মাধ্যমে আপনার টেক্সট ডেটার উপর দক্ষ অনুসন্ধান কার্যক্রম চালানো সম্ভব হয়, যা বড় ডেটাসেট এবং কাঠামোবদ্ধ ডেটা ব্যবস্থাপনায় গুরুত্বপূর্ণ।
Read more