Skill

Lucene তে Searching

লুসিন (Lucene) - Java Technologies

339

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

এখানে, Lucene তে Searching নিয়ে বিস্তারিত আলোচনা করা হবে, যেখানে জানানো হবে কিভাবে Lucene তে অনুসন্ধান করা যায়, কিভাবে Query তৈরি করা হয় এবং কীভাবে সার্চ রেজাল্টকে প্রক্রিয়া করা যায়।


১. Lucene তে Searching এর ধারণা

Lucene তে সার্চ করার জন্য প্রথমে ডেটা ইনডেক্স করতে হয়, তারপর ইনডেক্স থেকে অনুসন্ধান করা হয়। সার্চিং প্রক্রিয়া দুটি প্রধান অংশে বিভক্ত:

  1. Indexing: ডেটাকে অনুসন্ধানযোগ্য ফর্ম্যাটে ইনডেক্স করা।
  2. Searching: ইনডেক্সে থাকা ডেটার মধ্যে অনুসন্ধান করা এবং ফলাফল প্রাপ্তি।

Lucene তে ইনডেক্স তৈরি করার পর, ব্যবহারকারী বিভিন্ন ধরনের queries ব্যবহার করে ডেটা অনুসন্ধান করতে পারেন। Lucene বিভিন্ন ধরনের Query classes সরবরাহ করে, যেমন TermQuery, PhraseQuery, BooleanQuery, ইত্যাদি।


২. Lucene তে Searching এর জন্য প্রয়োজনীয় ক্লাস

Lucene তে সার্চ করার জন্য কিছু মূল ক্লাস রয়েছে যা সার্চ প্রক্রিয়ায় ব্যবহৃত হয়:

  • IndexReader: এটি ইনডেক্স পড়তে ব্যবহৃত হয়।
  • IndexSearcher: এটি ইনডেক্স থেকে ডেটা সার্চ করতে ব্যবহৃত হয়।
  • QueryParser: এটি সার্চ কুয়েরি তৈরি করতে ব্যবহৃত হয়।
  • Query: এটি একটি সার্চ কুয়েরি তৈরি করে, যা ইনডেক্সে অনুসন্ধান করা হয়।

৩. Lucene তে Searching করার প্রক্রিয়া

Lucene তে সার্চ করার জন্য নিম্নলিখিত স্টেপগুলি অনুসরণ করা হয়:

৩.১ In-memory Index তৈরি করা

প্রথমে, আমরা ইনডেক্স তৈরি করব। এটি ডেটাকে অনুসন্ধানযোগ্য ফর্ম্যাটে প্রস্তুত করে।

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.RAMDirectory;

public class LuceneIndexer {

    public static void main(String[] args) throws Exception {
        RAMDirectory ramDirectory = new RAMDirectory();
        StandardAnalyzer analyzer = new StandardAnalyzer();

        // Create IndexWriter to write documents into the index
        IndexWriter writer = new IndexWriter(ramDirectory, new IndexWriterConfig(analyzer));

        // Creating a document and adding fields
        Document doc = new Document();
        doc.add(new TextField("title", "Lucene for Beginners", Field.Store.YES));
        doc.add(new TextField("content", "This is a Lucene search example.", Field.Store.YES));

        // Add document to the index
        writer.addDocument(doc);
        writer.close();
    }
}

এখানে, RAMDirectory ব্যবহার করা হয়েছে যা ইনমেমরি ডিরেক্টরি তৈরি করে, যেখানে ইনডেক্স সঞ্চিত হয়। StandardAnalyzer ব্যবহার করে ইনডেক্স লেখার জন্য আমরা একটি IndexWriter তৈরি করি।


৩.২ Searching Using Query

যখন ইনডেক্স প্রস্তুত হবে, তখন আমরা অনুসন্ধান করার জন্য IndexSearcher এবং QueryParser ব্যবহার করব।

import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.store.RAMDirectory;

public class LuceneSearcher {

