Skill

Query Types এবং Filters

লুসিন (Lucene) - Java Technologies

319

Apache Lucene একটি উচ্চ পারফরম্যান্স সার্চ লাইব্রেরি যা মূলত ডেটা ইনডেক্সিং এবং সার্চিং কার্যক্রমে ব্যবহৃত হয়। Lucene ডাটাবেস এবং ডকুমেন্ট স্টোরেজের মাধ্যমে দ্রুত এবং কার্যকরী সার্চ ফিচার সরবরাহ করে, বিশেষ করে যখন ডকুমেন্টের সংখ্যা অনেক বড় হয়। Query Types এবং Filters Lucene এর দুটি গুরুত্বপূর্ণ অংশ যা সার্চ ফলাফল নির্ধারণ করতে ব্যবহৃত হয়।

এই টিউটোরিয়ালে, আমরা Lucene Query Types এবং Lucene Filters সম্পর্কে বিস্তারিত আলোচনা করব এবং তাদের ব্যবহার উদাহরণের মাধ্যমে দেখাব।


১. Lucene Query Types

Lucene-এ সার্চ কুয়েরি টাইপগুলো ডেটা অনুসন্ধান এবং ফিল্টারিং এর জন্য বিভিন্ন ফিচার প্রদান করে। নিম্নলিখিত কুয়েরি টাইপগুলো সাধারণত ব্যবহৃত হয়:

১.১ Term Query

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

উদাহরণ:

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

এখানে, "content" ফিল্ডে "lucene" শব্দটি অনুসন্ধান করা হচ্ছে।

১.২ Phrase Query

Phrase Query একাধিক শব্দের সঠিক অর্ডারে একটি ফ্রেজ অনুসন্ধান করতে ব্যবহৃত হয়।

উদাহরণ:

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

এখানে, "content" ফিল্ডে "Apache Lucene" এই ফ্রেজটি অনুসন্ধান করা হচ্ছে।

১.৩ Boolean Query

Boolean Query একাধিক কুয়েরি একত্রিত করতে ব্যবহৃত হয়, যেখানে আপনি 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", "search")), BooleanClause.Occur.MUST);
Query query = builder.build();

এখানে, কুয়েরিটি এমন ডকুমেন্ট অনুসন্ধান করবে যেগুলির "content" ফিল্ডে "lucene" এবং "search" উভয় শব্দই থাকবে।

১.৪ Range Query

Range Query ব্যবহার করে আপনি নির্দিষ্ট রেঞ্জের মধ্যে থাকা ডেটা অনুসন্ধান করতে পারেন। এটি সাধারণত dates বা numerical values এর জন্য ব্যবহৃত হয়।

উদাহরণ:

Query query = IntPoint.newRangeQuery("price", 10, 100);

এখানে, "price" ফিল্ডে এমন ডকুমেন্টগুলো অনুসন্ধান করা হবে যার price 10 এবং 100 এর মধ্যে।

১.৫ Wildcard Query

Wildcard Query তে আপনি অক্ষরগুলির জন্য wildcard ব্যবহার করে নির্দিষ্ট প্যাটার্ন অনুসন্ধান করতে পারেন।

উদাহরণ:

Query query = new WildcardQuery(new Term("content", "luc*"));

এখানে, "content" ফিল্ডে এমন ডকুমেন্টগুলো অনুসন্ধান করা হবে যেখানে "luc" দিয়ে শুরু হওয়া কোনো শব্দ রয়েছে (যেমন "lucene", "luck" ইত্যাদি)।

১.৬ Fuzzy Query

Fuzzy Query শব্দের বানানগত ত্রুটি অনুসন্ধান করতে ব্যবহৃত হয়। এটি Levenshtein Distance এলগরিদম ব্যবহার করে অনুসন্ধান করে।

উদাহরণ:

Query query = new FuzzyQuery(new Term("content", "lucen"));

এখানে, "lucen" শব্দের সাথে মিল থাকা শব্দগুলো (যেমন "lucene") অনুসন্ধান করা হবে।


২. Lucene Filters

Lucene-এ Filters মূলত সার্চ রেজাল্টকে আরো সীমিত করতে ব্যবহৃত হয়। Filters কেবলমাত্র true বা false রিটার্ন করে এবং এটি scoring এর সাথে কাজ করে না, অর্থাৎ এটি কেবলমাত্র ডকুমেন্ট নির্বাচনের জন্য ব্যবহৃত হয়।

২.১ Term Filter

Term Filter একটি নির্দিষ্ট টার্মের জন্য ফিল্টার প্রয়োগ করে এবং শুধুমাত্র সেই টার্মের ডকুমেন্ট গুলি রিটার্ন করে।

উদাহরণ:

Filter filter = new TermFilter(new Term("content", "lucene"));

এখানে, "content" ফিল্ডে "lucene" টার্ম থাকা ডকুমেন্টগুলো ফিল্টার করা হবে।

২.২ Range Filter

Range Filter ডকুমেন্টগুলোকে একটি নির্দিষ্ট রেঞ্জের মধ্যে ফিল্টার করতে ব্যবহৃত হয়। এটি সাধারনত dates বা numeric values এর জন্য ব্যবহৃত হয়।

উদাহরণ:

Filter filter = new RangeFilter("price", "10", "100", true, true);

