Lucene একটি শক্তিশালী এবং কার্যকরী ওপেন সোর্স লাইব্রেরি যা টেক্সট ডকুমেন্টের ইনডেক্সিং এবং অনুসন্ধান পরিচালনা করে। এটি একটি উচ্চ ক্ষমতাসম্পন্ন টেক্সট অনুসন্ধান ইঞ্জিন যা বিভিন্ন ধরনের কাস্টম অনুসন্ধান প্রক্রিয়া এবং কুয়েরি টেকনিক সাপোর্ট করে। Lucene ব্যবহার করে আমরা বিভিন্ন ধরনের অনুসন্ধান কৌশল (complex search techniques) তৈরি করতে পারি, যা টেক্সট ডেটা অনুসন্ধানের প্রক্রিয়াকে আরও বেশি কার্যকরী করে তোলে।
এই টিউটোরিয়ালে, আমরা একটি Practical Example দেখব যেখানে আমরা Lucene এর মাধ্যমে Complex Search Techniques তৈরি করব। এর মধ্যে থাকবে:
- কাস্টম কুয়েরি তৈরি করা
- Boolean Query ব্যবহার করা
- Phrase Query ব্যবহার করা
- Range Query ব্যবহার করা
১. Lucene Indexing Overview
Lucene তে ইনডেক্স তৈরি করতে হলে প্রথমে Document এবং Field তৈরি করতে হয়। একটি Document হলো Lucene এর জন্য একটি ইউনিট অব ডেটা, যেখানে ডেটার ফিল্ড থাকে। এরপর, এই ডেটা ইনডেক্স করা হয় যাতে দ্রুত অনুসন্ধান করা সম্ভব হয়।
উদাহরণ: Indexing Data in Lucene
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.FSDirectory;
import java.io.IOException;
import java.nio.file.Paths;
public class LuceneIndexer {
public static void createIndex() throws IOException {
FSDirectory directory = FSDirectory.open(Paths.get("index"));
IndexWriterConfig config = new IndexWriterConfig();
IndexWriter writer = new IndexWriter(directory, config);
Document doc = new Document();
doc.add(new TextField("title", "Lucene in Action", Field.Store.YES));
doc.add(new TextField("content", "Lucene is a powerful search engine library.", Field.Store.YES));
writer.addDocument(doc);
writer.close();
}
}
এখানে, একটি Document তৈরি করা হয়েছে যার মধ্যে title এবং content নামে দুটি ফিল্ড রয়েছে। পরে IndexWriter ব্যবহার করে এই ডকুমেন্টটি ইনডেক্স করা হয়েছে।
২. Lucene Search Techniques
Lucene বিভিন্ন ধরনের অনুসন্ধান কৌশল সমর্থন করে, যার মধ্যে রয়েছে Boolean Query, Phrase Query, এবং Range Query। এগুলি ব্যবহার করে জটিল অনুসন্ধান তৈরি করা সম্ভব।
২.১ Boolean Query (AND, OR, NOT)
Boolean Query অনুসন্ধান কার্যক্রমে AND, OR, এবং NOT অপারেটর ব্যবহার করে কুয়েরি তৈরি করা যায়। এটি একাধিক শর্ত অনুসন্ধান করতে সাহায্য করে।
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.index.Term;
public class BooleanSearchExample {
public static void booleanQueryExample() throws IOException {
BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
Query query1 = new TermQuery(new Term("content", "Lucene"));
Query query2 = new TermQuery(new Term("title", "Action"));
booleanQuery.add(query1, BooleanClause.Occur.MUST);
booleanQuery.add(query2, BooleanClause.Occur.MUST);
// Perform search with boolean query
// Search logic using IndexSearcher would be here
}
}
এখানে, AND অপারেটর ব্যবহার করে "Lucene" এবং "Action" শব্দ দুটি সহ ডকুমেন্ট অনুসন্ধান করা হয়েছে।
২.২ Phrase Query
Phrase Query ব্যবহার করে একাধিক শব্দকে একটি নির্দিষ্ট অর্ডারে অনুসন্ধান করা যায়। এটি বিশেষভাবে কার্যকরী যখন আপনি দুটি বা ততোধিক শব্দের সঠিক অবস্থান অনুসন্ধান করতে চান।
import org.apache.lucene.search.PhraseQuery;
public class PhraseSearchExample {
public static void phraseQueryExample() throws IOException {
PhraseQuery.Builder phraseQuery = new PhraseQuery.Builder();
phraseQuery.add(new Term("content", "powerful"));
phraseQuery.add(new Term("content", "search"));
// Perform search with phrase query
// Search logic using IndexSearcher would be here
}
}
এখানে, "powerful" এবং "search" শব্দ দুটি একটি নির্দিষ্ট অর্ডারে অনুসন্ধান করা হচ্ছে।
২.৩ Range Query
Range Query ব্যবহার করে আপনি একটি নির্দিষ্ট পরিসরে থাকা ডেটা অনুসন্ধান করতে পারেন। এটি সংখ্যার মধ্যে, তারিখের মধ্যে বা কোনো নির্দিষ্ট পরিসরের মধ্যে ডেটা খুঁজতে সাহায্য করে।
import org.apache.lucene.search.NumericRangeQuery;
public class RangeSearchExample {
public static void rangeQueryExample() throws IOException {
NumericRangeQuery<Integer> rangeQuery = NumericRangeQuery.newIntRange("year", 2000, 2020, true, true);
// Perform search with range query
// Search logic using IndexSearcher would be here
}
}
এখানে, year ফিল্ডে ২০০০ থেকে ২০২০ সাল পর্যন্ত ডেটা অনুসন্ধান করা হয়েছে।
৩. Complex Search Example: Combining Queries
এখন, চলুন একাধিক কুয়েরি একত্রে ব্যবহার করে একটি জটিল অনুসন্ধান তৈরি করি। এখানে, আমরা Boolean Query, Phrase Query, এবং Range Query একত্রে ব্যবহার করব।
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.PhraseQuery;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
public class ComplexSearchExample {
public static void complexSearchExample() throws IOException {
BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
// Phrase query for content
PhraseQuery.Builder phraseQuery = new PhraseQuery.Builder();
phraseQuery.add(new Term("content", "powerful"));
phraseQuery.add(new Term("content", "search"));
// Adding phrase query to boolean query
booleanQuery.add(phraseQuery.build(), BooleanClause.Occur.MUST);
// Range query for year
NumericRangeQuery<Integer> rangeQuery = NumericRangeQuery.newIntRange("year", 2000, 2020, true, true);
// Adding range query to boolean query
booleanQuery.add(rangeQuery, BooleanClause.Occur.MUST);
// Perform complex search using the combined query
// Search logic using IndexSearcher would be here
}
}
এখানে:
- একটি Phrase Query ব্যবহার করে
"powerful search"শব্দ দুটি অনুসন্ধান করা হয়েছে। - একটি Range Query ব্যবহার করে ২০০০ থেকে ২০২০ সালের মধ্যে ডেটা অনুসন্ধান করা হয়েছে।
- উভয় কুয়েরি একটি Boolean Query তে AND (MUST) অপারেটরের মাধ্যমে একত্রিত করা হয়েছে।
৪. Search Result Handling
Lucene তে অনুসন্ধান করার পর, আপনি IndexSearcher ব্যবহার করে ফলাফল পেতে পারেন এবং TopDocs এর মাধ্যমে শীর্ষ ডকুমেন্টগুলি দেখাতে পারেন।
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.TopDocs;
public class SearchResultExample {
public static void handleSearchResults() throws IOException {
// Assuming IndexSearcher and query are already defined
IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(FSDirectory.open(Paths.get("index"))));
TopDocs topDocs = searcher.search(booleanQuery.build(), 10); // Top 10 results
for (int i = 0; i < topDocs.scoreDocs.length; i++) {
System.out.println("Doc ID: " + topDocs.scoreDocs[i].doc);
// Retrieve the document based on Doc ID
}
}
}
এখানে, TopDocs ব্যবহার করে শীর্ষ ১০টি ফলাফল ফেরত পাওয়া যাচ্ছে এবং তাদের ডকুমেন্ট আইডি প্রদর্শন করা হচ্ছে।
সারাংশ
Lucene একটি শক্তিশালী টেক্সট অনুসন্ধান লাইব্রেরি যা বিভিন্ন ধরনের কাস্টম এবং জটিল অনুসন্ধান কৌশল তৈরি করতে সহায়তা করে। এই টিউটোরিয়ালে আমরা দেখলাম:
- Boolean Query, Phrase Query, এবং Range Query কিভাবে কাজ করে।
- কীভাবে একাধিক কুয়েরি একত্রে ব্যবহার করে একটি Complex Search তৈরি করা যায়।
- IndexSearcher ব্যবহার করে ফলাফল প্রক্রিয়া করা।
Lucene এর এই শক্তিশালী অনুসন্ধান কৌশলগুলি ব্যবহার করে আপনি আপনার প্রোজেক্টে অত্যন্ত কার্যকরী এবং দ্রুত অনুসন্ধান কার্যক্রম বাস্তবায়ন করতে পারবেন।
Read more