    public static void main(String[] args) throws Exception {
        RAMDirectory ramDirectory = new RAMDirectory();

        // Create a query to search the title field
        Query query = new TermQuery(new Term("title", "Lucene"));

        // Search the index
        DirectoryReader reader = DirectoryReader.open(ramDirectory);
        IndexSearcher searcher = new IndexSearcher(reader);

        // Execute the search
        int hitsPerPage = 10;
        TopDocs docs = searcher.search(query, hitsPerPage);

        // Display the search results
        for (ScoreDoc scoreDoc : docs.scoreDocs) {
            Document doc = searcher.doc(scoreDoc.doc);
            System.out.println("Title: " + doc.get("title"));
            System.out.println("Content: " + doc.get("content"));
        }

        reader.close();
    }
}

এখানে, আমরা TermQuery ব্যবহার করেছি যা একটি নির্দিষ্ট টার্ম (যেমন "Lucene") অনুসন্ধান করে title ফিল্ডে। IndexSearcher ব্যবহার করে TopDocs এর মাধ্যমে আমরা সার্চ ফলাফল পেতে পারি এবং Document থেকে প্রাপ্ত ডেটা প্রদর্শন করতে পারি।


৪. Lucene Query Types

Lucene বিভিন্ন ধরনের queries সমর্থন করে, যা আপনাকে জটিল সার্চ কুয়েরি তৈরি করতে সহায়তা করে।

৪.১ TermQuery

এটি একটি সাধারণ কুয়েরি যা একটি নির্দিষ্ট টার্ম বা শব্দ অনুসন্ধান করে।

Query query = new TermQuery(new Term("content", "Lucene"));

৪.২ BooleanQuery

এটি একাধিক কুয়েরিকে যুক্ত করে (AND, OR, NOT) সার্চ করার জন্য ব্যবহৃত হয়।

BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.add(new TermQuery(new Term("content", "Lucene")), BooleanClause.Occur.MUST);
builder.add(new TermQuery(new Term("content", "example")), BooleanClause.Occur.MUST);
Query query = builder.build();

৪.৩ PhraseQuery

এটি নির্দিষ্ট শব্দের একটি সঠিক প্যারাফ্রেজ অনুসন্ধান করে।

PhraseQuery query = new PhraseQuery("content", "Lucene", "example");

৪.৪ WildcardQuery

এটি * এবং ? ওয়াইল্ডকার্ড চরিত্র ব্যবহার করে ডেটা অনুসন্ধান করতে ব্যবহৃত হয়।

Query query = new WildcardQuery(new Term("title", "Luc*"));

৪.৫ PrefixQuery

এটি একটি শব্দের প্রিফিক্স অনুসন্ধান করে।

Query query = new PrefixQuery(new Term("content", "Luce"));

৫. Lucene Search Result Handling

Lucene সার্চের ফলাফলগুলি TopDocs অবজেক্টে ফিরে আসে, যেখানে ডকুমেন্টের স্কোর এবং অন্যান্য তথ্য থাকে। আপনি ScoreDoc এর মাধ্যমে প্রতিটি ডকুমেন্টের স্কোর এবং অন্যান্য তথ্য অ্যাক্সেস করতে পারেন।

TopDocs docs = searcher.search(query, hitsPerPage);
for (ScoreDoc scoreDoc : docs.scoreDocs) {
    Document doc = searcher.doc(scoreDoc.doc);
    System.out.println("Document ID: " + scoreDoc.doc);
    System.out.println("Score: " + scoreDoc.score);
}

৬. Lucene Search Ranking

Lucene স্বয়ংক্রিয়ভাবে ডকুমেন্টগুলির স্কোর গণনা করে এবং তাদের র্যাংকিং প্রদান করে। সাধারণত, TF-IDF (Term Frequency-Inverse Document Frequency) এবং Cosine Similarity ব্যবহার করে এই স্কোর গণনা করা হয়। এটি ব্যবহারকারীকে সার্চ ফলাফলের গুরুত্ব অনুযায়ী সঠিক ডকুমেন্ট প্রাধান্য দেয়।