এখানে, "price" ফিল্ডের 10 থেকে 100 এর মধ্যে থাকা ডকুমেন্টগুলো ফিল্টার করা হবে।

২.৩ QueryWrapperFilter

QueryWrapperFilter ব্যবহার করে আপনি একটি কুয়েরিকে ফিল্টার হিসেবে ব্যবহার করতে পারেন।

উদাহরণ:

Filter filter = new QueryWrapperFilter(new TermQuery(new Term("content", "lucene")));

এখানে, "content" ফিল্ডে "lucene" শব্দটি থাকা ডকুমেন্টগুলো ফিল্টার করা হবে।

২.৪ Not Filter

Not Filter ব্যবহৃত হয় কোনো নির্দিষ্ট শর্তে থাকা ডকুমেন্টগুলো বাদ দিতে।

উদাহরণ:

Filter filter = new NotFilter(new TermFilter(new Term("content", "lucene")));

এখানে, "content" ফিল্ডে "lucene" শব্দ থাকা ডকুমেন্টগুলো বাদ দেওয়া হবে।


৩. Query Types এবং Filters এর মধ্যে পার্থক্য

  • Query Types হল সেই কুয়েরি যেগুলি ডকুমেন্টের স্কোর গণনা করে, অর্থাৎ এটি সার্চ ফলাফলের relevance নির্ধারণ করে। এই কুয়েরিগুলির মধ্যে Term Query, Boolean Query, Phrase Query ইত্যাদি অন্তর্ভুক্ত।
  • Filters হল কেবলমাত্র ডকুমেন্টগুলোকে নির্বাচন করার জন্য ব্যবহৃত হয় এবং এগুলির স্কোর গণনা করা হয় না। Filters সাধারণত exact matching এবং non-scoring প্রক্রিয়া হিসেবে কাজ করে। উদাহরণস্বরূপ, Range Filter, Term Filter, Not Filter ইত্যাদি।

৪. Lucene Query Types এবং Filters এর ব্যবহার

  • Query Types ব্যবহার করে যখন আপনি ডকুমেন্টের মধ্যে নির্দিষ্ট শব্দ অনুসন্ধান করেন এবং তার প্রাসঙ্গিকতা (relevance) নির্ধারণ করতে চান।
  • Filters ব্যবহার করে যখন আপনি ডকুমেন্টের একটি সাবসেট নির্বাচন করতে চান এবং প্রাসঙ্গিকতা না দেখতে চান। Filters সাধারণত স্পিড বাড়ানোর জন্য ব্যবহৃত হয়, কারণ এটি স্কোরিংয়ের বাইরে কাজ করে।

সারাংশ

LuceneQuery Types এবং Filters আপনাকে খুবই উন্নত সার্চ এবং ফিল্টারিং এর ক্ষমতা প্রদান করে। Query Types আপনাকে ডকুমেন্টের মধ্যে শব্দ অনুসন্ধান এবং স্কোর নির্ধারণ করতে সাহায্য করে, এবং Filters ব্যবহার করে আপনি ডকুমেন্ট নির্বাচন করতে পারেন নির্দিষ্ট শর্ত অনুযায়ী, যা দ্রুত এবং কার্যকরী সার্চ ফলাফল প্রদান করে। Lucene এ এই ফিচারগুলির সঠিক ব্যবহার আপনার সার্চ ফিচারের পারফরম্যান্স এবং নির্ভুলতা উন্নত করতে সাহায্য করবে।


Content added By

Apache Lucene একটি ওপেন সোর্স লাইব্রেরি যা টেক্সট সার্চ ইঞ্জিন তৈরিতে ব্যবহৃত হয়। এটি একাধিক ডকুমেন্টের মধ্যে দ্রুত এবং দক্ষভাবে অনুসন্ধান করতে সক্ষম। Lucene তে Query Types ব্যবহার করে বিভিন্ন ধরণের অনুসন্ধান কিউরি তৈরি করা হয় যা ডকুমেন্টের মধ্যে তথ্য খোঁজার প্রক্রিয়া সহজ এবং শক্তিশালী করে।

Lucene তে বিভিন্ন ধরনের কিউরি রয়েছে, যা বিভিন্ন অনুসন্ধান প্রক্রিয়া এবং সিচুয়েশনের জন্য ব্যবহৃত হয়। এই কিউরি টিপস ব্যবহার করে আপনি ডেটার মধ্যে নিখুঁত অনুসন্ধান পরিচালনা করতে পারেন। এই টিউটোরিয়ালে, আমরা Lucene Query Types এর ধারণা এবং প্রতিটি কিউরি টাইপের কাজ দেখব।


১. Lucene Query Types

Lucene তে বিভিন্ন ধরনের কিউরি ব্যবহৃত হয় যা ডেটার মধ্যে অনুসন্ধান করতে সক্ষম। এই কিউরি টিপসের মধ্যে সবচেয়ে প্রচলিত কিছু হল:

  1. Term Query
  2. Phrase Query
  3. Boolean Query
  4. Range Query
  5. Wildcard Query
  6. Fuzzy Query
  7. Prefix Query
  8. Regexp Query

২. Term Query

Term Query হল সবচেয়ে সাধারণ এবং মৌলিক কিউরি, যেখানে একটি নির্দিষ্ট শব্দ বা টার্ম অনুসন্ধান করা হয়।

উদাহরণ:

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

