Skill

Lucene তে Pagination এবং Sorting

লুসিন (Lucene) - Java Technologies

348

Lucene হল একটি উচ্চ কার্যক্ষমতা সম্পন্ন ফ্রি এবং ওপেন সোর্স সার্চ লাইব্রেরি, যা Java এ তৈরি করা হয়েছে। এটি টেক্সট সঞ্চয় এবং অনুসন্ধানের জন্য ব্যবহৃত হয় এবং বিভিন্ন ডকুমেন্ট এবং ইনডেক্সের মধ্যে দ্রুত সার্চ করতে সহায়তা করে। Pagination এবং Sorting হল দুটি গুরুত্বপূর্ণ ফিচার যা Lucene এর মাধ্যমে সঠিক এবং কার্যকরী সার্চ ফলাফল পাওয়ার জন্য ব্যবহৃত হয়।

এই টিউটোরিয়ালে আমরা Lucene তে Pagination এবং Sorting কীভাবে কাজ করে এবং কিভাবে এই দুটি ফিচার ব্যবহার করা যায় তা দেখব।


১. Lucene তে Pagination (পেইজিনেশন)

Pagination হলো সার্চ ফলাফলকে বিভিন্ন পেইজে ভাগ করার প্রক্রিয়া। সাধারণত, একসাথে বড় সংখ্যক রেকর্ড দেখানো না হয়ে একটি নির্দিষ্ট সংখ্যক রেকর্ড একটি পেইজে দেখানো হয়। Lucene তে Pagination ব্যবহার করার জন্য TopDocs এবং ScoreDoc ক্লাস ব্যবহার করা হয়।

Pagination এর কাজ:

  1. start প্যারামিটার ব্যবহার করে আপনি কী পেইজ থেকে সার্চ শুরু করবেন তা নির্ধারণ করেন।
  2. rows প্যারামিটার ব্যবহার করে আপনি একটি পেইজে কতগুলি রেকর্ড প্রদর্শন করতে চান তা নির্ধারণ করেন।

উদাহরণ: Pagination in Lucene

import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.*;

public class PaginationExample {
    public static void main(String[] args) throws Exception {
        // Create an IndexSearcher
        IndexReader reader = DirectoryReader.open(indexDirectory);
        IndexSearcher searcher = new IndexSearcher(reader);

        // Create a query
        Query query = new TermQuery(new Term("content", "lucene"));

        // Set pagination parameters
        int page = 1; // Page number (1-based)
        int pageSize = 10; // Number of results per page
        int start = (page - 1) * pageSize;

        // Create a TopDocs object to fetch the results
        TopDocs topDocs = searcher.search(query, start + pageSize);

        // Get the results for the current page
        ScoreDoc[] hits = topDocs.scoreDocs;
        for (int i = start; i < Math.min(start + pageSize, hits.length); i++) {
            int docId = hits[i].doc;
            Document doc = searcher.doc(docId);
            System.out.println("Document: " + doc.get("title"));
        }

        reader.close();
    }
}

এখানে:

  • start হলো পেইজের শুরু পয়েন্ট (যেমন 1st পেইজ, 2nd পেইজ)।
  • pageSize হলো প্রতিটি পেইজে কতগুলো রেকর্ড দেখানো হবে।
  • TopDocs এবং ScoreDoc ব্যবহার করে সার্চ রেজাল্টের পেইজিং করা হয়।

২. Lucene তে Sorting (সোর্টিং)

Sorting হল সার্চ রেজাল্ট গুলো নির্দিষ্ট কোনো ক্রমে সাজানোর প্রক্রিয়া। Lucene তে সঠিকভাবে সার্চ রেজাল্ট সাজানোর জন্য Sort ক্লাস ব্যবহার করা হয়, যা অনুসন্ধান রেজাল্ট গুলো নির্দিষ্ট একটি ফিল্ডের উপর ভিত্তি করে সজ্জিত করে। সাধারণত, FieldComparator ব্যবহার করে কাস্টম সোর্টিং করা হয়।

Sorting এর কাজ:

  • আপনি কোন ফিল্ডের ভিত্তিতে সোর্ট করতে চান তা নির্ধারণ করতে হবে (যেমন, date, title, price ইত্যাদি)।
  • Lucene সার্চ রেজাল্টকে ascending (স্বাভাবিক) বা descending (অবর্তমান) অর্ডারে সাজাতে পারে।

উদাহরণ: Sorting in Lucene

import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.*;
import org.apache.lucene.store.FSDirectory;
import java.nio.file.Paths;

