Apache Lucene হল একটি অত্যন্ত শক্তিশালী text search library যা Java ভিত্তিক অ্যাপ্লিকেশনের জন্য ব্যবহৃত হয়। এটি ইনডেক্স তৈরি এবং কাস্টম টেক্সট অনুসন্ধানের জন্য ব্যবহৃত হয়। লুসিন ইনডেক্সিং এবং সাচিং এর ক্ষেত্রে একটি খুবই দ্রুত এবং কার্যকরী পদ্ধতি প্রদান করে।
এখানে আমরা দেখবো কিভাবে Lucene এ Text Searching এবং Phrase Searching কাজ করে, এবং এগুলির বাস্তব উদাহরণ।
১. Text Searching in Lucene
Text Searching লুসিনে সাধারণত query তৈরি করে করা হয়, যেখানে আপনি ইনডেক্স করা ডেটার মধ্যে কীওয়ার্ড বা টার্ম অনুসন্ধান করেন। লুসিনে টেক্সট অনুসন্ধান করতে সাধারণত Query ক্লাস এবং IndexSearcher ব্যবহার করা হয়।
উদাহরণ: Text Searching in Lucene
এই উদাহরণে, আমরা একটি সিম্পল text search কার্যক্রম তৈরি করবো যেখানে আমরা একটি ইনডেক্সে থাকা টেক্সটের মধ্যে নির্দিষ্ট কীওয়ার্ড অনুসন্ধান করব।
১.১ Dependencies:
ম্যাভেন প্রোজেক্টে Lucene ডিপেনডেন্সি যুক্ত করতে হবে।
<dependencies>
<!-- Lucene Core dependency -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>8.11.0</version>
</dependency>
<!-- Lucene Analyzer dependency -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>8.11.0</version>
</dependency>
</dependencies>
১.২ Indexing Text:
প্রথমে, আপনাকে একটি ডকুমেন্ট ইনডেক্স করতে হবে। এটি Lucene Document এবং Field ক্লাসের মাধ্যমে করা হয়।
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;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
public class LuceneTextSearchExample {
public static void main(String[] args) throws Exception {
// Create an in-memory directory for indexing
Directory directory = new RAMDirectory();
// Set up the analyzer and index writer
StandardAnalyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter writer = new IndexWriter(directory, config);
// Create a document to be indexed
Document doc = new Document();
doc.add(new TextField("content", "Lucene is a powerful text search library", Field.Store.YES));
writer.addDocument(doc);
// Commit changes and close the writer
writer.commit();
writer.close();
// Now, the document has been indexed, and we can search it.
searchIndex(directory, "Lucene");
}
public static void searchIndex(Directory directory, String queryStr) throws Exception {
// Create an IndexSearcher
IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(directory));
Query query = new QueryParser("content", new StandardAnalyzer()).parse(queryStr);
// Perform the search
TopDocs topDocs = searcher.search(query, 10);
System.out.println("Found " + topDocs.totalHits + " document(s) for query: " + queryStr);
// Display the search results
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
Document doc = searcher.doc(scoreDoc.doc);
System.out.println("Found: " + doc.get("content"));
}
}
}
১.৩ Explanation:
- এখানে আমরা RAMDirectory ব্যবহার করে ইন-মেমরি ডাটাবেস তৈরি করেছি যেখানে ডেটা ইনডেক্স করা হচ্ছে।
- StandardAnalyzer ব্যবহার করা হয়েছে যাতে টেক্সটকে টোকেনাইজ করা যায় এবং বিশেষ চিহ্ন বাদ দেওয়া হয়।
- একটি TextField তৈরি করা হয়েছে এবং এতে "Lucene is a powerful text search library" টেক্সট ডকুমেন্ট হিসেবে ইনডেক্স করা হয়েছে।
- এরপর, IndexSearcher এর মাধ্যমে নির্দিষ্ট একটি কিওয়ার্ডের জন্য সাচিং করা হয়েছে, যেমন:
"Lucene"।
১.৪ Text Searching Output:
উপরের কোডটি চালানোর পরে আউটপুট হবে:
Found 1 document(s) for query: Lucene
Found: Lucene is a powerful text search library
এখানে, "Lucene" কিওয়ার্ডের জন্য ইনডেক্স করা ডকুমেন্ট পাওয়া গেছে এবং সেই ডকুমেন্টের কনটেন্ট প্রিন্ট করা হয়েছে।
২. Phrase Searching in Lucene
Phrase Searching Lucene এ আরও নির্দিষ্ট এবং টার্গেটেড সাচিং পদ্ধতি। এখানে, আপনি একটি নির্দিষ্ট ফ্রেজ বা বাক্যাংশ অনুসন্ধান করেন। Phrase searching এর জন্য Lucene PhraseQuery ব্যবহার করে, যা আপনার অনুসন্ধানের জন্য নির্দিষ্ট শব্দগুলির সঠিক অর্ডার অনুসন্ধান করে।
উদাহরণ: Phrase Searching in Lucene
import org.apache.lucene.document.Document;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.search.PhraseQuery;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
public class LucenePhraseSearchExample {
public static void main(String[] args) throws Exception {
// Create an in-memory directory for indexing
Directory directory = new RAMDirectory();
// Set up the analyzer and index writer
StandardAnalyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter writer = new IndexWriter(directory, config);
// Create and add a document
Document doc = new Document();
doc.add(new TextField("content", "Lucene is a powerful library for text search", Field.Store.YES));
writer.addDocument(doc);
writer.commit();
writer.close();
// Search using phrase query
searchPhraseIndex(directory, "powerful library");
}
public static void searchPhraseIndex(Directory directory, String phrase) throws Exception {
// Create an IndexSearcher
IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(directory));
PhraseQuery query = new PhraseQuery();
String[] words = phrase.split(" ");
for (String word : words) {
query.add(new Term("content", word));
}
// Perform the search
TopDocs topDocs = searcher.search(query, 10);
System.out.println("Found " + topDocs.totalHits + " document(s) for phrase: " + phrase);
// Display the search results
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
Document doc = searcher.doc(scoreDoc.doc);
System.out.println("Found: " + doc.get("content"));
}
}
}
২.১ Explanation:
- PhraseQuery ব্যবহার করা হয়েছে যেখানে দুটি শব্দ "powerful" এবং "library" সঠিক অর্ডারে অনুসন্ধান করা হয়েছে।
- searchPhraseIndex মেথডের মাধ্যমে
"powerful library"ফ্রেজের জন্য অনুসন্ধান করা হয়েছে।
২.২ Phrase Searching Output:
উপরের কোডটি চালানোর পর আউটপুট হবে:
Found 1 document(s) for phrase: powerful library
Found: Lucene is a powerful library for text search
এখানে "powerful library" ফ্রেজের জন্য একটি ডকুমেন্ট পাওয়া গেছে এবং সেটি প্রিন্ট করা হয়েছে।
৩. Conclusion
- Text Searching এবং Phrase Searching দুটি গুরুত্বপূর্ণ ফিচার যা Lucene এ ব্যবহার করা যায়।
- Text Searching সাধারণভাবে কীওয়ার্ড অনুসন্ধান করে এবং Phrase Searching একটি নির্দিষ্ট শব্দের সঠিক অর্ডারে অনুসন্ধান করে।
- Lucene এর Indexing এবং Searching ক্ষমতা খুবই শক্তিশালী এবং এটি বিভিন্ন ধরনের কাস্টম অনুসন্ধান সমাধান তৈরি করতে সাহায্য করে।
এটি Lucene এর কিছু মৌলিক ধারণা এবং কার্যকরী উদাহরণ ছিল, যা আপনাকে Lucene এর মাধ্যমে টেক্সট অনুসন্ধান এবং ফ্রেজ অনুসন্ধান করতে সাহায্য করবে।
Read more