এখানে, content ফিল্ডে lucene টার্মটি অনুসন্ধান করা হচ্ছে। এটি ডকুমেন্টে সঠিক টার্মের উপস্থিতি পরীক্ষা করে।


৩. Phrase Query

Phrase Query এক বা একাধিক শব্দের সিকোয়েন্স বা ফ্রেজ অনুসন্ধান করতে ব্যবহৃত হয়। এটি সাধারণত শব্দের সঠিক অর্ডারে উপস্থিতি যাচাই করে।

উদাহরণ:

Query query = new PhraseQuery("content", "apache", "lucene");

এখানে, content ফিল্ডে apache lucene এই দুইটি শব্দ সঠিক অর্ডারে থাকতে হবে।


৪. Boolean Query

Boolean Query একাধিক কিউরি কন্ডিশনকে সংযুক্ত করতে ব্যবহৃত হয়, যেখানে 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", "search")), BooleanClause.Occur.MUST_NOT);
Query query = builder.build();

এখানে, প্রথমে lucene শব্দটি থাকতে হবে এবং পরে search শব্দটি থাকা যাবে না। MUST এবং MUST_NOT অপারেটর ব্যবহার করা হয়েছে।


৫. Range Query

Range Query একটি নির্দিষ্ট রেঞ্জের মধ্যে মান অনুসন্ধান করতে ব্যবহৃত হয়, যেমন সংখ্যা বা তারিখ। এটি বিভিন্ন রেঞ্জে ডেটা খুঁজে বের করতে সহায়তা করে।

উদাহরণ:

Query query = IntPoint.newRangeQuery("price", 10, 100);

এখানে, price ফিল্ডে 10 থেকে 100 এর মধ্যে মান অনুসন্ধান করা হচ্ছে।


৬. Wildcard Query

Wildcard Query বিশেষ চিহ্ন যেমন * (অজ্ঞাত কোনো সংখ্যা বা শব্দের জন্য) বা ? (একটি অক্ষরের জন্য) ব্যবহার করে অনুসন্ধান করতে সহায়তা করে। এটি ব্যবহারকারীদের অজানা বা পরিবর্তিত মান অনুসন্ধান করতে সহায়তা করে।

উদাহরণ:

Query query = new WildcardQuery(new Term("content", "luc*"));

এখানে, content ফিল্ডে যেকোনো শব্দ যেটি luc দিয়ে শুরু হয়, তা খুঁজে বের করা হবে।


৭. Fuzzy Query

Fuzzy Query শব্দের মধ্যে ছোটখাটো বানান ভুল বা ভিন্নতা থাকলে সেগুলোও মেলানোর জন্য ব্যবহৃত হয়। এটি শব্দের কাছাকাছি মিল খুঁজে বের করতে ব্যবহৃত হয়।

উদাহরণ:

Query query = new FuzzyQuery(new Term("content", "luncen"));

এখানে, luncen শব্দটির জন্য lucene সহ অন্যান্য কাছাকাছি শব্দ অনুসন্ধান করা হবে।


৮. Prefix Query

Prefix Query একটি নির্দিষ্ট শব্দের জন্য প্রিফিক্স অনুসন্ধান করতে ব্যবহৃত হয়, অর্থাৎ একটি শব্দের শুরুতে নির্দিষ্ট অংশের সাথে মিল খুঁজে বের করা হয়।

উদাহরণ:

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

এখানে, content ফিল্ডে luc দিয়ে শুরু হওয়া যেকোনো শব্দ খুঁজে বের করা হবে।


৯. Regexp Query

Regexp Query একটি নিয়মিত এক্সপ্রেশন (Regular Expression) ব্যবহার করে অনুসন্ধান করতে ব্যবহৃত হয়। এটি একটি শক্তিশালী কিউরি, যেখানে আপনি জটিল শব্দের প্যাটার্ন অনুসন্ধান করতে পারেন।

উদাহরণ:

Query query = new RegexpQuery(new Term("content", "luc.*"));

এখানে, content ফিল্ডে luc দিয়ে শুরু হওয়া সমস্ত শব্দ যেগুলো কোনভাবে পরবর্তীতে কোনো চরিত্র অনুসরণ করে, তা খুঁজে বের করা হবে।


১০. Lucene Query Types এর ব্যবহার

Lucene তে বিভিন্ন কিউরি টাইপ ব্যবহার করে আপনি সহজে এবং দ্রুতভাবে ডেটা অনুসন্ধান করতে পারেন। আপনি চাইলে Boolean, Range, Fuzzy, Wildcard, Prefix, এবং Regexp কিউরি টাইপ ব্যবহার করে বিভিন্ন ধরনের অনুসন্ধান এবং ফিল্টারিং কার্যক্রম পরিচালনা করতে পারেন।

সারাংশ

Lucene Query Types আপনাকে বিভিন্ন ধরনের অনুসন্ধান পরিচালনা করার সুযোগ দেয়। আপনি Term Query, Phrase Query, Boolean Query, Wildcard Query, Fuzzy Query, Prefix Query, এবং Regexp Query এর মাধ্যমে আপনার প্রোজেক্টে পাওয়ারফুল টেক্সট অনুসন্ধান কার্যক্রম পরিচালনা করতে পারেন। এগুলো আপনার ডেটাবেসে অথবা ডকুমেন্টে তথ্য খুঁজে বের করতে কার্যকরী ভূমিকা পালন করে।