public class SortingExample {
    public static void main(String[] args) throws Exception {
        // Create an IndexSearcher
        IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get("path/to/index")));
        IndexSearcher searcher = new IndexSearcher(reader);

        // Create a query
        Query query = new TermQuery(new Term("content", "lucene"));

        // Create a Sort object to sort by the "date" field in descending order
        Sort sort = new Sort(new SortField("date", SortField.Type.STRING, true));

        // Perform the search with sorting
        TopDocs topDocs = searcher.search(query, 10, sort);

        // Display sorted results
        for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
            Document doc = searcher.doc(scoreDoc.doc);
            System.out.println("Title: " + doc.get("title") + ", Date: " + doc.get("date"));
        }

        reader.close();
    }
}

এখানে:

  • SortField ব্যবহার করে date ফিল্ডে সোর্টিং করা হয়েছে।
  • SortField.Type.STRING দিয়ে সটফিল্ড টাইপ নির্ধারণ করা হয়েছে।
  • true দিয়ে descending অর্ডার সঠিকভাবে নির্ধারণ করা হয়েছে।

৩. Lucene তে Pagination এবং Sorting একসাথে ব্যবহার করা

আপনি Pagination এবং Sorting একসাথে ব্যবহার করতে পারেন, যেখানে প্রথমে সঠিক পেইজে সঠিক রেজাল্টগুলি সিলেক্ট করা হবে এবং তারপর সেই রেজাল্টগুলো সঠিকভাবে সজ্জিত হবে।

উদাহরণ: Pagination and Sorting Together

import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.*;

public class PaginationSortingExample {
    public static void main(String[] args) throws Exception {
        // Create an IndexSearcher
        IndexReader reader = DirectoryReader.open(indexDirectory);
        IndexSearcher searcher = new IndexSearcher(reader);

        // Create a query
        Query query = new TermQuery(new Term("content", "lucene"));

        // Set pagination parameters
        int page = 2; // Page number (1-based)
        int pageSize = 10; // Number of results per page
        int start = (page - 1) * pageSize;

        // Create a Sort object to sort by "date" in descending order
        Sort sort = new Sort(new SortField("date", SortField.Type.STRING, true));

        // Perform the search with sorting and pagination
        TopDocs topDocs = searcher.search(query, start + pageSize, sort);

        // Get the results for the current page
        ScoreDoc[] hits = topDocs.scoreDocs;
        for (int i = start; i < Math.min(start + pageSize, hits.length); i++) {
            int docId = hits[i].doc;
            Document doc = searcher.doc(docId);
            System.out.println("Title: " + doc.get("title") + ", Date: " + doc.get("date"));
        }

        reader.close();
    }
}

এখানে:

  • Pagination এবং Sorting একসাথে ব্যবহার করা হয়েছে। প্রথমে পেইজের জন্য রেকর্ড ফিল্টার করা হচ্ছে, তারপর সেই রেকর্ডগুলো সোর্ট করা হচ্ছে।
  • Sort ব্যবহার করে রেকর্ডগুলো date ফিল্ডের উপর ভিত্তি করে descending অর্ডারে সাজানো হয়েছে।

সারাংশ

Lucene তে Pagination এবং Sorting ব্যবহার করার মাধ্যমে আপনি আপনার সার্চ ফলাফলগুলো আরও কার্যকরীভাবে নিয়ন্ত্রণ করতে পারেন। Pagination সার্চ রেজাল্ট গুলোকে পেইজে ভাগ করতে সাহায্য করে এবং Sorting আপনাকে সার্চ ফলাফল সঠিকভাবে সাজাতে সাহায্য করে। Lucene তে TopDocs, ScoreDoc, এবং Sort ক্লাস ব্যবহার করে আপনি এই কার্যাবলী সহজেই সম্পাদন করতে পারেন।


Content added By

Apache Lucene হল একটি ওপেন সোর্স টুল যা টেক্সট ডাটাবেসে ইন্ডেক্সিং এবং সাচিংয়ের জন্য ব্যবহৃত হয়। লুসিন ব্যবহার করে আপনি দ্রুত এবং কার্যকরীভাবে ডেটা সাচ করতে পারেন। এক্ষেত্রে, যদি আপনার ফলাফল অনেক বড় হয়, তবে pagination (পেইজিনেশন) ব্যবহার করা গুরুত্বপূর্ণ, যাতে ব্যবহারকারী শুধুমাত্র প্রাসঙ্গিক ফলাফল দেখেন।