সারাংশ

Lucene একটি শক্তিশালী এবং দ্রুত টেক্সট সার্চ লাইব্রেরি যা ইনডেক্সিং এবং সার্চিং প্রক্রিয়াকে সহজ করে তোলে। এর মাধ্যমে আপনি ডেটার মধ্যে Text Search, Boolean Search, Phrase Search, Wildcard Search, এবং অন্যান্য জটিল সার্চ কুয়েরি তৈরি করতে পারেন। Lucene এর সাহায্যে আপনি দক্ষভাবে ডেটা অনুসন্ধান করতে পারেন এবং TopDocs, ScoreDoc এবং অন্যান্য ক্লাস ব্যবহার করে সার্চ ফলাফল পরিচালনা করতে পারেন।


Content added By

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:

  1. 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);
    }
}
  1. 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);
    }
}
  1. 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 তে বিভিন্ন ধরনের কুয়েরি ব্যবহৃত হয় যা আপনার অনুসন্ধান চাহিদা অনুযায়ী নির্বাচন করা যায়। প্রধান কুয়েরি টাইপ গুলি হলো:

  1. TermQuery: একটি নির্দিষ্ট শব্দ বা টার্ম অনুসন্ধান করতে ব্যবহৃত হয়।
  2. PhraseQuery: একাধিক শব্দের সঠিক ক্রমে অনুসন্ধান করতে ব্যবহৃত হয়।
  3. BooleanQuery: একাধিক কুয়েরি বা শর্তকে যুক্ত করে একটি যৌথ অনুসন্ধান তৈরি করতে ব্যবহৃত হয়।
  4. WildcardQuery: যেকোনো শব্দের জন্য ওয়াইল্ডকার্ড (যেমন *, ?) ব্যবহার করা হয়।
  5. RangeQuery: একটি নির্দিষ্ট পরিসরে মানের অনুসন্ধান করতে ব্যবহৃত হয়।
  6. FuzzyQuery: প্রায় সাদৃশ্য শব্দের জন্য অনুসন্ধান করতে ব্যবহৃত হয় (যেমন টাইপো সহ শব্দ)।

সারাংশ

Lucene একটি শক্তিশালী টেক্সট অনুসন্ধান লাইব্রেরি, যা Searcher ক্লাস এবং Query এর মাধ্যমে ইনডেক্স করা ডেটাতে দ্রুত এবং নির্ভুল অনুসন্ধান পরিচালনা করতে সাহায্য করে। IndexSearcher ক্লাস ইনডেক্স থেকে ডেটা অনুসন্ধান করে, এবং Query ক্লাস বিভিন্ন ধরনের কুয়েরি তৈরি করতে ব্যবহৃত হয়, যেমন TermQuery, BooleanQuery, PhraseQuery ইত্যাদি। এই কুয়েরি গুলি অনুসন্ধান কার্যক্রমের জন্য ব্যবহৃত হয়ে থাকে, এবং TopDocs এর মাধ্যমে ফলাফল প্রাপ্ত হয়। Lucene এর মাধ্যমে আপনি দক্ষভাবে ডেটা অনুসন্ধান করতে পারেন এবং এটি বড় পরিমাণ ডেটার জন্য অত্যন্ত কার্যকর।


Content added By

Apache Lucene একটি জনপ্রিয় ওপেন সোর্স লাইব্রেরি যা ডকুমেন্ট ইনডেক্সিং এবং সার্চিংয়ের জন্য ব্যবহৃত হয়। এটি অত্যন্ত কার্যকরী এবং দ্রুত সার্চ ইঞ্জিন তৈরি করতে সাহায্য করে। Lucene তে ডকুমেন্ট ইনডেক্স এবং সার্চ পরিচালনা করার জন্য বিভিন্ন ধরনের কুয়েরি ব্যবহৃত হয়। এই টিউটোরিয়ালে, আমরা দুটি সাধারণ কুয়েরি: TermQuery এবং MatchAllDocsQuery এর মাধ্যমে কীভাবে ডকুমেন্ট সার্চ করা যায় তা দেখব।