Content added By

Apache Lucene একটি শক্তিশালী এবং জনপ্রিয় ইন্ডেক্সিং এবং সাচিং লাইব্রেরি, যা মূলত টেক্সট-ভিত্তিক ডেটার জন্য ব্যবহৃত হয়। Lucene ডকুমেন্ট ইন্ডেক্স করে এবং তারপরে বিভিন্ন ধরনের কুইরি ব্যবহার করে দ্রুত এবং কার্যকরীভাবে সাচিং করতে সহায়তা করে।

এই টিউটোরিয়ালে, আমরা Lucene Query Types এর মধ্যে জনপ্রিয় কিছু কুইরি টাইপ যেমন BooleanQuery, PhraseQuery, TermQuery, এবং WildcardQuery এর বিস্তারিত ধারণা এবং ব্যবহার উদাহরণ দেখব।


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

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

TermQuery উদাহরণ:

import org.apache.lucene.index.Term;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.Query;

public class TermQueryExample {
    public static void main(String[] args) {
        // Creating a TermQuery to search for the term "java"
        Term term = new Term("content", "java");
        Query query = new TermQuery(term);

        // Now you can use this query with an IndexSearcher to search for documents
    }
}

এখানে, TermQuery "java" শব্দটি "content" ফিল্ডে অনুসন্ধান করে।


২. PhraseQuery: একাধিক টার্মের সঠিক ক্রম অনুসন্ধান করা

PhraseQuery হল একটি কুইরি যা একাধিক টার্ম (শব্দ) এর সঠিক ক্রম অনুসন্ধান করে। এটি সাধারণত বাক্য বা প্যারাগ্রাফের সঠিক শব্দের অর্ডার অনুসন্ধান করতে ব্যবহৃত হয়।

PhraseQuery উদাহরণ:

import org.apache.lucene.search.PhraseQuery;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.Query;

public class PhraseQueryExample {
    public static void main(String[] args) {
        // Creating a PhraseQuery to search for the phrase "java programming"
        PhraseQuery.Builder builder = new PhraseQuery.Builder();
        builder.add(new Term("content", "java"));
        builder.add(new Term("content", "programming"));
        
        Query query = builder.build();

        // Now you can use this query with an IndexSearcher to search for documents
    }
}

এখানে, PhraseQuery "java programming" এর সঠিক ক্রম অনুসন্ধান করবে "content" ফিল্ডে।


৩. BooleanQuery: একাধিক কুইরি শর্তের সাথে অনুসন্ধান করা

BooleanQuery হল একটি কুইরি যা একাধিক কুইরিকে যুক্ত করতে ব্যবহৃত হয়। এটি AND, OR, এবং NOT অপারেটর দ্বারা বিভিন্ন কুইরি শর্তকে একত্রিত করতে সক্ষম। এটি শক্তিশালী অনুসন্ধান কৌশল, যেখানে একাধিক শর্তের ভিত্তিতে ডকুমেন্ট অনুসন্ধান করা হয়।

BooleanQuery উদাহরণ:

import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.Query;

public class BooleanQueryExample {
    public static void main(String[] args) {
        // Creating TermQueries
        TermQuery termQuery1 = new TermQuery(new Term("content", "java"));
        TermQuery termQuery2 = new TermQuery(new Term("content", "programming"));

        // Creating a BooleanQuery with AND operator
        BooleanQuery.Builder builder = new BooleanQuery.Builder();
        builder.add(termQuery1, BooleanClause.Occur.MUST);
        builder.add(termQuery2, BooleanClause.Occur.MUST);

        Query query = builder.build();

        // Now you can use this query with an IndexSearcher to search for documents
    }
}

এখানে, BooleanQuery দুটি TermQuery যুক্ত করা হয়েছে যেখানে MUST অপারেটর ব্যবহৃত হয়েছে, অর্থাৎ উভয় শর্ত (java এবং programming) মেলাতে হবে।

  • BooleanClause.Occur.MUST: শর্তটি অবশ্যই মেলাতে হবে।
  • BooleanClause.Occur.SHOULD: শর্তটি হয়তো মেলাতে পারে।
  • BooleanClause.Occur.MUST_NOT: শর্তটি মেলানো উচিত নয়।

৪. WildcardQuery: প্যাটার্ন বা ওয়াইল্ডকার্ড চরিত্রের সাথে অনুসন্ধান

WildcardQuery হল একটি কুইরি যা ওয়াইল্ডকার্ড চরিত্র ব্যবহার করে অনুসন্ধান সম্পাদন করে, যেমন * (যেকোনো সংখ্যা বা অক্ষর) এবং ? (একটি অক্ষর)। এটি অনুসন্ধানে আরও নমনীয়তা প্রদান করে, বিশেষত যখন আপনি কিছু অজানা অংশের জন্য অনুসন্ধান করতে চান।

WildcardQuery উদাহরণ:

import org.apache.lucene.index.Term;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.search.Query;

public class WildcardQueryExample {
    public static void main(String[] args) {
        // Creating a WildcardQuery to search for any term starting with "jav"
        WildcardQuery query = new WildcardQuery(new Term("content", "jav*"));

        // Now you can use this query with an IndexSearcher to search for documents
    }
}

