Apache Lucene হল একটি শক্তিশালী, ওপেন সোর্স text search engine লাইব্রেরি যা Java প্রোগ্রামিং ভাষায় লেখা হয়েছে। এটি full-text indexing এবং searching করার জন্য ব্যবহৃত হয় এবং অত্যন্ত কার্যকরী এবং স্কেলেবল। Lucene ডেটা ইন্ডেক্সিং এবং সার্চিং এর জন্য ব্যবহারকারীকে অনেক ধরনের ফিচার প্রদান করে, যেমন searching by keywords, range searches, faceting, এবং আরও অনেক কিছু।
এই টিউটোরিয়ালে আমরা দেখব কিভাবে প্রথম Lucene প্রজেক্ট তৈরি করা যায় এবং Lucene দিয়ে টেক্সট ডকুমেন্টসের জন্য indexing এবং searching করতে হয়।
১. Lucene সেটআপ এবং প্রয়োজনীয় ডিপেনডেন্সি
Lucene ব্যবহার করতে প্রথমে আপনাকে আপনার প্রোজেক্টে Lucene এর লাইব্রেরি ডিপেনডেন্সি অন্তর্ভুক্ত করতে হবে। Maven বা Gradle এর মাধ্যমে এটি সহজেই করা যায়।
Maven ডিপেনডেন্সি:
আপনার pom.xml ফাইলে নিচের ডিপেনডেন্সি যোগ করুন:
<dependencies>
<!-- Apache Lucene Dependency -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>8.11.0</version>
</dependency>
</dependencies>
এখানে lucene-core ডিপেনডেন্সি দেওয়া হয়েছে, যা Lucene এর মূল ফিচার সরবরাহ করে।
Gradle ডিপেনডেন্সি:
যদি আপনি Gradle ব্যবহার করেন, তাহলে আপনার build.gradle ফাইলে নিচের ডিপেনডেন্সি যোগ করুন:
dependencies {
implementation 'org.apache.lucene:lucene-core:8.11.0'
}
২. Lucene ইনডেক্স তৈরি করা
Lucene এর মাধ্যমে ডেটা সার্চ করতে হলে প্রথমে একটি index তৈরি করতে হয়। এখানে, আমরা একটি সিম্পল Text ফাইলের ডেটা ইনডেক্স করব এবং পরে সেটি সার্চ করব।
উদাহরণ: ডেটা ইনডেক্সিং
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.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import java.io.IOException;
public class LuceneExample {
public static void main(String[] args) throws IOException {
// Create an in-memory index
Directory directory = new RAMDirectory();
// Create an IndexWriter
StandardAnalyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter indexWriter = new IndexWriter(directory, config);
// Create a document to index
Document doc = new Document();
doc.add(new TextField("title", "Apache Lucene Introduction", Field.Store.YES));
doc.add(new TextField("content", "Lucene is a powerful text search engine library.", Field.Store.YES));
// Add document to the index
indexWriter.addDocument(doc);
// Commit and close the writer
indexWriter.commit();
indexWriter.close();
System.out.println("Indexing complete.");
}
}
এখানে, একটি RAMDirectory ব্যবহার করা হয়েছে যা ইন-মেমরি ডিরেক্টরি হিসেবে কাজ করে, এবং IndexWriter ব্যবহার করে একটি ডকুমেন্টকে ইনডেক্স করা হয়েছে।
৩. Lucene দিয়ে সার্চ করা
একবার ইনডেক্স তৈরি হয়ে গেলে, আপনি সেই ইনডেক্সে সার্চ করতে পারেন। এখানে একটি উদাহরণ দেওয়া হলো, যেখানে title এবং content ফিল্ডে অনুসন্ধান করা হয়েছে।
উদাহরণ: ডেটা সার্চিং
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.index.IndexSearcher;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.RAMDirectory;
import java.io.IOException;
public class LuceneSearchExample {
public static void main(String[] args) throws IOException {
// Use the same directory as in the indexing example
Directory directory = new RAMDirectory();
// Create the IndexReader and IndexSearcher
DirectoryReader directoryReader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(directoryReader);
// Create a term query
Query query = new TermQuery(new Term("title", "Lucene"));
// Search the index
TopDocs topDocs = indexSearcher.search(query, 10);
// Print the results
System.out.println("Number of hits: " + topDocs.totalHits.value);
for (int i = 0; i < topDocs.scoreDocs.length; i++) {
Document document = indexSearcher.doc(topDocs.scoreDocs[i].doc);
System.out.println("Found document: " + document.get("title"));
}
// Close the IndexReader
directoryReader.close();
}
}
এখানে, TermQuery ব্যবহার করে "title" ফিল্ডে "Lucene" শব্দটি সার্চ করা হয়েছে এবং যে ডকুমেন্টে এটি পাওয়া যাবে, তার শিরোনাম print করা হয়েছে।
৪. Lucene এর মধ্যে Querying কৌশল
Lucene বিভিন্ন ধরনের কুয়েরি তৈরির জন্য অনেক ধরনের কুয়েরি ক্লাস সরবরাহ করে। কিছু সাধারণ কুয়েরি ক্লাস:
- TermQuery: একটি নির্দিষ্ট শব্দের জন্য সার্চ।
- BooleanQuery: একাধিক কুয়েরি শর্ত যোগ করার জন্য।
- PhraseQuery: একটি ফ্রেজের জন্য সার্চ।
- WildcardQuery: ওয়ার্ড প্যাটার্নের জন্য সার্চ (যেমন
*বা?ব্যবহার করে)।
উদাহরণ: BooleanQuery ব্যবহার
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.index.Term;
public class BooleanQueryExample {
public static void main(String[] args) throws IOException {
// Creating the BooleanQuery
BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.add(new TermQuery(new Term("title", "Lucene")), BooleanClause.Occur.MUST);
builder.add(new TermQuery(new Term("content", "text")), BooleanClause.Occur.MUST);
BooleanQuery query = builder.build();
// Search with BooleanQuery (similar to previous search example)
}
}
এখানে, BooleanQuery ব্যবহার করে দুটি কুয়েরি শর্ত যুক্ত করা হয়েছে: একটি "title" ফিল্ডে "Lucene" এবং অন্যটি "content" ফিল্ডে "text"। BooleanClause.Occur.MUST দ্বারা নির্ধারণ করা হয়েছে যে উভয় শর্ত অবশ্যই মেলা উচিত।
৫. Lucene এর পারফরম্যান্স অপটিমাইজেশন
Lucene এর পারফরম্যান্স উন্নত করার জন্য কিছু কৌশল:
- Use of Proper Analyzer: যথাযথ Analyzer ব্যবহার করলে সার্চের গতির উন্নতি হয়। StandardAnalyzer বা custom analyzer ব্যবহার করে ফিল্টারিং এবং tokenization কাজগুলি আরো কার্যকরী করা যায়।
- Field Stores: শুধুমাত্র প্রয়োজনীয় ফিল্ডগুলি স্টোর করুন, এটি আপনার ইনডেক্সের সাইজ কমাবে এবং দ্রুত সার্চ করতে সহায়ক হবে।
- Use of Caching: সার্চ রেজাল্টের জন্য ক্যাশিং ব্যবহার করা যায় যাতে একই কুয়েরি বারবার চালাতে না হয়।
উপসংহার
Lucene একটি শক্তিশালী টুল যা full-text search এর জন্য ব্যবহৃত হয়। এটি ইনডেক্সিং এবং সার্চিং অপারেশন দ্রুত এবং কার্যকরীভাবে পরিচালনা করতে সহায়তা করে। আপনি Lucene ব্যবহার করে আপনার Java প্রোজেক্টে টেক্সট ডেটার সার্চ সিস্টেম তৈরি করতে পারেন এবং RAMDirectory বা FSDirectory ব্যবহার করে ইনডেক্স তৈরি ও ব্যবস্থাপনা করতে পারেন। উপরোক্ত উদাহরণগুলি আপনাকে Lucene এ ইনডেক্সিং, সার্চিং এবং কুয়েরি অপারেশন করার প্রাথমিক ধারণা দিয়েছে।
Read more