Lucene একটি শক্তিশালী এবং উচ্চ পারফরম্যান্স সিক্সচার্চ লাইব্রেরি যা ডেটার ইনডেক্সিং এবং অনুসন্ধানের জন্য ব্যবহৃত হয়। এটি ডেটাবেস অনুসন্ধান থেকে অনেক দ্রুত এবং কার্যকরী। লুসিনে, Field এমন একটি মৌলিক উপাদান যা ডেটাকে ইনডেক্স করার জন্য ব্যবহৃত হয়। লুসিনে বিভিন্ন ধরনের Field থাকে, যার মধ্যে তিনটি সাধারণ এবং গুরুত্বপূর্ণ ধরন হল: TextField, StringField, এবং StoredField। এই তিনটি Field এর ধরন এবং ব্যবহারের প্রক্রিয়া নিচে বিস্তারিতভাবে আলোচনা করা হয়েছে।
১. TextField
TextField হল একটি Field যা লুসিনে টেক্সট ডেটার ইনডেক্সিং এবং অনুসন্ধানের জন্য ব্যবহৃত হয়। এটি সাধারণত দীর্ঘ টেক্সট বা অনেক শব্দের ডেটার জন্য ব্যবহার করা হয়। TextField ব্যবহার করে, টেক্সট ডেটাকে এনকোড করে ইনডেক্স করা হয় এবং এটি পূর্ণাঙ্গ টেক্সট অনুসন্ধান (full-text search) করতে সক্ষম।
ব্যবহার:
- Tokenization: TextField ব্যবহার করলে লুসিন নিজে টেক্সটকে ছোট ছোট অংশে বিভক্ত (tokenize) করে, যাতে দ্রুত অনুসন্ধান করা যায়।
- Analyzers: TextField সাধারণত Analyzer ব্যবহার করে ইনডেক্স করা হয়, যা ডেটার অর্থপূর্ণ অংশ বের করার জন্য ব্যবহৃত হয়।
উদাহরণ:
import org.apache.lucene.document.Document;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.document.Field;
public class LuceneExample {
public void createIndex(IndexWriter writer) throws IOException {
Document doc = new Document();
doc.add(new TextField("title", "Lucene in Action", Field.Store.YES));
writer.addDocument(doc);
}
}
এখানে, "title" নামে একটি TextField তৈরি করা হয়েছে যা "Lucene in Action" টেক্সট ইনডেক্স করবে। Field.Store.YES নির্দেশ করে যে এই ফিল্ডের মান সংরক্ষিত হবে।
২. StringField
StringField হল একটি Field যা নির্দিষ্ট মান (string) ইনডেক্স করার জন্য ব্যবহৃত হয়। এটি সাধারণত ছোট ছোট স্ট্রিং ডেটা যেমন আইডি, নাম, ইত্যাদি ইনডেক্স করার জন্য উপযুক্ত। StringField ইনডেক্সিংয়ের জন্য এনকোডিং বা টোকেনাইজেশন ব্যবহার করে না, কারণ এটি প্রাথমিকভাবে সরল স্ট্রিং ডেটার জন্য ডিজাইন করা হয়েছে।
ব্যবহার:
- Exact Matching: StringField সাধারণত এক্স্যাক্ট (exact) ম্যাচিং অনুসন্ধান করার জন্য ব্যবহৃত হয়, যেমন ডেটাবেসের প্রাইমারি কী বা ইউজার আইডি।
- Non-analyzed: এটি টোকেনাইজেশন বা অ্যানালাইজিং প্রক্রিয়া ব্যবহার করে না।
উদাহরণ:
import org.apache.lucene.document.Document;
import org.apache.lucene.document.StringField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.document.Field;
public class LuceneExample {
public void createIndex(IndexWriter writer) throws IOException {
Document doc = new Document();
doc.add(new StringField("id", "12345", Field.Store.YES));
writer.addDocument(doc);
}
}
এখানে, "id" নামে একটি StringField তৈরি করা হয়েছে, যার মান "12345"। এটি ইনডেক্স করে শুধুমাত্র সঠিক স্ট্রিং ম্যাচিং করতে ব্যবহৃত হবে।
৩. StoredField
StoredField একটি Field যা ডেটার মান সংরক্ষণ করার জন্য ব্যবহৃত হয়। এটি সাধারণত ইনডেক্স করা হলেও, আপনাকে সেই ডেটা পুনরায় অনুসন্ধান বা রিটার্ন করতে সহায়তা করে। যখন আপনি StoredField ব্যবহার করেন, তখন সেই ফিল্ডের মান মূল ডেটা অনুসন্ধানের পর পাওয়া যায়।
ব্যবহার:
- Retrieving Data: এটি শুধুমাত্র ডেটা সংরক্ষণ এবং পুনরায় রিটার্ন করার জন্য ব্যবহৃত হয়, ইনডেক্সিংয়ের জন্য নয়।
- No Analyzing or Tokenization: StoredField কোনো ধরনের এনালাইজিং বা টোকেনাইজেশন ব্যবহার করে না।
উদাহরণ:
import org.apache.lucene.document.Document;
import org.apache.lucene.document.StoredField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.document.Field;
public class LuceneExample {
public void createIndex(IndexWriter writer) throws IOException {
Document doc = new Document();
doc.add(new StoredField("id", "12345"));
doc.add(new StoredField("content", "This is a stored content"));
writer.addDocument(doc);
}
}
এখানে, "id" এবং "content" ফিল্ড দুটি StoredField হিসেবে তৈরি করা হয়েছে। StoredField ডেটা ইনডেক্সিংয়ের জন্য নয়, বরং এই ডেটার মান সংরক্ষণ এবং পরে রিটার্ন করার জন্য ব্যবহৃত হয়।
৪. Field এর ধরনসমূহের তুলনা
| Field Type | Purpose | Analyzing | Tokenization | Storage |
|---|---|---|---|---|
| TextField | Full-text search, large text fields | Yes | Yes | Optional |
| StringField | Exact match search (e.g., IDs, tags) | No | No | Optional |
| StoredField | Store exact data (e.g., metadata, IDs) | No | No | Yes |
৫. Search Example using TextField, StringField, and StoredField
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.document.Document;
public class LuceneSearchExample {
public void searchIndex(IndexReader reader) throws IOException {
IndexSearcher searcher = new IndexSearcher(reader);
// Search for an exact term in StringField
Term term = new Term("id", "12345");
Query query = new TermQuery(term);
searcher.search(query, 10); // Search for matching documents
// Search for full-text match in TextField
Query textQuery = new TermQuery(new Term("content", "stored"));
searcher.search(textQuery, 10);
// Retrieve stored content
Document doc = searcher.doc(0);
System.out.println(doc.get("content"));
}
}
এখানে, StringField এবং TextField এর মাধ্যমে অনুসন্ধান করা হয়েছে। StoredField ব্যবহার করে আমরা ডেটার মান পুনরায় রিটার্ন করেছি।
সারাংশ
Lucene এ Field এর বিভিন্ন ধরন যেমন TextField, StringField, এবং StoredField ডেটা ইনডেক্সিং এবং অনুসন্ধানে ব্যবহৃত হয়। TextField সাধারণত পূর্ণাঙ্গ টেক্সট অনুসন্ধান (full-text search) এর জন্য ব্যবহৃত হয়, StringField সঠিক মিল (exact match) অনুসন্ধান জন্য উপযুক্ত, এবং StoredField ফিল্ডের মান সংরক্ষণের জন্য ব্যবহৃত হয়। এই ফিল্ড টাইপগুলির মধ্যে সঠিক নির্বাচন অনুসন্ধান কার্যকারিতা এবং পারফরম্যান্সে উন্নতি আনতে সাহায্য করে।
Read more