TopDocs এবং ScoreDoc হল লুসিনের দুটি গুরুত্বপূর্ণ ক্লাস যা pagination করতে সাহায্য করে। এগুলি ব্যবহৃত হয় যখন আপনার কোয়েরি ফলাফল বিশাল হয় এবং আপনি একটি নির্দিষ্ট সীমার মধ্যে ফলাফল পেতে চান।

এই টিউটোরিয়ালে, আমরা দেখব কিভাবে TopDocs এবং ScoreDoc ব্যবহার করে লুসিনে পেইজিনেশন করা যায়।


১. TopDocs এবং ScoreDoc Overview

  • TopDocs: এটি লুসিনে সার্চ কোয়েরি ফলাফলের একটি কন্টেইনার যা সর্বোচ্চ ফলাফল ধারণ করে। এটি একটি সংগ্রহ যা ScoreDoc অবজেক্টের একটি অ্যারে রাখে, প্রতিটি ScoreDoc একটি সার্চ রেজাল্ট (ডকুমেন্ট) কে রিপ্রেজেন্ট করে।
  • ScoreDoc: এটি একটি ক্লাস যা লুসিনের সার্চ ফলাফলের প্রতিটি ডকুমেন্টের জন্য তথ্য ধারণ করে, যেমন ডকুমেন্টের স্কোর এবং তার ইনডেক্স।

এখানে, TopDocs এবং ScoreDoc ব্যবহারের মাধ্যমে আপনি নির্দিষ্ট সংখ্যক ফলাফল এবং পেইজিনেশন ফিচার পেতে পারেন।


২. Pagination এর জন্য TopDocs এবং ScoreDoc এর ব্যবহার

লুসিনে পেইজিনেশন করতে, প্রথমে সার্চ কোয়েরি তৈরি করতে হবে, এবং তারপর TopDocs অবজেক্ট থেকে ScoreDoc ব্যবহার করে নির্দিষ্ট পেইজের ফলাফল দেখতে হবে। নিচে একটি উদাহরণ দেওয়া হলো:

উদাহরণ: Lucene Pagination with TopDocs and ScoreDoc

import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.*;

import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;

import java.io.IOException;

public class LucenePaginationExample {

    public static void main(String[] args) throws IOException {
        // Index setup
        RAMDirectory ramDirectory = new RAMDirectory();
        IndexWriterConfig config = new IndexWriterConfig(new StandardAnalyzer());
        IndexWriter writer = new IndexWriter(ramDirectory, config);

        // Sample document to index
        Document doc1 = new Document();
        doc1.add(new org.apache.lucene.document.TextField("content", "This is the first document", org.apache.lucene.document.Field.Store.YES));
        writer.addDocument(doc1);

        Document doc2 = new Document();
        doc2.add(new org.apache.lucene.document.TextField("content", "This is the second document", org.apache.lucene.document.Field.Store.YES));
        writer.addDocument(doc2);

        Document doc3 = new Document();
        doc3.add(new org.apache.lucene.document.TextField("content", "Another document", org.apache.lucene.document.Field.Store.YES));
        writer.addDocument(doc3);

        writer.commit();
        writer.close();

        // Create a searcher and query
        IndexReader reader = DirectoryReader.open(ramDirectory);
        IndexSearcher searcher = new IndexSearcher(reader);

        Query query = new TermQuery(new org.apache.lucene.index.Term("content", "document"));

        // Pagination logic (get the first 2 results)
        int pageSize = 2;
        int start = 0;
        TopDocs topDocs = searcher.search(query, start + pageSize);

        // Process the results for pagination
        ScoreDoc[] hits = topDocs.scoreDocs;

        // Displaying the documents in the current page (results 0 to 2)
        for (int i = start; i < hits.length; i++) {
            int docId = hits[i].doc;
            Document d = searcher.doc(docId);
            System.out.println("Document " + (i + 1) + ": " + d.get("content"));
        }

        // Close reader
        reader.close();
    }
}

কোড ব্যাখ্যা:

  • IndexWriter এবং RAMDirectory ব্যবহার করে কিছু নমুনা ডকুমেন্ট ইনডেক্স করা হয়েছে।
  • একটি TermQuery ব্যবহার করে আমরা "document" শব্দটি খুঁজেছি।
  • TopDocs এর মাধ্যমে আমরা কোয়েরি ফলাফল পেয়ে যাচ্ছি এবং ScoreDoc ব্যবহার করে নির্দিষ্ট পেইজের ফলাফল দেখাচ্ছি। এই ক্ষেত্রে, আমরা প্রথম ২টি ফলাফল (pageSize = 2) দেখছি।