এখানে, WildcardQuery "jav*" দিয়ে যে কোনো টার্ম অনুসন্ধান করবে যা "jav" দিয়ে শুরু হয়, যেমন "java", "javascript", "javac" ইত্যাদি।


৫. Lucene Query Types এর উপকারিতা

  1. TermQuery: সাধারণ এবং দ্রুত টার্ম ভিত্তিক অনুসন্ধান।
  2. PhraseQuery: একাধিক শব্দের সঠিক ক্রম অনুসন্ধান।
  3. BooleanQuery: একাধিক শর্তের ভিত্তিতে অনুসন্ধান, যেমন AND, OR, NOT শর্ত।
  4. WildcardQuery: প্যাটার্ন বা ওয়াইল্ডকার্ড ব্যবহার করে নমনীয় অনুসন্ধান।

এগুলো দিয়ে আপনি সহজেই টেক্সট অনুসন্ধান করতে পারেন এবং বিভিন্ন ডেটা ফিল্ডের মধ্যে ফলাফল সঠিকভাবে পাবেন।


সারাংশ

Lucene তে বিভিন্ন ধরনের কুইরি টেমপ্লেট এবং অপারেটর ব্যবহার করে অনুসন্ধান কাজ সম্পন্ন করা হয়। TermQuery, PhraseQuery, BooleanQuery, এবং WildcardQuery হল কিছু জনপ্রিয় কুইরি টাইপ যা আপনাকে নির্দিষ্ট শর্তের ভিত্তিতে ডকুমেন্ট খুঁজে পেতে সহায়তা করে। এই কুইরি টাইপগুলি Lucene এর শক্তিশালী অনুসন্ধান সক্ষমতাকে আরও প্রসারিত করে এবং বিভিন্ন টেক্সট ডেটার সাথে সম্পর্কিত কার্যকলাপকে সহজ করে তোলে।


Content added By

Apache Lucene একটি উচ্চ পারফরম্যান্স, ফিচার-সমৃদ্ধ টেক্সট অনুসন্ধান লাইব্রেরি যা Java এ লেখা হয়েছে। এটি ডেটা ইনডেক্সিং এবং অনুসন্ধান করার জন্য একটি শক্তিশালী ফ্রেমওয়ার্ক সরবরাহ করে। Query Filters লুসিনের অনুসন্ধান ক্ষমতাকে আরও উন্নত করে, বিশেষ করে যখন আপনি কিছু নির্দিষ্ট শর্ত বা ফিল্টারিং করতে চান, যা অনুসন্ধান ফলাফল থেকে অপ্রয়োজনীয় তথ্য বাদ দেয়।

এই টিউটোরিয়ালে, আমরা Lucene Query Filters কীভাবে কাজ করে এবং কীভাবে এটি ডেটা ফিল্টার করার জন্য ব্যবহার করা যায় তা দেখব।


১. Query Filters কি?

Query Filters হল একটি বিশেষ ধরনের ফিল্টার যা লুসিন অনুসন্ধান প্রক্রিয়ার অংশ হিসেবে নির্দিষ্ট শর্তাবলীর ভিত্তিতে ফলাফল সীমিত করে। এগুলি সাধারণত অনুসন্ধানকে আরও নির্দিষ্ট এবং নির্ভুল করে তোলে, যেমন কোনো নির্দিষ্ট ফিল্ডের উপর ভিত্তি করে অনুসন্ধান সীমাবদ্ধ করা বা সময় সীমা নির্ধারণ করা। Filters অনুসন্ধান চলাকালীন ডেটা ফিল্টার করে, কিন্তু এটি সাধারণ queries এর মতো স্কোরিং বা র্যাঙ্কিং করতে পারে না। মূলত, filters শুধুমাত্র ডেটা নির্বাচন করতে ব্যবহৃত হয়।


২. Lucene Query Filters এর মূল ধারণা

  1. Filters এবং Queries এর পার্থক্য:
    • Queries সাধারণত র্যাঙ্কিং এবং স্কোরিং এর জন্য ব্যবহৃত হয়, এবং তারা মাচিং ডকুমেন্টগুলিকে স্কোর করে।
    • Filters সাধারণত শুধুমাত্র মাচিং ডকুমেন্টগুলি নির্বাচিত করে, তবে স্কোরিং বা র্যাঙ্কিং এর সাথে কাজ করে না। এটি কার্যকরী যখন আপনি কিছু নির্দিষ্ট শর্ত বা সীমা প্রয়োগ করতে চান।
  2. Types of Filters: লুসিনে বিভিন্ন ধরনের ফিল্টার রয়েছে যেমন:
    • TermFilter: নির্দিষ্ট শর্ত অনুযায়ী ইনডেক্স করা টার্ম অনুযায়ী ডেটা ফিল্টার করে।
    • RangeFilter: একটি রেঞ্জের মধ্যে মান অনুসন্ধান করে (যেমন, নির্দিষ্ট সময়ে ডেটা নির্বাচন করা)।
    • PrefixFilter: ইনডেক্স করা টার্মের প্রিফিক্স অনুযায়ী ডেটা ফিল্টার করে।
    • BooleanFilter: একাধিক ফিল্টারকে একত্রে যুক্ত করার জন্য ব্যবহৃত হয়।

৩. Query Filters ব্যবহার করার সাধারণ সিনট্যাক্স

৩.১ TermFilter ব্যবহার

