Apache Lucene একটি জনপ্রিয় ওপেন সোর্স লাইব্রেরি যা টেক্সট সন্নিবেশ (indexing) এবং অনুসন্ধান (searching) এর জন্য ব্যবহৃত হয়। এটি বৃহৎ পরিমাণে ডেটা থেকে দ্রুত অনুসন্ধান ফলাফল প্রদান করতে সক্ষম। Lucene অনুসন্ধান কার্যক্রমের জন্য একটি শক্তিশালী Searcher ক্লাস এবং Query ক্লাস সরবরাহ করে, যা অনুসন্ধান কুয়েরি তৈরির এবং অনুসন্ধান ফলাফল বের করার জন্য ব্যবহৃত হয়।
এই টিউটোরিয়ালে, আমরা Searcher ক্লাস এবং Query এর ধারণা এবং কিভাবে Lucene এ এগুলি কাজ করে তা দেখবো।
১. Searcher ক্লাস এর ধারণা
Searcher ক্লাস Lucene তে অনুসন্ধান কার্যক্রম পরিচালনা করে। এটি ইনডেক্স থেকে তথ্য অনুসন্ধান করতে ব্যবহৃত হয় এবং ব্যবহারকারীর প্রদত্ত কুয়েরি (Query) এর ভিত্তিতে ফলাফল প্রদান করে। IndexSearcher হল সবচেয়ে ব্যবহৃত Searcher ক্লাস, যা IndexReader এর সাথে কাজ করে ইনডেক্স থেকে ডেটা অ্যাক্সেস করতে।
IndexSearcher সাধারণত IndexReader এর সাহায্যে ইনডেক্স রিড করে এবং তারপরে প্রাপ্ত তথ্য অনুসারে অনুসন্ধান পরিচালনা করে।
IndexSearcher ক্লাস:
IndexSearcher ক্লাস একটি Searcher যা IndexReader ব্যবহার করে ইনডেক্সে থাকা ডকুমেন্টগুলির মধ্যে অনুসন্ধান চালায়।
উদাহরণ:
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import java.nio.file.Paths;
public class LuceneSearchExample {
public static void main(String[] args) throws Exception {
// Directory where the index is stored
Directory directory = FSDirectory.open(Paths.get("path/to/index"));
// Create an IndexReader
DirectoryReader directoryReader = DirectoryReader.open(directory);
// Create an IndexSearcher
IndexSearcher searcher = new IndexSearcher(directoryReader);
// Perform a search (example: find all documents)
System.out.println("Searcher Created!");
}
}
এখানে:
- FSDirectory.open() ইনডেক্স ডিরেক্টরি খুলে।
- DirectoryReader.open() ইনডেক্স রিডার তৈরি করে ইনডেক্সের তথ্য অ্যাক্সেস করার জন্য।
- IndexSearcher ইনডেক্স রিডারের মাধ্যমে অনুসন্ধান পরিচালনা করতে ব্যবহৃত হয়।
২. Query এর ধারণা
Query ক্লাস Lucene এ অনুসন্ধান চালানোর জন্য ব্যবহার করা হয়। এটি একটি সাধারণ উপায় দিয়ে ইউজারের অনুসন্ধান প্রশ্ন বা শর্ত (condition) তৈরি করে, যা পরে IndexSearcher দ্বারা ইনডেক্সে অনুসন্ধান করার জন্য ব্যবহার করা হয়। Lucene এ বিভিন্ন ধরনের কুয়েরি উপলব্ধ, যেমন TermQuery, BooleanQuery, PhraseQuery ইত্যাদি, যা বিভিন্ন অনুসন্ধান পরিস্থিতি সমাধান করতে ব্যবহৃত হয়।
Query Example:
- TermQuery: একটি নির্দিষ্ট শব্দ বা টার্ম অনুসন্ধান করার জন্য ব্যবহৃত হয়।
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.index.Term;
public class LuceneQueryExample {
public static void main(String[] args) throws Exception {
// Create a TermQuery to search for the term "java" in the "content" field
Query query = new TermQuery(new Term("content", "java"));
System.out.println("TermQuery created: " + query);
}
}
- BooleanQuery: একাধিক কুয়েরি সংযুক্ত করতে ব্যবহৃত হয়, যেখানে
AND,OR,NOTঅপারেটর ব্যবহার করা যেতে পারে।
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanClause;
public class LuceneBooleanQueryExample {
public static void main(String[] args) throws Exception {
// Create individual TermQueries
TermQuery termQuery1 = new TermQuery(new Term("content", "java"));
TermQuery termQuery2 = new TermQuery(new Term("content", "lucene"));
// Combine them into a BooleanQuery with an OR operator
BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.add(termQuery1, BooleanClause.Occur.SHOULD);
builder.add(termQuery2, BooleanClause.Occur.SHOULD);
BooleanQuery booleanQuery = builder.build();
System.out.println("BooleanQuery created: " + booleanQuery);
}
}
- PhraseQuery: একাধিক শব্দের সঠিক ক্রমে অনুসন্ধান করতে ব্যবহৃত হয়।
import org.apache.lucene.search.PhraseQuery;
public class LucenePhraseQueryExample {
public static void main(String[] args) throws Exception {
// Create a PhraseQuery to search for the phrase "java lucene"
PhraseQuery phraseQuery = new PhraseQuery("content", "java", "lucene");
System.out.println("PhraseQuery created: " + phraseQuery);
}
}
৩. Query Execution with IndexSearcher
কুয়েরি তৈরি করার পর, এটি IndexSearcher দ্বারা কার্যকর করা হয় এবং ডকুমেন্টের ফলাফল ফেরত পাওয়া যায়। সাধারণত search() মেথডের মাধ্যমে অনুসন্ধান পরিচালনা করা হয়।
Query Execution Example:
import org.apache.lucene.search.Query;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.search.TopDocs;
import java.nio.file.Paths;
public class LuceneQueryExecutionExample {
public static void main(String[] args) throws Exception {
// Create an IndexSearcher
FSDirectory directory = FSDirectory.open(Paths.get("path/to/index"));
DirectoryReader directoryReader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(directoryReader);
// Create a query
Query query = new TermQuery(new Term("content", "java"));
// Execute the query
TopDocs topDocs = searcher.search(query, 10); // Search for top 10 documents
// Display the results
System.out.println("Total Hits: " + topDocs.totalHits);
for (int i = 0; i < topDocs.scoreDocs.length; i++) {
System.out.println("Doc ID: " + topDocs.scoreDocs[i].doc);
}
}
}
এখানে:
- search() মেথড অনুসন্ধান সম্পাদন করে এবং TopDocs অবজেক্টে ফলাফল ফেরত দেয়, যেখানে টপ ডকুমেন্ট এবং তাদের স্কোর পাওয়া যায়।
- TopDocs.scoreDocs[] ব্যবহার করে, প্রতিটি ডকুমেন্টের ID এবং স্কোর বের করা হয়।
৪. Query Types in Lucene
Lucene তে বিভিন্ন ধরনের কুয়েরি ব্যবহৃত হয় যা আপনার অনুসন্ধান চাহিদা অনুযায়ী নির্বাচন করা যায়। প্রধান কুয়েরি টাইপ গুলি হলো:
- TermQuery: একটি নির্দিষ্ট শব্দ বা টার্ম অনুসন্ধান করতে ব্যবহৃত হয়।
- PhraseQuery: একাধিক শব্দের সঠিক ক্রমে অনুসন্ধান করতে ব্যবহৃত হয়।
- BooleanQuery: একাধিক কুয়েরি বা শর্তকে যুক্ত করে একটি যৌথ অনুসন্ধান তৈরি করতে ব্যবহৃত হয়।
- WildcardQuery: যেকোনো শব্দের জন্য ওয়াইল্ডকার্ড (যেমন
*,?) ব্যবহার করা হয়। - RangeQuery: একটি নির্দিষ্ট পরিসরে মানের অনুসন্ধান করতে ব্যবহৃত হয়।
- FuzzyQuery: প্রায় সাদৃশ্য শব্দের জন্য অনুসন্ধান করতে ব্যবহৃত হয় (যেমন টাইপো সহ শব্দ)।
সারাংশ
Lucene একটি শক্তিশালী টেক্সট অনুসন্ধান লাইব্রেরি, যা Searcher ক্লাস এবং Query এর মাধ্যমে ইনডেক্স করা ডেটাতে দ্রুত এবং নির্ভুল অনুসন্ধান পরিচালনা করতে সাহায্য করে। IndexSearcher ক্লাস ইনডেক্স থেকে ডেটা অনুসন্ধান করে, এবং Query ক্লাস বিভিন্ন ধরনের কুয়েরি তৈরি করতে ব্যবহৃত হয়, যেমন TermQuery, BooleanQuery, PhraseQuery ইত্যাদি। এই কুয়েরি গুলি অনুসন্ধান কার্যক্রমের জন্য ব্যবহৃত হয়ে থাকে, এবং TopDocs এর মাধ্যমে ফলাফল প্রাপ্ত হয়। Lucene এর মাধ্যমে আপনি দক্ষভাবে ডেটা অনুসন্ধান করতে পারেন এবং এটি বড় পরিমাণ ডেটার জন্য অত্যন্ত কার্যকর।
Read more