Lucene একটি ওপেন সোর্স, উচ্চ পারফরম্যান্স ওয়েব সার্চ ইঞ্জিন লাইব্রেরি যা Java এ তৈরি করা হয়েছে। Lucene ডকুমেন্ট ইনডেক্সিং এবং সার্চের জন্য একটি শক্তিশালী টুল। Document লুসিনে এক ধরনের ডেটা অবজেক্ট, যার মধ্যে Field থাকে, যা সার্চ ইন্ডেক্সের অংশ হিসেবে তথ্য ধারণ করে। ডকুমেন্টের ফিল্ডগুলো লুসিন ইনডেক্সে সংরক্ষিত হয় এবং পরবর্তীতে সার্চ কুয়েরির মাধ্যমে সেগুলো খোঁজা যায়।
এতে আপনি বিভিন্ন ধরনের ফিল্ড তৈরি এবং যোগ করতে পারবেন, যেমন টেক্সট, স্টোরড ডেটা, বা নম্বর। এখানে, আমরা দেখব কিভাবে Lucene Document তৈরি করা হয় এবং কিভাবে Field যোগ করা হয়।
১. Lucene Document এর ধারণা
Lucene Document একটি ডেটা কন্টেইনার, যা Field নামক এক বা একাধিক উপাদান ধারণ করে। প্রতিটি Field একটি বিশেষ ধরনের ডেটা ধারণ করে এবং এটি Index বা Store করা যেতে পারে। Field সাধারণত দুটি বিভাগে বিভক্ত:
- Stored Fields: যে ফিল্ডগুলোর মান সার্চ রেজাল্টে ফেরত আসে। যেমন, আপনার সার্চ রেজাল্টের মধ্যে প্রয়োজনীয় তথ্য।
- Indexed Fields: যে ফিল্ডগুলোর মান শুধুমাত্র সার্চ করতে ব্যবহার করা হয়, কিন্তু রেজাল্টে ফেরত আসেনা।
২. Lucene Document এবং Field তৈরি করার প্রক্রিয়া
Lucene এ একটি Document তৈরি করতে, প্রথমে আপনাকে Field তৈরি করতে হবে। এরপর, সেগুলোকে Document এ যোগ করতে হবে।
২.১ Lucene Document এবং Field তৈরি করার উদাহরণ
Lucene Field তৈরি করতে আপনাকে Field ক্লাস ব্যবহার করতে হবে। এটি সাধারণত দুইটি প্রধান ধরনের ফিল্ড তৈরি করতে ব্যবহৃত হয়:
- TextField: যেটি মূলত টেক্সট ডেটার জন্য ব্যবহৃত হয়, এবং এটি ইন্ডেক্সড হয়।
- StoredField: যেটি শুধুমাত্র ডেটা স্টোর করতে ব্যবহৃত হয়, এটি ইন্ডেক্সড হয় না।
উদাহরণ:
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.document.StoredField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.store.Directory;
public class LuceneExample {
public static void main(String[] args) throws Exception {
// Lucene Directory তৈরি করা
Directory directory = new RAMDirectory();
// IndexWriterConfig তৈরি করা
IndexWriterConfig config = new IndexWriterConfig(new StandardAnalyzer());
// IndexWriter তৈরি করা
IndexWriter writer = new IndexWriter(directory, config);
// Document তৈরি করা
Document document = new Document();
// Field যোগ করা (TextField এবং StoredField)
document.add(new TextField("title", "Lucene in Action", Field.Store.YES));
document.add(new TextField("content", "Lucene is a powerful search library", Field.Store.NO));
document.add(new StoredField("author", "John Doe"));
// Document কে IndexWriter এ যোগ করা
writer.addDocument(document);
// IndexWriter বন্ধ করা
writer.close();
// DirectoryReader এর মাধ্যমে ডকুমেন্ট রিড করা
DirectoryReader reader = DirectoryReader.open(directory);
System.out.println("Total number of documents: " + reader.numDocs());
// Reader বন্ধ করা
reader.close();
directory.close();
}
}
এখানে:
- TextField: "title" এবং "content" ফিল্ড টেক্সট ডেটার জন্য ব্যবহৃত হয়েছে। "title" ফিল্ডের জন্য স্টোরিং সেট করা হয়েছে, কিন্তু "content" শুধুমাত্র ইনডেক্স করা হয়েছে।
- StoredField: "author" ফিল্ডটি শুধু স্টোর করার জন্য ব্যবহার করা হয়েছে এবং এটি সার্চ রেজাল্টের অংশ হিসেবে ব্যবহার হতে পারে।
৩. Field Types in Lucene
Lucene এ বিভিন্ন ধরনের Field ব্যবহার করা যায়, যেগুলো বিভিন্ন ধরনের ডেটা হ্যান্ডল করতে সহায়তা করে:
- TextField: সাধারণত টেক্সট ডেটা, যেমন নাম বা বিবরণ, ইন্ডেক্সিং এবং স্টোরিং জন্য ব্যবহার করা হয়।
- StoredField: শুধুমাত্র ডেটা স্টোর করার জন্য ব্যবহৃত হয়। এটি ইনডেক্সিং হয় না, কিন্তু সার্চ রেজাল্টে ফেরত আনা যায়।
- StringField: স্টোরড ডেটা যেমন স্ট্রিং ভ্যালু ধারণ করতে ব্যবহৃত হয় এবং এটি NOT_ANALYZED।
- IntPoint: ইন্টিজার ডেটার জন্য ব্যবহৃত হয়, যেটি কমপ্লেক্স কোয়েরি পরিচালনা করতে সহায়তা করে।
- DoublePoint: ডাবল টাইপ ডেটা ব্যবহার করতে সহায়তা করে।
- LongPoint: লং টাইপ ডেটা।
- SortedDocValuesField: ডেটা সোর্টিংয়ের জন্য ব্যবহৃত হয়।
উদাহরণ:
document.add(new IntPoint("age", 30));
document.add(new DoublePoint("salary", 55000.50));
document.add(new StringField("status", "active", Field.Store.YES));
এখানে:
- IntPoint: "age" ফিল্ডে ইন্টিজার ডেটা সংরক্ষণ করা হচ্ছে।
- DoublePoint: "salary" ফিল্ডে ডাবল টাইপ ডেটা সংরক্ষণ করা হচ্ছে।
- StringField: "status" ফিল্ডে স্ট্রিং ডেটা সংরক্ষণ করা হচ্ছে।
৪. Lucene Indexing Process
Lucene এ ডেটা ইনডেক্স করার প্রক্রিয়াটি বেশ সহজ এবং দ্রুত। উপরের উদাহরণে আমরা দেখেছি কিভাবে Document তৈরি করা এবং এতে Field যোগ করা হয়। এরপর IndexWriter এর মাধ্যমে এই ডকুমেন্ট ইনডেক্স করা হয়। আপনি যে ডেটা ইনডেক্স করবেন তা TextField বা StoredField এর মাধ্যমে সঠিকভাবে সংরক্ষণ এবং অনুসন্ধানযোগ্য করা হয়।
- IndexWriter: এটি মূলত ডকুমেন্টকে ইনডেক্সে সংরক্ষণ করে।
- Document: এটি ফিল্ডগুলো ধারণ করে এবং ইনডেক্সে সংরক্ষিত হয়।
- Field: এটি ডেটার একক অংশ বা বৈশিষ্ট্য, যেমন নাম, বয়স, ইত্যাদি।
৫. Lucene Search
Lucene ইনডেক্সিংয়ের পর আপনি Query এর মাধ্যমে ডেটা অনুসন্ধান করতে পারেন। এটি একটি দ্রুত এবং শক্তিশালী সার্চ ইঞ্জিন হিসেবে কাজ করে, যা আপনাকে ইনডেক্স করা ডেটা দ্রুত খুঁজে বের করতে সহায়তা করে।
উদাহরণ: Query ব্যবহার করে Search করা
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TopDocs;
DirectoryReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
QueryParser parser = new QueryParser("content", new StandardAnalyzer());
Query query = parser.parse("Lucene");
TopDocs results = searcher.search(query, 10);
System.out.println("Total hits: " + results.totalHits.value);
এখানে, QueryParser ব্যবহার করে content ফিল্ডে "Lucene" শব্দটি অনুসন্ধান করা হচ্ছে।
সারাংশ
Lucene একটি শক্তিশালী টুল যা Document এর মধ্যে Field যোগ করে ডেটা ইনডেক্স এবং সার্চের কার্যক্রম পরিচালনা করতে সহায়তা করে। TextField, StoredField, IntPoint, StringField ইত্যাদি ফিল্ডের মাধ্যমে আপনি বিভিন্ন ধরনের ডেটা সংরক্ষণ এবং অনুসন্ধান করতে পারেন। Lucene Indexing প্রক্রিয়া দ্রুত এবং কার্যকর, যা বড় ডেটাসেটের জন্য খুবই উপকারী। Lucene Search ব্যবহার করে আপনি সহজেই ইনডেক্স করা ডেটা খুঁজে পেতে পারেন।
Read more