৩. Pagination এর জন্য Key Components

  1. TopDocs: এটি সার্চ কোয়েরি ফলাফলের সব ডকুমেন্ট এবং তাদের স্কোর ধারণ করে। এটি একটি কন্টেইনার যা ScoreDoc এর অ্যারে ধারণ করে।
  2. ScoreDoc: এটি একক ডকুমেন্টের ফলাফল, যেমন ডকুমেন্টের স্কোর, ডকুমেন্ট ID ইত্যাদি ধারণ করে। এটি পেইজিনেশন এবং ডকুমেন্ট শনাক্ত করতে ব্যবহৃত হয়।
  3. start এবং pageSize: এই দুটি ভেরিয়েবল পেইজিনেশন কন্ট্রোল করতে ব্যবহৃত হয়। start পেইজের শুরুর পজিশন নির্ধারণ করে এবং pageSize পেইজে কতটি ফলাফল থাকবে তা নির্ধারণ করে।

৪. Pagination এর জন্য TopDocs এবং ScoreDoc ব্যবহার করে Multiple Pages Retrieve করা

লুসিনে পেইজিনেশন করতে, আপনি start এবং pageSize ব্যবহার করে বিভিন্ন পেইজের ফলাফল পেতে পারেন। এখানে, আমরা প্রথম পেইজের (0-2) পর দ্বিতীয় পেইজ (3-5) এবং আরও পেইজ পেতে পারি।

উদাহরণ: Multiple Pages Retrieval

// Page 1: start = 0, pageSize = 2
TopDocs topDocsPage1 = searcher.search(query, 0 + 2);
ScoreDoc[] hitsPage1 = topDocsPage1.scoreDocs;
for (int i = 0; i < hitsPage1.length; i++) {
    int docId = hitsPage1[i].doc;
    Document doc = searcher.doc(docId);
    System.out.println("Page 1 - Doc " + (i + 1) + ": " + doc.get("content"));
}

// Page 2: start = 2, pageSize = 2
TopDocs topDocsPage2 = searcher.search(query, 2 + 2);
ScoreDoc[] hitsPage2 = topDocsPage2.scoreDocs;
for (int i = 2; i < hitsPage2.length + 2; i++) {
    int docId = hitsPage2[i - 2].doc;
    Document doc = searcher.doc(docId);
    System.out.println("Page 2 - Doc " + (i + 1) + ": " + doc.get("content"));
}

এখানে, প্রথম পেইজের জন্য start = 0 এবং দ্বিতীয় পেইজের জন্য start = 2 সেট করা হয়েছে। TopDocs এবং ScoreDoc এর মাধ্যমে আমরা নির্দিষ্ট পেইজের ফলাফল নিয়ে আসছি।


৫. TopDocs এবং ScoreDoc এর সুবিধা

  • Efficient Pagination: লুসিনের মাধ্যমে পেইজিনেশন করা অত্যন্ত দক্ষ এবং দ্রুত। TopDocs এবং ScoreDoc সার্চ কোয়েরির ফলাফল দ্রুত প্রক্রিয়া করে এবং নির্দিষ্ট পেইজের ফলাফল প্রদর্শন করতে সাহায্য করে।
  • Control over Results: আপনি ফলাফলের শুরুর পজিশন এবং ফলাফলের সংখ্যা (pageSize) নিয়ন্ত্রণ করতে পারেন, যা পেইজিনেশন প্রক্রিয়াকে আরও সঠিক এবং কার্যকরী করে তোলে।
  • Memory Management: TopDocs শুধুমাত্র পেইজের জন্য প্রয়োজনীয় ডেটা রাখে, তাই মেমরি অপটিমাইজেশন হয় এবং খুব বড় সাইজের ডেটাবেসের সাথে কাজ করার সময় এটি কার্যকর।

সারাংশ

TopDocs এবং ScoreDoc হল লুসিনের দুটি গুরুত্বপূর্ণ ক্লাস যা pagination এবং search result management করার জন্য ব্যবহৃত হয়। TopDocs কোয়েরি ফলাফলের একটি কন্টেইনার হিসেবে কাজ করে, যেখানে ScoreDoc প্রতিটি ডকুমেন্টের স্কোর এবং তথ্য ধারণ করে। এই দুটি ক্লাস ব্যবহারের মাধ্যমে আপনি সহজেই লুসিনে পেইজিনেশন এবং দ্রুত সার্চ ফলাফল পেতে পারেন।

Content added By