১. TermQuery: সুনির্দিষ্ট শব্দ অনুসন্ধান

TermQuery একটি খুব সাধারণ কুয়েরি যা নির্দিষ্ট একটি শব্দ বা টার্ম (Term) অনুসন্ধান করে। এটি সাধারণত যখন আপনি কোন একটি নির্দিষ্ট শব্দের ভিত্তিতে ডকুমেন্ট খুঁজতে চান তখন ব্যবহার হয়।

TermQuery এর কাজের প্রক্রিয়া:

  1. এটি একটি নির্দিষ্ট শব্দ বা টার্মের জন্য ইনডেক্সে অনুসন্ধান করে।
  2. টার্মের সাথে মিল থাকা সমস্ত ডকুমেন্টকে ফেরত দেয়।

উদাহরণ: TermQuery এর ব্যবহার

import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.document.Document;

import java.io.IOException;
import java.nio.file.Paths;

public class LuceneTermQueryExample {

    public static void main(String[] args) throws IOException {
        // IndexDirectory থেকে ইনডেক্স পড়া
        Directory directory = FSDirectory.open(Paths.get("path/to/index"));
        IndexReader reader = DirectoryReader.open(directory);
        IndexSearcher searcher = new IndexSearcher(reader);
        
        // TermQuery তৈরি
        Term term = new Term("content", "Lucene"); // "content" ফিল্ডে "Lucene" টার্ম খোঁজা
        Query query = new TermQuery(term);

        // অনুসন্ধান করা
        TopDocs topDocs = searcher.search(query, 10); // 10টি রেজাল্ট ফেরত আনবে
        System.out.println("Number of Hits: " + topDocs.totalHits);

        // রেজাল্ট দেখানো
        for (int i = 0; i < topDocs.scoreDocs.length; i++) {
            Document doc = searcher.doc(topDocs.scoreDocs[i].doc);
            System.out.println("Document " + i + ": " + doc.get("content"));
        }

        reader.close();
    }
}

এখানে, TermQuery ব্যবহার করে "content" ফিল্ডে "Lucene" টার্মটি খুঁজে বের করা হয়েছে। searcher.search() মেথডে এই কুয়েরি চালানো হয়েছে এবং প্রথম 10টি রেজাল্ট প্রদর্শিত হচ্ছে।


২. MatchAllDocsQuery: সমস্ত ডকুমেন্ট অনুসন্ধান

MatchAllDocsQuery একটি বিশেষ ধরনের কুয়েরি যা ইনডেক্সে থাকা সমস্ত ডকুমেন্টকে মেলানো হয়। এটি কোনও নির্দিষ্ট শব্দ বা শর্ত ছাড়া সমস্ত ডকুমেন্টকে ফেরত দেয়। এটি সাধারণত সেই পরিস্থিতিতে ব্যবহৃত হয় যখন আপনাকে সমস্ত ডকুমেন্টের উপর কোনো ধরনের ফিল্টার বা শর্ত না রেখে অনুসন্ধান করতে হয়।

MatchAllDocsQuery এর কাজের প্রক্রিয়া:

  1. এটি সমস্ত ডকুমেন্টের জন্য অনুসন্ধান চালায় এবং সকল ডকুমেন্ট ফেরত দেয়।

উদাহরণ: MatchAllDocsQuery এর ব্যবহার

import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.document.Document;

import java.io.IOException;
import java.nio.file.Paths;

public class LuceneMatchAllDocsQueryExample {