TermFilter ব্যবহার করে আপনি একটি নির্দিষ্ট টার্ম বা মানের ভিত্তিতে ফিল্টারিং করতে পারেন। এটি সাধারণত তখন ব্যবহৃত হয় যখন আপনি একটি নির্দিষ্ট টার্মের সাথে ম্যাচ করতে চান।

উদাহরণ:

import org.apache.lucene.index.Term;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.FilteredQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermFilter;

// টার্ম তৈরি
Term term = new Term("fieldname", "value");

// TermFilter তৈরি
TermFilter termFilter = new TermFilter(term);

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

// FilteredQuery তৈরি
FilteredQuery filteredQuery = new FilteredQuery(query, termFilter);

এখানে, "fieldname" ফিল্ডে "value" থাকা ডকুমেন্টগুলিই নির্বাচিত হবে।


৩.২ RangeFilter ব্যবহার

RangeFilter ব্যবহার করে আপনি একটি নির্দিষ্ট রেঞ্জের মধ্যে ডেটা ফিল্টার করতে পারেন, যেমন একটি নির্দিষ্ট সময়সীমার মধ্যে থাকা ডেটা নির্বাচন করা।

উদাহরণ:

import org.apache.lucene.search.RangeQueryBuilder;
import org.apache.lucene.search.Filter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.RangeFilter;

// রেঞ্জ ফিল্টার তৈরি
RangeFilter rangeFilter = new RangeFilter("dateField", "2022-01-01", "2022-12-31", true, true);

// রেঞ্জ অনুসারে ডেটা ফিল্টার করা
FilteredQuery filteredQuery = new FilteredQuery(query, rangeFilter);

এখানে, "dateField" এর মধ্যে ২০২২ সালের জানুয়ারি ১ থেকে ডিসেম্বর ৩১ পর্যন্ত থাকা ডকুমেন্টগুলি নির্বাচিত হবে।


৩.৩ PrefixFilter ব্যবহার

PrefixFilter ইনডেক্সে থাকা ডকুমেন্টগুলির মধ্যে নির্দিষ্ট প্রিফিক্স দ্বারা ফিল্টার করার জন্য ব্যবহৃত হয়।

উদাহরণ:

import org.apache.lucene.search.PrefixFilter;
import org.apache.lucene.index.Term;

// টার্ম তৈরি
Term prefixTerm = new Term("fieldname", "pre");

// PrefixFilter তৈরি
PrefixFilter prefixFilter = new PrefixFilter(prefixTerm);

// FilteredQuery তৈরি
FilteredQuery filteredQuery = new FilteredQuery(query, prefixFilter);

এখানে, "fieldname" ফিল্ডে "pre" প্রিফিক্স থাকা সমস্ত ডকুমেন্ট গুলি নির্বাচিত হবে।


৩.৪ BooleanFilter ব্যবহার

BooleanFilter একাধিক ফিল্টারকে একত্রে যোগ করতে ব্যবহৃত হয়, যেখানে আপনি বিভিন্ন ফিল্টারের শর্তগুলিকে যোগ করতে বা বাদ দিতে পারেন।

উদাহরণ:

import org.apache.lucene.search.BooleanFilter;
import org.apache.lucene.search.TermFilter;
import org.apache.lucene.search.Filter;
import org.apache.lucene.index.Term;

// TermFilter তৈরি
Term term1 = new Term("fieldname", "value1");
TermFilter filter1 = new TermFilter(term1);

Term term2 = new Term("fieldname", "value2");
TermFilter filter2 = new TermFilter(term2);

// BooleanFilter তৈরি
BooleanFilter booleanFilter = new BooleanFilter();
booleanFilter.add(filter1, BooleanClause.Occur.MUST);
booleanFilter.add(filter2, BooleanClause.Occur.MUST_NOT);

// FilteredQuery তৈরি
FilteredQuery filteredQuery = new FilteredQuery(query, booleanFilter);

এখানে, value1 থাকা ডকুমেন্ট নির্বাচন করা হবে কিন্তু value2 থাকা ডকুমেন্ট বাদ দেওয়া হবে।


৪. Query Filters এর পারফরম্যান্স এবং সুবিধা

  1. Performance: Filters সাধারণত queries এর চেয়ে দ্রুত কাজ করে কারণ তারা স্কোরিং বা র্যাঙ্কিং না করেই শুধু মাচিং ডকুমেন্টগুলি নির্বাচন করে। এটি বিশেষভাবে বড় ডাটাসেটের ক্ষেত্রে গুরুত্বপূর্ণ।
  2. Scalability: Filters খুব সহজেই বিভিন্ন শর্ত এবং সীমার মধ্যে ডেটা ফিল্টার করতে সক্ষম, যা একটি বড় এবং জটিল ডাটাবেসের জন্য উপযোগী।
  3. Optimized Filtering: Filters আরো নির্দিষ্টভাবে ডেটা নির্বাচন করতে সাহায্য করে, যেমন প্রিফিক্স, রেঞ্জ বা নির্দিষ্ট টার্মের ভিত্তিতে।
  4. Query Efficiency: Filters সাধারণত queries এর তুলনায় কম সময় নেয়, কারণ তারা স্কোরিং বা র্যাঙ্কিং ব্যবহার না করে, সুতরাং দ্রুত ডেটা নির্বাচন করা সম্ভব।