Apache Lucene হল একটি জনপ্রিয় ওপেন-সোর্স লাইব্রেরি যা টেক্সট ডেটা ইন্ডেক্সিং এবং সার্চিং এর জন্য ব্যবহৃত হয়। Lucene ডেটা ইন্ডেক্সিং এবং সার্চ অপারেশন পরিচালনা করার জন্য অনেক ফিচার প্রদান করে, যার মধ্যে একটি হচ্ছে Result SortingSortField এবং Sort এর মাধ্যমে আপনি সার্চ রেজাল্টগুলি সঠিকভাবে সাজাতে পারেন, যাতে সঠিক ডেটা দ্রুত পাওয়া যায়।

এই গাইডে, আমরা SortField এবং Sort এর ব্যবহার এবং কিভাবে এগুলি Lucene এ রেজাল্ট সাজানোর জন্য ব্যবহৃত হয়, তা আলোচনা করব।


১. SortField এবং Sort Overview

Lucene এ, SortField একটি ফিল্ডের উপর ভিত্তি করে রেজাল্ট সাজানোর জন্য ব্যবহৃত হয়। এটি একটি নির্দিষ্ট Field (যেমন, টেক্সট, নাম্বার বা তারিখ) কে নির্বাচন করে এবং সেই ফিল্ডের মানের উপর ভিত্তি করে রেজাল্ট সাজায়। এর পরে, Sort অবজেক্টটি বিভিন্ন SortField এর সংকলন (collection) তৈরি করে, যা বিভিন্ন ফিল্ডের উপর ভিত্তি করে সাজানোর নির্দেশ দেয়।

SortField:

  • SortField ক্লাস Lucene এ রেজাল্ট সাজানোর জন্য একটি বিশেষ ফিল্ডের উপর কাজ করে।
  • এটি বিভিন্ন ধরনের ফিল্ডকে সাপোর্ট করে যেমন String, Int, Float, Date ইত্যাদি।

Sort:

  • Sort ক্লাস SortField এর একাধিক ইনস্ট্যান্স নিয়ে রেজাল্ট সাজানোর পদ্ধতি নির্ধারণ করে।
  • এটি একাধিক ফিল্ডের উপর সাজানোর কাজ করতে সক্ষম, যেমন একটি ফিল্ডের মাধ্যমে ASCENDING এবং অন্য ফিল্ডের মাধ্যমে DESCENDING সাজানো।

২. SortField এর বিভিন্ন ধরন

Lucene বিভিন্ন ধরনের ফিল্ড সাপোর্ট করে, এবং তাদের উপর সাজানোর জন্য আলাদা আলাদা SortField ক্লাসের ব্যবহার করা হয়। এখানে কিছু প্রধান ধরন তুলে ধরা হলো:

  • SortField.Type.STRING: স্ট্রিং ফিল্ডের জন্য।
  • SortField.Type.INT: পূর্ণসংখ্যা (integer) ফিল্ডের জন্য।
  • SortField.Type.FLOAT: ফ্লোট ফিল্ডের জন্য।
  • SortField.Type.DATE: তারিখ (date) ফিল্ডের জন্য।

উদাহরণ:

// SortField example for sorting by string field (alphabetically)
SortField sortField = new SortField("name", SortField.Type.STRING);

// SortField example for sorting by date field (earliest to latest)
SortField dateSortField = new SortField("date", SortField.Type.STRING, true);  // true for descending order

৩. Sort ক্লাসের মাধ্যমে Sorting কনফিগার করা

Sort ক্লাসে এক বা একাধিক SortField ইনপুট দিয়ে আপনি সার্চ রেজাল্ট সাজাতে পারেন। আপনি ASCENDING বা DESCENDING অর্ডারে সাজানোর জন্য true বা false মান সেট করতে পারেন।

উদাহরণ:

// Sorting by name in ascending order, and by date in descending order
Sort sort = new Sort(
    new SortField("name", SortField.Type.STRING, false), // false for ascending
    new SortField("date", SortField.Type.STRING, true)   // true for descending
);

এখানে, প্রথমে name ফিল্ড ASCENDING অর্ডারে এবং তারপর date ফিল্ড DESCENDING অর্ডারে সাজানো হচ্ছে।


৪. Indexing and Searching with Sorting in Lucene

Lucene এ রেজাল্ট সঠিকভাবে সাজানোর জন্য, প্রথমে ডেটা ইন্ডেক্স করতে হয় এবং তারপর সেই ইন্ডেক্সে সার্চ করতে হয়। নিচে একটি উদাহরণ দেওয়া হলো যেখানে Lucene এর মাধ্যমে ইন্ডেক্সিং এবং সার্চিং করা হচ্ছে এবং রেজাল্টগুলি SortField এবং Sort এর মাধ্যমে সাজানো হচ্ছে।