    public static void main(String[] args) throws IOException {
        // IndexDirectory থেকে ইনডেক্স পড়া
        Directory directory = FSDirectory.open(Paths.get("path/to/index"));
        IndexReader reader = DirectoryReader.open(directory);
        IndexSearcher searcher = new IndexSearcher(reader);

        // MatchAllDocsQuery তৈরি
        Query query = new MatchAllDocsQuery();

        // অনুসন্ধান করা
        TopDocs topDocs = searcher.search(query, 10); // 10টি রেজাল্ট ফেরত আনবে
        System.out.println("Number of Hits: " + topDocs.totalHits);

        // রেজাল্ট দেখানো
        for (int i = 0; i < topDocs.scoreDocs.length; i++) {
            Document doc = searcher.doc(topDocs.scoreDocs[i].doc);
            System.out.println("Document " + i + ": " + doc.get("content"));
        }

        reader.close();
    }
}

এখানে, MatchAllDocsQuery ব্যবহার করে ইনডেক্সের সব ডকুমেন্টগুলোকে অনুসন্ধান করা হয়েছে। এটি সকল ডকুমেন্টের উপর কুয়েরি চালায় এবং প্রথম 10টি রেজাল্ট ফেরত দেয়।


৩. TermQuery এবং MatchAllDocsQuery এর মধ্যে পার্থক্য

  • TermQuery: এটি নির্দিষ্ট একটি টার্ম (শব্দ) অনুসন্ধান করে। এটি সাধারণত যখন আপনি একটি নির্দিষ্ট শব্দ বা শর্ত দিয়ে ডকুমেন্ট খুঁজতে চান তখন ব্যবহৃত হয়।
  • MatchAllDocsQuery: এটি কোনো নির্দিষ্ট শর্ত ছাড়া সকল ডকুমেন্টকে অনুসন্ধান করে। এটি সাধারণত সমস্ত ডকুমেন্টের উপর কিছু ফিল্টার বা শর্ত ছাড়াই অনুসন্ধান করতে ব্যবহৃত হয়।

সারাংশ

LuceneTermQuery এবং MatchAllDocsQuery হল দুটি মৌলিক এবং কার্যকরী কুয়েরি যা ডকুমেন্ট অনুসন্ধান করতে ব্যবহৃত হয়। TermQuery ব্যবহার করে আপনি একটি নির্দিষ্ট শব্দের ভিত্তিতে ডকুমেন্ট খুঁজতে পারেন, যখন MatchAllDocsQuery ব্যবহার করে আপনি সমস্ত ডকুমেন্টের মধ্যে অনুসন্ধান করতে পারেন। এই দুটি কুয়েরি ম্যাপিং এবং অনুসন্ধান প্রক্রিয়াকে আরও সহজ এবং কার্যকরী করে তোলে।


Content added By

Lucene একটি powerful information retrieval লাইব্রেরি যা ডেটা ইন্ডেক্সিং এবং সার্চিংয়ের জন্য ব্যবহৃত হয়। এটি জাভা ভিত্তিক এবং মূলত টেক্সট ডকুমেন্টের মধ্যে দ্রুত সার্চ এবং রিট্রিভাল করার জন্য ব্যবহৃত হয়। QueryParser হল Lucene এর একটি গুরুত্বপূর্ণ অংশ যা ব্যবহারকারীদের complex query তৈরি করতে সক্ষম করে, যেমন Boolean queries, wildcard queries, ফিল্টারিং, এবং প্যাটার্ন ম্যাচিং ইত্যাদি।

এই টিউটোরিয়ালে, আমরা QueryParser এর মাধ্যমে কীভাবে complex query তৈরি করা যায় এবং এটি কিভাবে কার্যকরীভাবে কাজ করে তা আলোচনা করব।


১. QueryParser এর ভূমিকা

QueryParser হল Lucene এর একটি ক্লাস যা Lucene Query Syntax ব্যবহার করে সার্চ কন্ডিশন বা কুয়েরি তৈরি করতে সাহায্য করে। এটি একটি string ইনপুট গ্রহণ করে এবং এটি একটি Lucene Query Object তে রূপান্তরিত করে।

QueryParser ব্যবহার করে আপনি full-text search, Boolean search, wildcard search, range search, এবং আরও অনেক ধরনের complex query তৈরি করতে পারেন।


