Lucene হল একটি শক্তিশালী ওপেন সোর্স ইন্ডেক্সিং এবং সার্চিং লাইব্রেরি যা ডেটাবেস বা ডকুমেন্ট সংগ্রহের উপর দ্রুত এবং কার্যকরী অনুসন্ধান এবং সার্চ সুবিধা প্রদান করে। যখন আমরা বড় ডেটাসেটের উপর সার্চ করতে চাই, তখন pagination (পৃষ্ঠায় বিভক্ত করা) এবং sorting (বিন্যাস করা) খুব গুরুত্বপূর্ণ। Lucene এ pagination এবং sorting করা খুবই সহজ, তবে কিছু কৌশল এবং সঠিক কনফিগারেশন প্রক্রিয়া অনুসরণ করতে হয়।
এই টিউটোরিয়ালে, আমরা Lucene এ pagination এবং sorting কিভাবে কার্যকরীভাবে করা যায় তা উদাহরণসহ দেখাবো।
১. Lucene তে Pagination এর ধারণা
Pagination বা পৃষ্ঠায় বিভক্তকরণ এমন একটি কৌশল যেখানে আপনি একটি বড় ফলাফলের সেটের একটি নির্দিষ্ট পরিমাণ ফলাফল প্রতিটি পৃষ্ঠায় দেখান। এটি বড় ডেটাসেটের জন্য পারফরম্যান্স অপটিমাইজেশনে সাহায্য করে।
Lucene এ pagination করার জন্য, আমরা সাধারণত TopDocs ক্লাস ব্যবহার করি, যা সার্চ রেজাল্টের স্ন্যাপশট প্রদান করে এবং এর মাধ্যমে ফিল্টারিং এবং সীমাবদ্ধতা কার্যকর করা যায়।
Lucene তে Pagination উদাহরণ:
ধরা যাক, আমাদের একটি ইন্ডেক্স তৈরি করা হয়েছে এবং আমরা সেখানে ১০০০টি ডকুমেন্ট সংরক্ষণ করেছি। আমরা এক পৃষ্ঠায় ১০টি ডকুমেন্ট দেখাতে চাই এবং পরবর্তী পৃষ্ঠার জন্য pagination করতে চাই।
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
public class LucenePaginationExample {
public static void main(String[] args) throws Exception {
// Create the index
Directory directory = new RAMDirectory();
StandardAnalyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter writer = new IndexWriter(directory, config);
// Sample documents to index
for (int i = 0; i < 1000; i++) {
Document doc = new Document();
doc.add(new TextField("content", "This is document " + i, Field.Store.YES));
writer.addDocument(doc);
}
writer.close();
// Search Query Setup
String queryStr = "document";
QueryParser parser = new QueryParser("content", analyzer);
Query query = parser.parse(queryStr);
// IndexSearcher for searching the indexed documents
DirectoryReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
// Pagination setup
int pageSize = 10; // Number of results per page
int pageNumber = 3; // The page number to display
int start = (pageNumber - 1) * pageSize;
// Search for documents and apply pagination
TopDocs topDocs = searcher.search(query, start + pageSize); // Fetch results
System.out.println("Displaying page " + pageNumber + " of results:");
for (int i = start; i < Math.min(topDocs.totalHits.value, start + pageSize); i++) {
Document doc = searcher.doc(topDocs.scoreDocs[i].doc);
System.out.println(doc.get("content"));
}
reader.close();
directory.close();
}
}
এখানে, আমরা প্রথমে ১০০০টি ডকুমেন্ট তৈরি করেছি এবং পরে তাদের অনুসন্ধান করেছি। pagination করতে আমরা start এবং pageSize ব্যবহার করেছি এবং শুধুমাত্র নির্দিষ্ট পৃষ্ঠার জন্য ডকুমেন্ট দেখিয়েছি।
২. Lucene তে Sorting এর ধারণা
Sorting বা বিন্যাস হল সার্চ রেজাল্টগুলিকে কোনো নির্দিষ্ট ক্রমে সাজানোর প্রক্রিয়া। Lucene তে sorting করতে, আমরা Sort অবজেক্ট ব্যবহার করে একটি নির্দিষ্ট ক্ষেত্রের ওপর ডকুমেন্টগুলো সাজাতে পারি।
Lucene তে Sorting উদাহরণ:
ধরা যাক, আমাদের কিছু ডকুমেন্ট আছে এবং আমরা তাদের "content" ফিল্ডের ওপর সজ্জিত করতে চাই।
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.TopDocs;
public class LuceneSortingExample {
public static void main(String[] args) throws Exception {
// Create the index and write documents as shown in the previous example...
// Sort by 'content' field in ascending order
Sort sort = new Sort(new SortField("content", SortField.Type.STRING));
// Search for documents and apply sorting
TopDocs topDocs = searcher.search(query, 10, sort); // Get top 10 sorted results
System.out.println("Sorted search results:");
for (int i = 0; i < topDocs.scoreDocs.length; i++) {
Document doc = searcher.doc(topDocs.scoreDocs[i].doc);
System.out.println(doc.get("content"));
}
reader.close();
directory.close();
}
}
এখানে, SortField ব্যবহার করে content ফিল্ডের ওপর ডকুমেন্টগুলো সজ্জিত করেছি। আপনি চাইলে ascending বা descending আর্ডারে সাজাতে পারেন।
৩. Pagination এবং Sorting একত্রিত করা
আপনি pagination এবং sorting একত্রে ব্যবহার করে একটি বড় ডেটাসেটের জন্য ডকুমেন্টগুলো একটি নির্দিষ্ট পৃষ্ঠায় সাজানো এবং সীমাবদ্ধ করতে পারেন।
উদাহরণ: Pagination এবং Sorting একত্রিত করা
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.TopDocs;
public class LucenePaginationAndSortingExample {
public static void main(String[] args) throws Exception {
// Create the index and write documents as shown previously...
// Pagination setup
int pageSize = 10;
int pageNumber = 3;
int start = (pageNumber - 1) * pageSize;
// Sorting setup
Sort sort = new Sort(new SortField("content", SortField.Type.STRING));
// Search and apply pagination and sorting
TopDocs topDocs = searcher.search(query, start + pageSize, sort);
System.out.println("Displaying sorted page " + pageNumber + " of results:");
for (int i = start; i < Math.min(topDocs.totalHits.value, start + pageSize); i++) {
Document doc = searcher.doc(topDocs.scoreDocs[i].doc);
System.out.println(doc.get("content"));
}
reader.close();
directory.close();
}
}
এখানে, আমরা pagination এবং sorting একত্রে ব্যবহার করেছি, যাতে সার্চ রেজাল্টকে প্রথমে সজ্জিত করা হয় এবং তারপর পৃষ্ঠায় ভাগ করা হয়।
সারাংশ
Lucene তে pagination এবং sorting করার মাধ্যমে আপনি বড় ডেটাসেটের মধ্যে কার্যকরীভাবে সার্চ এবং রেজাল্ট প্রদর্শন করতে পারবেন। Pagination ডেটা ভাগ করে এবং প্রতিটি পৃষ্ঠায় নির্দিষ্ট সংখ্যক ফলাফল দেখানোর সুবিধা প্রদান করে, যখন sorting সার্চ রেজাল্টকে নির্দিষ্ট ক্রমে সাজায় (যেমন, অ্যাসেন্ডিং বা ডিসেন্ডিং)। এই দুটি ফিচার একত্রে ব্যবহার করে আপনি আরও প্রোডাক্টিভ এবং স্কেলেবল সার্চ ইন্টারফেস তৈরি করতে পারবেন।
Read more