Step 1: Indexing Documents

// Create an index writer
Directory directory = FSDirectory.open(Paths.get("path_to_index"));
Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter writer = new IndexWriter(directory, config);

// Create a document to index
Document doc = new Document();
doc.add(new TextField("name", "Alice", Field.Store.YES));
doc.add(new StringField("date", "2021-09-01", Field.Store.YES));  // Store date as a string
writer.addDocument(doc);

// Commit changes and close
writer.commit();
writer.close();

Step 2: Searching with Sorting

// Create a searcher
IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get("path_to_index")));
IndexSearcher searcher = new IndexSearcher(reader);

// Create a Sort object to sort by name and date
Sort sort = new Sort(
    new SortField("name", SortField.Type.STRING, false), // Sort by name (ascending)
    new SortField("date", SortField.Type.STRING, true)   // Sort by date (descending)
);

// Perform search with sorting
Query query = new TermQuery(new Term("name", "Alice"));
TopDocs topDocs = searcher.search(query, 10, sort);

// Display the results
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
    Document document = searcher.doc(scoreDoc.doc);
    System.out.println("Name: " + document.get("name") + ", Date: " + document.get("date"));
}

// Close the reader
reader.close();

এখানে:

  • IndexWriter এর মাধ্যমে ডকুমেন্ট ইন্ডেক্স করা হচ্ছে।
  • IndexSearcher ব্যবহার করে Query এর মাধ্যমে সার্চ করা হচ্ছে এবং Sort এর মাধ্যমে রেজাল্ট সাজানো হচ্ছে।

৫. SortField এবং Sort এর গুরুত্বপূর্ণ পয়েন্ট

  1. Multiple SortFields: আপনি একাধিক SortField ব্যবহার করে বিভিন্ন ফিল্ডের উপর সাজানো কাজ করতে পারেন।
  2. Ascending/Descending Order: আপনি SortField এর মাধ্যমে ফিল্ডগুলিকে ASCENDING বা DESCENDING অর্ডারে সাজাতে পারেন।
  3. Performance Considerations: যত বেশি ফিল্ডে সাজানো হবে, পারফরম্যান্স একটু ধীর হতে পারে। তবে, সঠিকভাবে সাজানো ফলাফল দিয়ে খোঁজা হলে, ব্যবহারকারীরা দ্রুত প্রয়োজনীয় ফলাফল পেতে সক্ষম হবে।

৬. Conclusion

Lucene তে রেজাল্ট সাজানো একটি শক্তিশালী বৈশিষ্ট্য, যা SortField এবং Sort এর মাধ্যমে সহজে কার্যকরী করা যায়। আপনি SortField এর মাধ্যমে বিভিন্ন ফিল্ডে সাজানো করতে পারেন এবং Sort এর মাধ্যমে একাধিক ফিল্ডের উপর সাজানোর কাজ করতে পারেন। Lucene এ রেজাল্ট সাজানো আপনাকে আরও দক্ষ সার্চ এবং প্রাসঙ্গিক ফলাফল প্রদান করতে সহায়তা করে, যা ব্যবহারকারীদের জন্য কার্যকরী ও দ্রুত সেবা প্রদান করে।


Content added By

Apache Lucene একটি জনপ্রিয় ওপেন সোর্স সার্চ লাইব্রেরি যা আপনাকে বিভিন্ন ডেটা সার্চ, ইনডেক্সিং এবং র্যাংকিং সিস্টেম তৈরি করতে সহায়তা করে। Lucene এ Custom Sorting Criteria যোগ করা সাধারণত Search Results Sorting এর মাধ্যমে করা হয়, যেখানে ব্যবহারকারী বিভিন্ন কাস্টম প্যারামিটার অনুযায়ী রেজাল্ট সাজাতে পারে।

Lucene এ Sorting কাজ করার পদ্ধতি সাধারণত Query এর সাথে যুক্ত থাকে, এবং এটি Sort ক্লাসের মাধ্যমে কাস্টম সোরটিং করতে সহায়তা করে। কাস্টম সোরটিং মূলত Numeric Field Sorting, Text Field Sorting, এবং Date Field Sorting সহ অন্যান্য ক্ষেত্রেও প্রয়োগ করা যায়।

এই টিউটোরিয়ালে আমরা দেখব কিভাবে Lucene এ কাস্টম সোরটিং করা যায় এবং কিভাবে এটি প্রয়োগ করা হয়।