২. QueryParser এর মূল সুবিধা

  1. Text Query Parsing: QueryParser ব্যবহারকারীদের লেখনির মাধ্যমে সাধারণ ও জটিল প্রশ্ন তৈরি করার সুযোগ দেয়।
  2. Flexible Query Types: Boolean, Phrase, Range, Wildcard, Fuzzy queries এর মতো একাধিক কুয়েরি টাইপ সাপোর্ট করে।
  3. Search Optimization: পারফরম্যান্স উন্নত করতে সঠিক এবং কার্যকরী কুয়েরি তৈরি করতে সাহায্য করে।

৩. QueryParser এর সাথে Simple Query তৈরি

QueryParser দিয়ে আপনি খুব সহজেই সাধারণ queries তৈরি করতে পারেন। নিম্নলিখিত উদাহরণে Lucene Query তৈরি করা হয়েছে।

উদাহরণ: Simple Query

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;

import java.nio.file.Paths;

public class SimpleQueryExample {
    public static void main(String[] args) throws Exception {
        // Index Directory
        FSDirectory directory = FSDirectory.open(Paths.get("index"));

        // Index Reader and Searcher
        DirectoryReader reader = DirectoryReader.open(directory);
        IndexSearcher searcher = new IndexSearcher(reader);

        // Create QueryParser
        StandardAnalyzer analyzer = new StandardAnalyzer();
        QueryParser parser = new QueryParser("content", analyzer);
        
        // Parse a simple query
        String queryString = "java";
        Query query = parser.parse(queryString);

        // Search and display results
        System.out.println("Searching for: " + queryString);
        System.out.println("Total Results: " + searcher.count(query));

        reader.close();
    }
}

এখানে, QueryParser দিয়ে একটি সাধারণ কুয়েরি "java" তৈরি করা হয়েছে যা ইন্ডেক্সের content ফিল্ডে সার্চ করবে।


৪. Complex Query তৈরি করা QueryParser এর মাধ্যমে

এখন, আসুন complex queries তৈরি করি, যেমন Boolean Query, Phrase Query, Wildcard Query, এবং Range Query

৪.১ Boolean Query

Boolean Query ব্যবহার করে আপনি একাধিক শর্তকে যুক্ত বা বাদ দিতে পারেন (যেমন AND, OR, NOT)। এটি কমপ্লেক্স সার্চ ইস্যুগুলির জন্য উপকারী।

import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.BooleanClause;

QueryParser parser = new QueryParser("content", analyzer);

// Create a boolean query that includes two conditions
BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.add(parser.parse("java"), BooleanClause.Occur.MUST);
builder.add(parser.parse("lucene"), BooleanClause.Occur.MUST_NOT);
BooleanQuery booleanQuery = builder.build();

এখানে, "java" শব্দটি MUST (অবশ্যই থাকতে হবে) এবং "lucene" শব্দটি MUST_NOT (থাকতে হবে না) থাকবে।

৪.২ Phrase Query

Phrase Query ব্যবহার করে আপনি যেকোনো নির্দিষ্ট শব্দের সিকোয়েন্সে সার্চ করতে পারেন।

Query phraseQuery = new QueryParser("content", analyzer).parse("\"Java Lucene tutorial\"");

এখানে, "Java Lucene tutorial" একটি নির্দিষ্ট শব্দের সিকোয়েন্স হিসেবে মানা হচ্ছে, অর্থাৎ, এই নির্দিষ্ট সিকোয়েন্সটি ডকুমেন্টে থাকতে হবে।

৪.৩ Wildcard Query

Wildcard Query দিয়ে আপনি ডকুমেন্টের মধ্যে আংশিক ম্যাচিং করতে পারেন, যেমন * এবং ? ব্যবহার করে।

Query wildcardQuery = new QueryParser("content", analyzer).parse("java*");

এখানে, java* দ্বারা সমস্ত শব্দ যেগুলি "java" দিয়ে শুরু হয় (যেমন "java", "javac", "javascript" ইত্যাদি) সার্চ করা হবে।

৪.৪ Range Query