৫. Query Filters ব্যবহার করার প্রয়োগ ক্ষেত্র

  • Access Control: যখন নির্দিষ্ট ডেটা বা ডকুমেন্টের উপর নিয়ন্ত্রণ রাখা দরকার, তখন filters ব্যবহার করা যায়, যেমন অনুমোদিত ব্যবহারকারীদের জন্য ডেটা নির্বাচন।
  • Time-based Filtering: বিভিন্ন সময়ের মধ্যে ডেটা নির্বাচন করতে filters খুব কার্যকরী। যেমন, এক মাসের মধ্যে তৈরি ডকুমেন্টের মধ্যে অনুসন্ধান করা।
  • Geospatial Searches: নির্দিষ্ট ভৌগলিক অবস্থানে থাকা ডকুমেন্টগুলির উপর ভিত্তি করে ফিল্টার করা যায়।

সারাংশ

Query Filters ব্যবহার করে আপনি লুসিনে কার্যকরীভাবে ডেটা ফিল্টার করতে পারেন। এটি আপনাকে ডেটার মধ্যে নির্দিষ্ট শর্ত বা সীমা প্রয়োগ করতে সহায়তা করে, যেমন নির্দিষ্ট সময়সীমার মধ্যে থাকা ডেটা বা নির্দিষ্ট মানের সাথে মাচিং ডকুমেন্টগুলি নির্বাচন করা। filters দ্রুত এবং কার্যকরীভাবে ডেটা ফিল্টার করতে সাহায্য করে এবং পারফরম্যান্স উন্নত করে, বিশেষ করে বড় ডেটাসেটে।


Content added By

Lucene হল একটি উচ্চ ক্ষমতাসম্পন্ন, ওপেন সোর্স তথ্য অনুসন্ধান লাইব্রেরি যা Java ভিত্তিক। এটি ব্যবহৃত হয় টেক্সট অনুসন্ধান সিস্টেম তৈরি করতে এবং বৃহৎ পরিমাণে ডেটা খোঁজার জন্য দ্রুত কার্যকারিতা সরবরাহ করতে। লুসিনে অনুসন্ধান করার জন্য বিভিন্ন Query Types ব্যবহার করা যায়, যা অনুসন্ধান প্রক্রিয়াকে আরও নমনীয় এবং শক্তিশালী করে তোলে।

এই টিউটোরিয়ালে, আমরা Lucene তে বিভিন্ন Query Types এর মাধ্যমে অনুসন্ধান কিভাবে করা যায় তা দেখবো।


১. Lucene Query Types

Lucene এর মধ্যে কিছু প্রধান Query Types রয়েছে যেগুলির মাধ্যমে আপনি ডেটাতে দ্রুত এবং নির্ভুল অনুসন্ধান করতে পারবেন। কিছু সাধারণ Query Types হল:

  1. Term Query: একটি নির্দিষ্ট শব্দের জন্য অনুসন্ধান।
  2. Phrase Query: একটি নির্দিষ্ট বাক্যের জন্য অনুসন্ধান।
  3. Boolean Query: বিভিন্ন শর্তে অনুসন্ধান।
  4. Wildcard Query: Wildcards (* বা ?) ব্যবহার করে অনুসন্ধান।
  5. Range Query: একটি নির্দিষ্ট রেঞ্জের মধ্যে অনুসন্ধান।
  6. Fuzzy Query: শব্দে মিল খুঁজে বের করার জন্য ব্যবহার করা হয়।

২. Term Query

Term Query হল সবচেয়ে সাধারণ এবং সোজা অনুসন্ধান পদ্ধতি, যেখানে আপনি একটি নির্দিষ্ট শব্দ বা টার্মের জন্য অনুসন্ধান করেন। এটি ব্যবহার করা হয় যখন আপনি একটি নির্দিষ্ট শব্দের উপস্থিতি চেক করতে চান।

উদাহরণ: Term Query

import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.index.Term;

Term term = new Term("fieldName", "searchTerm");
Query query = new TermQuery(term);

এখানে, "fieldName" হলো ফিল্ডের নাম এবং "searchTerm" হলো যে শব্দটি আপনি খুঁজতে চান।


৩. Phrase Query

Phrase Query ব্যবহৃত হয় যখন আপনাকে একটি নির্দিষ্ট বাক্য বা বাক্যের মধ্যে শব্দগুলি নির্দিষ্ট অর্ডারে খুঁজতে হয়। এটি টার্ম কুয়েরি থেকে ভিন্ন, কারণ এতে শব্দগুলির অর্ডার গুরুত্বপূর্ণ।

উদাহরণ: Phrase Query

import org.apache.lucene.search.Query;
import org.apache.lucene.search.PhraseQuery;

PhraseQuery.Builder builder = new PhraseQuery.Builder();
builder.add(new Term("fieldName", "firstWord"));
builder.add(new Term("fieldName", "secondWord"));
Query query = builder.build();

এখানে, "firstWord" এবং "secondWord" দুটি শব্দ একটি নির্দিষ্ট অর্ডারে "fieldName" ফিল্ডে খুঁজতে হবে।


৪. Boolean Query

Boolean Query ব্যবহার করা হয় যখন আপনি একাধিক শর্ত বা টার্ম একসাথে সংযুক্ত করতে চান। এটি AND, OR, NOT অপারেটর ব্যবহার করে, যার মাধ্যমে খুবই নমনীয় অনুসন্ধান করা সম্ভব।