১. Lucene Query Result Sorting এর ধারণা

Lucene সার্চ রেজাল্টকে নির্দিষ্ট Field বা Criteria অনুযায়ী সাজানোর জন্য Sort ক্লাস ব্যবহার করা হয়। এটি আপনাকে রেজাল্টগুলিকে ইনডেক্স করা Field এর উপর ভিত্তি করে সাজাতে সহায়তা করে। Lucene ডিফল্টভাবে relevance scoring এর মাধ্যমে সার্চ রেজাল্ট র্যাংক করে, কিন্তু আপনি যদি কাস্টম সোরটিং চান, তাহলে আপনাকে SortField ব্যবহার করতে হবে।


২. Lucene এ Custom Sorting Criteria যোগ করার জন্য SortField ব্যবহার করা

SortField ক্লাস হল Lucene এ একটি Field এর উপর ভিত্তি করে কাস্টম সোরটিং করার জন্য ব্যবহৃত ক্লাস। এই ক্লাসের মাধ্যমে আপনি যে কোন Field এ সোরটিং অ্যাপ্লাই করতে পারেন, যেমন String, Date, Integer, Numeric, এবং Float ফিল্ডে সোরটিং।

উদাহরণ: Custom Sorting Criteria যোগ করা

ধরা যাক, আমাদের একটি ইনডেক্সে Product ডেটা রয়েছে এবং আমরা চাই যে price ফিল্ড অনুযায়ী রেজাল্টগুলো সোরট করা হোক।

Step 1: Create Product Index with a Numeric Field

প্রথমে, Lucene IndexWriter ব্যবহার করে ইনডেক্স তৈরি করতে হবে। এখানে price ফিল্ডটি একটি numeric field হিসেবে ইনডেক্স করা হচ্ছে।

IndexWriterConfig config = new IndexWriterConfig(new StandardAnalyzer());
IndexWriter writer = new IndexWriter(directory, config);

Document doc = new Document();
doc.add(new StringField("productName", "Product 1", Field.Store.YES));
doc.add(new IntPoint("price", 100));
doc.add(new StoredField("price", 100));
writer.addDocument(doc);

doc = new Document();
doc.add(new StringField("productName", "Product 2", Field.Store.YES));
doc.add(new IntPoint("price", 200));
doc.add(new StoredField("price", 200));
writer.addDocument(doc);

writer.close();

এখানে, আমরা একটি productName এবং price ফিল্ড তৈরি করেছি, যেখানে price ফিল্ডটি IntPoint হিসেবে ইনডেক্স করা হচ্ছে (যেহেতু এটি একটি সংখ্যা)।

Step 2: Perform Search with Custom Sorting

এখন, আমরা একটি Query ব্যবহার করব এবং ফলাফলগুলি price এর উপর ভিত্তি করে সোরট করব।

DirectoryReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);

// Create a query to search for all products
Query query = new MatchAllDocsQuery();

// Create a Sort object to sort the results by price field in ascending order
Sort sort = new Sort(new SortField("price", SortField.Type.INT));

// Perform the search with sorting
TopDocs topDocs = searcher.search(query, 10, sort);

// Display sorted results
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
    Document doc = searcher.doc(scoreDoc.doc);
    System.out.println("Product Name: " + doc.get("productName") + ", Price: " + doc.get("price"));
}

reader.close();

এখানে:

  • MatchAllDocsQuery ব্যবহার করা হয়েছে যাতে সব ডকুমেন্ট সার্চ করা যায়।
  • SortField ক্লাস ব্যবহার করে আমরা price ফিল্ডের উপর সোরটিং করলাম। SortField.Type.INT ব্যবহার করা হয়েছে যেহেতু আমরা একটি integer টাইপের ফিল্ডে সোরটিং করছি।
  • searcher.search(query, 10, sort) এর মাধ্যমে সার্চ রেজাল্ট ১০টি রেজাল্ট পর্যন্ত সোরট করা হয়েছে।
Step 3: Result Output

এই কোড চালানোর পর, আপনার রেজাল্টগুলো price অনুযায়ী সোরটেড হবে:

Product Name: Product 1, Price: 100
Product Name: Product 2, Price: 200

এখানে, Product 1 এর মূল্য কম হওয়ায় এটি প্রথমে আসবে, এবং Product 2 দ্বিতীয় হবে।


৩. Custom Sorting with Date and String Fields

Lucene এ আপনি শুধু numeric fields নয়, date এবং string fields এর উপরও কাস্টম সোরটিং করতে পারেন।