Range Query ব্যবহার করে আপনি একটি নির্দিষ্ট মানের মধ্যে অনুসন্ধান করতে পারেন, যেমন তারিখ বা সংখ্যা।

Query rangeQuery = new QueryParser("date", analyzer).parse("[2020-01-01 TO 2022-01-01]");

এখানে, ডেটার মধ্যে ২০২০-০১-০১ থেকে ২০২২-০১-০১ এর মধ্যে কোন মান থাকবে এমন ডকুমেন্ট খুঁজবে।


৫. QueryParser ব্যবহার করে Query বেলিডেশন

QueryParser একাধিক ফিচার সমর্থন করে এবং ডিফল্ট সিম্বোলিক কুয়েরি সঠিকভাবে পার্স করার মাধ্যমে ব্যবহারকারীদের জন্য একটি নিরাপদ এবং কার্যকরী সার্চ অভিজ্ঞতা তৈরি করে। এটি ইন্টারনাল কোডে আংশিক কুয়েরি অথবা ভুল কুয়েরি যাচাই করার জন্য খুবই কার্যকরী।

উদাহরণ: Query Validation

try {
    String queryString = "java AND lucene OR tutorial";
    Query query = parser.parse(queryString);
    // Execute search
} catch (Exception e) {
    System.err.println("Query parse error: " + e.getMessage());
}

এখানে, ভুল বা অস্বীকৃত কুয়েরি সিনট্যাক্স হলে, এটি Exception ফেলে দেয়, যা আমাদের লগিং বা সমস্যার সমাধানে সহায়ক হবে।


৬. QueryParser ব্যবহার করে Search Execution

একবার কুয়েরি তৈরি হলে, আপনি IndexSearcher ব্যবহার করে ইন্ডেক্সে সার্চ করতে পারেন এবং রেজাল্ট প্রসেস করতে পারেন।

উদাহরণ: Search Execution

TopDocs results = searcher.search(query, 10); // Search for the first 10 results
ScoreDoc[] hits = results.scoreDocs;

for (ScoreDoc hit : hits) {
    Document doc = searcher.doc(hit.doc);
    System.out.println(doc.get("content"));
}

এখানে, searcher.search(query, 10) কুয়েরি চালিয়ে প্রথম ১০টি রেজাল্ট খুঁজে বের করবে এবং প্রতিটি রেজাল্টের content ফিল্ড প্রিন্ট করবে।


সারাংশ

Lucene QueryParser একটি শক্তিশালী টুল যা ব্যবহারকারীদের জন্য সহজে complex query তৈরি করার সুযোগ দেয়। এটি Boolean, Phrase, Wildcard, এবং Range queries এর মতো বিভিন্ন ধরনের কুয়েরি তৈরি করতে সাহায্য করে, যা Lucene সার্চ ইঞ্জিনের সাথে দ্রুত এবং নির্ভুল সার্চ কার্যকরী করতে ব্যবহৃত হয়। QueryParser একটি সিম্পল এবং ইফিশিয়েন্ট পদ্ধতি প্রদান করে যে কিভাবে আপনি টেক্সট ডকুমেন্টে ভিন্ন ধরনের কুয়েরি প্রয়োগ করবেন।


Content added By

Apache Lucene হল একটি অত্যন্ত শক্তিশালী text search library যা Java ভিত্তিক অ্যাপ্লিকেশনের জন্য ব্যবহৃত হয়। এটি ইনডেক্স তৈরি এবং কাস্টম টেক্সট অনুসন্ধানের জন্য ব্যবহৃত হয়। লুসিন ইনডেক্সিং এবং সাচিং এর ক্ষেত্রে একটি খুবই দ্রুত এবং কার্যকরী পদ্ধতি প্রদান করে।

এখানে আমরা দেখবো কিভাবে LuceneText 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 এর মাধ্যমে টেক্সট অনুসন্ধান এবং ফ্রেজ অনুসন্ধান করতে সাহায্য করবে।

Content added By
Promotion

Are you sure to start over?

Loading...