উদাহরণ: Boolean Query

import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.index.Term;

BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.add(new TermQuery(new Term("fieldName", "searchTerm1")), BooleanClause.Occur.MUST);
builder.add(new TermQuery(new Term("fieldName", "searchTerm2")), BooleanClause.Occur.MUST_NOT);
Query query = builder.build();

এখানে:

  • MUST: "searchTerm1" থাকতে হবে।
  • MUST_NOT: "searchTerm2" না থাকতে হবে।

৫. Wildcard Query

Wildcard Query ব্যবহার করা হয় যখন আপনি wildcards (যেমন * বা ?) ব্যবহার করে অনুসন্ধান করতে চান। * যেকোনো চরিত্র বা চরিত্রের সেটের প্রতিনিধিত্ব করে এবং ? একক চরিত্রের প্রতিনিধিত্ব করে।

উদাহরণ: Wildcard Query

import org.apache.lucene.search.Query;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.index.Term;

Query query = new WildcardQuery(new Term("fieldName", "search*"));

এখানে, "search*" অনুসন্ধান করবে এমন কোনো টার্ম যা search দিয়ে শুরু হয়, যেমন "searchterm", "searching" ইত্যাদি।


৬. Range Query

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

উদাহরণ: Range Query

import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermRangeQuery;

Query query = TermRangeQuery.newStringRange("fieldName", "startRange", "endRange", true, true);

এখানে, "startRange" এবং "endRange" হলো রেঞ্জের শুরুর এবং শেষ সীমা।


৭. Fuzzy Query

Fuzzy Query ব্যবহার করা হয় যখন আপনি কিছু অদৃশ্য বা ভুল স্পেলিং সহ শব্দের জন্য অনুসন্ধান করতে চান। এটি সাধারণত শব্দের মধ্যে একটু পরিবর্তন হওয়া (যেমন টাইপিং মিসটেক) সহ অনুসন্ধান করার জন্য ব্যবহৃত হয়।

উদাহরণ: Fuzzy Query

import org.apache.lucene.search.Query;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.index.Term;

Query query = new FuzzyQuery(new Term("fieldName", "searchTerm"));

এখানে, "searchTerm" শব্দটি কাছাকাছি শব্দের জন্য অনুসন্ধান করবে, যেমন "serchTerm" বা "serachTerm"


৮. Complete Example: Various Query Types for Searching

এখন, বিভিন্ন ধরনের Lucene Query এর সাহায্যে একটি অনুসন্ধান কীভাবে কাজ করে তা দেখব:

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 org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.PhraseQuery;
import org.apache.lucene.index.Term;

import java.nio.file.Paths;

public class LuceneSearchExample {
    public static void main(String[] args) throws Exception {
        FSDirectory directory = FSDirectory.open(Paths.get("index"));
        DirectoryReader reader = DirectoryReader.open(directory);
        IndexSearcher searcher = new IndexSearcher(reader);
        
        // Term Query
        TermQuery termQuery = new TermQuery(new Term("fieldName", "searchTerm"));
        System.out.println("Term Query Results: " + searcher.search(termQuery, 10).totalHits);

        // Boolean Query
        BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
        booleanQuery.add(new TermQuery(new Term("fieldName", "searchTerm1")), BooleanQuery.Occur.MUST);
        booleanQuery.add(new TermQuery(new Term("fieldName", "searchTerm2")), BooleanQuery.Occur.MUST_NOT);
        System.out.println("Boolean Query Results: " + searcher.search(booleanQuery.build(), 10).totalHits);

        // Phrase Query
        PhraseQuery.Builder phraseQuery = new PhraseQuery.Builder();
        phraseQuery.add(new Term("fieldName", "searchTerm1"));
        phraseQuery.add(new Term("fieldName", "searchTerm2"));
        System.out.println("Phrase Query Results: " + searcher.search(phraseQuery.build(), 10).totalHits);

        // Wildcard Query
        WildcardQuery wildcardQuery = new WildcardQuery(new Term("fieldName", "search*"));
        System.out.println("Wildcard Query Results: " + searcher.search(wildcardQuery, 10).totalHits);
        
        // Close resources
        reader.close();
        directory.close();
    }
}

এই উদাহরণে, আমরা বিভিন্ন ধরনের Lucene Query ব্যবহার করে অনুসন্ধান করছি:

  1. Term Query - নির্দিষ্ট শব্দের জন্য অনুসন্ধান।
  2. Boolean Query - একাধিক শর্তের জন্য অনুসন্ধান।
  3. Phrase Query - বাক্য অনুসন্ধান।
  4. Wildcard Query - Wildcard ব্যবহার করে অনুসন্ধান।

সারাংশ

Lucene Query Types আপনাকে খুব নমনীয়ভাবে ডেটার মধ্যে অনুসন্ধান করতে সাহায্য করে। আপনি Term Query, Phrase Query, Boolean Query, Wildcard Query, Range Query, এবং Fuzzy Query ব্যবহার করে বিভিন্ন ধরনের ডেটা অনুসন্ধান করতে পারেন। Lucene অনুসন্ধানকে আরও উন্নত করতে Query Types একসাথে ব্যবহার করে খুবই কার্যকরী অনুসন্ধান তৈরি করা সম্ভব।


Content added By
Promotion

Are you sure to start over?

Loading...