Date Field Sorting Example:

// Create DateField for product creation date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = sdf.parse("2024-01-01");
Date date2 = sdf.parse("2023-01-01");

// Add documents with date fields
Document doc = new Document();
doc.add(new StringField("productName", "Product 1", Field.Store.YES));
doc.add(new SortedDocValuesField("date", new BytesRef(sdf.format(date1))));
writer.addDocument(doc);

doc = new Document();
doc.add(new StringField("productName", "Product 2", Field.Store.YES));
doc.add(new SortedDocValuesField("date", new BytesRef(sdf.format(date2))));
writer.addDocument(doc);

// Sort by date
Sort sortByDate = new Sort(new SortField("date", SortField.Type.STRING));
TopDocs topDocsByDate = searcher.search(query, 10, sortByDate);

এখানে, আমরা SortedDocValuesField ব্যবহার করে date ফিল্ডকে সোরট করলাম।


৪. Sorting by Multiple Fields

Lucene এ আপনি একাধিক ফিল্ডের উপর সোরটিং করতে পারেন। উদাহরণস্বরূপ, price এবং date এর উপর সোরটিং:

Sort sortByPriceAndDate = new Sort(
    new SortField("price", SortField.Type.INT),
    new SortField("date", SortField.Type.STRING)
);
TopDocs topDocsByMultipleFields = searcher.search(query, 10, sortByPriceAndDate);

এখানে, প্রথমে price ফিল্ডের উপর সোরটিং হবে এবং তারপর date ফিল্ডে সোরটিং করা হবে।


৫. Lucene এর SortField এবং Sorting Options

Lucene এ আপনি বিভিন্ন ধরণের সোরটিং অপশন ব্যবহার করতে পারেন:

  • SortField.Type.INT: integer ফিল্ডে সোরটিং।
  • SortField.Type.STRING: string ফিল্ডে সোরটিং।
  • SortField.Type.FLOAT: float ফিল্ডে সোরটিং।
  • SortField.Type.DATE: date ফিল্ডে সোরটিং।
  • SortField.Type.LONG: long টাইপের ফিল্ডে সোরটিং।

এছাড়া, SortField-এর মাধ্যমে আপনি ascending বা descending অর্ডারে সোরটিং করতে পারবেন।

Sort sortDesc = new Sort(new SortField("price", SortField.Type.INT, true));  // Descending

এখানে true দিয়ে descending অর্ডারে সোরটিং করা হচ্ছে।


সারাংশ

LuceneCustom Sorting Criteria যোগ করা SortField এবং Sort ক্লাসের মাধ্যমে করা হয়। Lucene এর মাধ্যমে আপনি numeric, date, string, এবং অন্যান্য কাস্টম ফিল্ডে সোরটিং প্রয়োগ করতে পারেন। আপনি একাধিক ফিল্ডে সোরটিং, ascending অথবা descending অর্ডারে সোরটিং এবং বিভিন্ন field types এর উপর সোরটিং করতে পারবেন। এটি সার্চ রেজাল্টের কার্যকারিতা এবং ইউজার ইন্টারফেসে তথ্য উপস্থাপন আরও উন্নত করতে সহায়ক।


Content added By

Lucene হল একটি শক্তিশালী ওপেন সোর্স ইন্ডেক্সিং এবং সার্চিং লাইব্রেরি যা ডেটাবেস বা ডকুমেন্ট সংগ্রহের উপর দ্রুত এবং কার্যকরী অনুসন্ধান এবং সার্চ সুবিধা প্রদান করে। যখন আমরা বড় ডেটাসেটের উপর সার্চ করতে চাই, তখন pagination (পৃষ্ঠায় বিভক্ত করা) এবং sorting (বিন্যাস করা) খুব গুরুত্বপূর্ণ। Lucenepagination এবং sorting করা খুবই সহজ, তবে কিছু কৌশল এবং সঠিক কনফিগারেশন প্রক্রিয়া অনুসরণ করতে হয়।

এই টিউটোরিয়ালে, আমরা Lucenepagination এবং 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 সার্চ রেজাল্টকে নির্দিষ্ট ক্রমে সাজায় (যেমন, অ্যাসেন্ডিং বা ডিসেন্ডিং)। এই দুটি ফিচার একত্রে ব্যবহার করে আপনি আরও প্রোডাক্টিভ এবং স্কেলেবল সার্চ ইন্টারফেস তৈরি করতে পারবেন।


Content added By
Promotion

Are you sure to start over?

Loading...