Lucene হল একটি জনপ্রিয় ওপেন সোর্স তথ্য অনুসন্ধান লাইব্রেরি যা full-text search করতে ব্যবহৃত হয়। এটি একটি শক্তিশালী এবং দ্রুত অনুসন্ধান ইঞ্জিন তৈরি করার জন্য একটি নীতিমালা প্রদান করে। Lucene ডেটাকে index করে এবং তারপর তা search করতে ব্যবহৃত হয়। Lucene তে Document এবং Field দুটি গুরুত্বপূর্ণ উপাদান রয়েছে যেগুলি তথ্য সংরক্ষণ এবং অনুসন্ধানে ব্যবহৃত হয়।
এখানে, আমরা Lucene Document এবং Field এর কাজ এবং ব্যবহার সম্পর্কিত বিস্তারিত আলোচনা করব।
১. Document এবং Field এর ধারণা
১.১ Document:
Lucene এর Document হল একটি তথ্যের একক একক ইউনিট বা রেকর্ড যা ইন্ডেক্সে সংরক্ষিত হয়। এটি একাধিক Field ধারণ করতে পারে, যেখানে প্রতিটি Field একটি নির্দিষ্ট ডেটার অংশকে প্রতিনিধিত্ব করে (যেমন, নাম, বয়স, ঠিকানা ইত্যাদি)। একে সাদৃশ্যপূর্ণভাবে একটি database record বা row হিসেবে ভাবা যেতে পারে।
- Document একে অপরের সাথে সম্পর্কিত Fields ধারণ করে যা মূলত একটি সার্চযোগ্য তথ্যের ইউনিট হিসেবে কাজ করে।
১.২ Field:
Field একটি Document এর মধ্যে একটি মৌলিক উপাদান যা একটি নির্দিষ্ট ধরনের ডেটা ধারণ করে। প্রতিটি Field এর একটি name এবং value থাকে। এর মাধ্যমে ডেটা সঠিকভাবে ইন্ডেক্স করা এবং সার্চ করা সম্ভব হয়।
Field তে দুটি গুরুত্বপূর্ণ উপাদান থাকে:
- name: এটি একটি স্ট্রিং যা ফিল্ডটির পরিচয় নির্ধারণ করে (যেমন, "title", "content", "author" ইত্যাদি)।
- value: এটি ফিল্ডের মান বা ডেটা যা সংরক্ষিত থাকে (যেমন, একটি টেক্সট, সংখ্যা বা তারিখ)।
২. Document এবং Field তৈরি করা
Lucene তে Document এবং Field তৈরি করা খুবই সহজ। একটি Document তৈরি করতে, আপনি Document ক্লাসের একটি ইনস্ট্যান্স তৈরি করবেন এবং তারপর এতে Field যোগ করবেন।
উদাহরণ: Document এবং Field তৈরি করা
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
public class LuceneExample {
public static void main(String[] args) throws Exception {
// ইনডেক্স ডিরেক্টরি তৈরি
RAMDirectory directory = new RAMDirectory();
// ইনডেক্স লেখক তৈরি
StandardAnalyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter writer = new IndexWriter(directory, config);
// একটি ডকুমেন্ট তৈরি
Document doc = new Document();
// ফিল্ড তৈরি এবং ডকুমেন্টে যোগ করা
doc.add(new TextField("title", "Lucene Basics", Field.Store.YES));
doc.add(new TextField("content", "This is an introduction to Lucene search engine.", Field.Store.YES));
// ডকুমেন্ট ইনডেক্স করা
writer.addDocument(doc);
// লেখক বন্ধ করা
writer.close();
System.out.println("Document indexed successfully!");
}
}
ব্যাখ্যা:
- এখানে Document তৈরি করা হয়েছে এবং তাতে দুটি TextField যোগ করা হয়েছে।
- TextField ফিল্ডটি Lucene এর টেক্সট অনুসন্ধান ক্ষমতা ব্যবহার করার জন্য ব্যবহৃত হয়।
- Field.Store.YES নির্দেশ করে যে ফিল্ডটি ইন্ডেক্সের বাইরে বাইরে স্টোর হবে (এটি সার্চের জন্য ব্যবহৃত হবে)।
৩. Field এর ধরণ (Types of Field)
Lucene বিভিন্ন ধরনের Field সাপোর্ট করে, যার মধ্যে সবচেয়ে সাধারণ হল:
- TextField: এটি সাধারণত টেক্সট ডেটার জন্য ব্যবহৃত হয়, যা ইন্ডেক্স এবং স্টোর করা হয়।
- TextField: ডেটা ইন্ডেক্স এবং স্টোর উভয়ই করে।
- StoredField: শুধুমাত্র ডেটা স্টোর করে, ইন্ডেক্স নয়।
- StringField: ডেটা ইন্ডেক্স এবং স্টোর উভয়ই করে, কিন্তু এটি টেক্সট হিসেবে স্টোর করা হয় না (এটি সাধারণত স্ট্যাটিক ডেটা যেমন আইডি বা কোডের জন্য ব্যবহৃত হয়)।
- NumericField: এটি সংখ্যাগত ডেটার জন্য ব্যবহৃত হয় এবং শুধুমাত্র সংখ্যা রেঞ্জের জন্য ইন্ডেক্স করা হয়।
- DateField: এটি তারিখ এবং সময় ডেটার জন্য ব্যবহৃত হয় এবং Lucene তারিখ ডেটাগুলিকে একটি নির্দিষ্ট ফরম্যাটে ইন্ডেক্স করতে সাহায্য করে।
- StoredField: এটি শুধুমাত্র স্টোরিং উদ্দেশ্যে ব্যবহৃত হয়, এবং ইন্ডেক্সিং করা হয় না।
৪. Document এবং Field Search করা
Lucene তে Document এবং Field এ অনুসন্ধান করতে হলে, আপনাকে IndexReader এবং IndexSearcher ব্যবহার করতে হবে। এই ক্লাসগুলো ইন্ডেক্সে অনুসন্ধান করতে সহায়তা করে এবং নির্দিষ্ট Field-এ অনুসন্ধান ফলাফল প্রদান করে।
উদাহরণ: Document এবং Field তে অনুসন্ধান
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.store.RAMDirectory;
public class LuceneSearchExample {
public static void main(String[] args) throws Exception {
RAMDirectory directory = new RAMDirectory();
// Analyzer তৈরি
StandardAnalyzer analyzer = new StandardAnalyzer();
// IndexWriter এবং IndexReader তৈরি
DirectoryReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
// Search query তৈরি
QueryParser parser = new QueryParser("content", analyzer);
org.apache.lucene.search.Query query = parser.parse("Lucene");
// অনুসন্ধান চালানো
int hitsPerPage = 10;
org.apache.lucene.search.ScoreDoc[] hits = searcher.search(query, hitsPerPage).scoreDocs;
// ফলাফল প্রদর্শন
for (int i = 0; i < hits.length; i++) {
int docId = hits[i].doc;
Document d = searcher.doc(docId);
System.out.println("Title: " + d.get("title"));
System.out.println("Content: " + d.get("content"));
}
reader.close();
}
}
ব্যাখ্যা:
- IndexSearcher ব্যবহার করে content ফিল্ডে "Lucene" শব্দটি অনুসন্ধান করা হয়েছে।
- QueryParser ব্যবহার করে content ফিল্ডে Lucene শব্দটি খোঁজা হচ্ছে।
- hits আড়ালে Lucene এর ফলাফলগুলো সংরক্ষণ করছে এবং সেগুলোর title এবং content প্রদর্শন করছে।
৫. Document এবং Field এর সুবিধা
- Indexing Flexibility: Document এবং Field ব্যবহার করে আপনি যে কোনো ধরনের ডেটা ইন্ডেক্স করতে পারেন এবং এটি অনুসন্ধানযোগ্য হবে।
- Efficient Searching: Lucene ইন্ডেক্সিং ব্যবহার করে ডেটার উপর দ্রুত এবং কার্যকরী অনুসন্ধান পরিচালনা করতে সক্ষম।
- Store and Retrieve: Field এর মাধ্যমে ডেটা স্টোর করা এবং পুনরুদ্ধার করা সহজ হয়, যেমন
Field.Store.YESব্যবহার করে ডেটা সংরক্ষণ করা। - Search Customization: বিভিন্ন ধরনের Field (যেমন TextField, StoredField, NumericField) ব্যবহার করে আপনি অনুসন্ধান এবং স্টোরিংয়ের উপায় কাস্টমাইজ করতে পারবেন।
সারাংশ
Lucene তে Document এবং Field দুটি গুরুত্বপূর্ণ উপাদান যা indexing এবং searching প্রক্রিয়াকে সহজ এবং কার্যকরী করে তোলে। Document হল ডেটার ইউনিট এবং Field হল ডেটার একটি উপাদান, যা আপনাকে ডেটা স্টোর এবং অনুসন্ধান করতে সহায়তা করে। Lucene এর সাহায্যে আপনি Text, Numeric, Date এবং Custom Fields তৈরি করে ডেটার উপর অনুসন্ধান কার্যক্রম পরিচালনা করতে পারেন।
Lucene একটি ওপেন সোর্স লাইব্রেরি যা টেক্সট সার্চিং ও ইনডেক্সিং সম্পর্কিত কাজের জন্য ব্যবহৃত হয়। এটি একটি অত্যন্ত কার্যকরী এবং উচ্চ পারফরম্যান্স টেক্সট সার্চ ইঞ্জিন যা বড় আকারের ডেটাবেসে ডেটা অনুসন্ধানের কাজ সহজ করে তোলে। Lucene এর Document Class এই ইন্ডেক্সিং সিস্টেমের একটি মৌলিক অংশ, কারণ এটি ইন্ডেক্সের মধ্যে তথ্য সংরক্ষণ এবং পরিচালনা করার জন্য ব্যবহৃত হয়।
১. Lucene Document Class এর ভূমিকা
Document ক্লাস Lucene ইন্ডেক্সে স্টোর করা ডেটা বা এন্ট্রি নির্দেশ করে। এটি একটি JavaBean টাইপের ক্লাস, যার মধ্যে একটি বা একাধিক Field থাকে। প্রত্যেকটি Field হল একটি কনটেইনারে রাখা তথ্য, যা ইন্ডেক্সে স্টোর করা হবে এবং পরবর্তীতে অনুসন্ধান করা যাবে। Document ক্লাসের সাহায্যে আমরা আমাদের ডেটা বা টেক্সটকে কার্যকরীভাবে ইন্ডেক্সে সংরক্ষণ এবং সার্চের জন্য প্রস্তুত করতে পারি।
২. Document Class এর মৌলিক ফাংশনালিটি
Lucene এর Document ক্লাসের কয়েকটি গুরুত্বপূর্ণ কাজ থাকে:
- ডেটা সংরক্ষণ করা: Document ক্লাস Field অবজেক্টের মাধ্যমে ডেটা সংগ্রহ করে এবং সেই ডেটা ইন্ডেক্সে সংরক্ষণ করা হয়।
- ফিল্ড ম্যানেজমেন্ট: Document ক্লাসের মাধ্যমে আমরা ইন্ডেক্সে বিভিন্ন ধরনের Field যুক্ত করতে পারি, যেমন টেক্সট, নম্বর, তারিখ ইত্যাদি।
- ব্যবহারকারী ডেটা মডেল তৈরি করা: একটি Document একাধিক Field ধারণ করতে পারে, যা এক বা একাধিক ডেটা টাইপ (যেমন, String, Date, Integer) ধারণ করে।
৩. Document Class এর গঠন
Document ক্লাসের সাধারণ গঠন এবং এর কার্যকরী ব্যবহার নিয়ে বিস্তারিত আলোচনা করা যাক:
উদাহরণ: Document ক্লাসের একটি সাধারণ ব্যবহার
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
public class LuceneExample {
public static void main(String[] args) {
// Create a new Document
Document document = new Document();
// Adding Fields to the Document
document.add(new StringField("id", "1", Field.Store.YES)); // A field to store id
document.add(new TextField("title", "Lucene Introduction", Field.Store.YES)); // A field to store title
document.add(new TextField("content", "This is a basic example of Lucene indexing", Field.Store.YES)); // A field to store content
// Document now contains fields that are ready to be indexed
// Add this Document to the index (indexing process is done separately)
}
}
এখানে:
StringFieldএবংTextFieldহল Field এর দুটি সাধারণ টাইপ যা Lucene ডকুমেন্টের মধ্যে ডেটা সংরক্ষণের জন্য ব্যবহৃত হয়।- Field.Store.YES নির্দেশ করে যে এই ফিল্ডটি স্টোর করা হবে এবং অনুসন্ধানের জন্য উপলব্ধ থাকবে।
৪. Document Class এর Field Types
Lucene এর Document ক্লাস বিভিন্ন ধরনের Field ব্যবহার করে ডেটা সংরক্ষণ করে। এই Field গুলি বিভিন্ন ডেটা টাইপের সাথে সম্পর্কিত এবং সার্চ অপটিমাইজেশন করা হয়।
কিছু সাধারণ Field Types:
- TextField: মূলত টেক্সট বা স্ট্রিং ডেটা স্টোর করার জন্য ব্যবহৃত হয়, যা নরমালাইজড হয় (যেমন টোকেনাইজড বা স্টেমিং)।
- StringField: স্ট্রিং ডেটার জন্য ব্যবহৃত হয়, যেখানে ডেটা নিখুঁতভাবে সার্চ করা হয়, এবং এটি ইনডেক্সের মাধ্যমে ডেটা সার্চ করতে সহায়ক।
- IntPoint/LongPoint: সংখ্যামূলক ডেটা (যেমন ইনটিজার, লং) স্টোর এবং সার্চ করতে ব্যবহৃত হয়।
- StoredField: ফিল্ডের ডেটা স্টোর করতে ব্যবহৃত হয়, কিন্তু এটি ইনডেক্সিং এর জন্য নয়। এটি শুধুমাত্র ডিসপ্লে করার জন্য ব্যবহৃত হয়।
- DatePoint: তারিখ সম্পর্কিত ডেটা স্টোর করার জন্য ব্যবহৃত হয়।
৫. Lucene Document Class এর গুরুত্বপূর্ণ বৈশিষ্ট্য
- Field Storage Control: Field.Store.YES বা Field.Store.NO এর মাধ্যমে আপনি নির্ধারণ করতে পারেন যে একটি ফিল্ড ডেটা ইন্ডেক্সে সংরক্ষিত হবে কিনা।
- Tokenization: TextField সাধারণত টোকেনাইজড হয়, অর্থাৎ এটি শব্দকে আলাদা আলাদা করে ইনডেক্সে সংরক্ষণ করে, যা দ্রুত অনুসন্ধান করতে সহায়তা করে।
- Multiple Fields: একটি Document একাধিক Field ধারণ করতে পারে, যেমন একাধিক শব্দ, তারিখ, সংখ্যা ইত্যাদি।
- Data Querying: Lucene ব্যবহারকারীকে ফিল্ড অনুযায়ী ডেটা খুঁজে বের করতে সাহায্য করে, যেমন "title", "content" বা "date"।
৬. Document Class এর মাধ্যমে ইনডেক্সিং
Document ক্লাস ব্যবহার করে, আপনি আপনার ডেটা ইনডেক্সে সংরক্ষণ করতে পারবেন। উদাহরণস্বরূপ, আপনার যদি কয়েকটি Document থাকে এবং সেগুলিকে ইনডেক্সে যোগ করতে চান, তাহলে আপনাকে IndexWriter ব্যবহার করতে হবে।
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
public class LuceneIndexing {
public static void main(String[] args) throws Exception {
// Create an IndexWriter
Directory directory = FSDirectory.open(new java.nio.file.Path("indexDirectory"));
IndexWriterConfig config = new IndexWriterConfig(new StandardAnalyzer());
IndexWriter writer = new IndexWriter(directory, config);
// Create a new document
Document doc = new Document();
doc.add(new TextField("title", "Lucene Introduction", Field.Store.YES));
doc.add(new TextField("content", "Lucene is an open-source search library.", Field.Store.YES));
// Add document to the index
writer.addDocument(doc);
// Commit and close the writer
writer.commit();
writer.close();
}
}
এখানে:
- IndexWriter ব্যবহৃত হয়েছে নতুন ডকুমেন্ট ইনডেক্সে যোগ করার জন্য।
- StandardAnalyzer একটি সাধারণ এনালাইজার যা ইনডেক্সিং এবং সার্চের জন্য টোকেনাইজড টেক্সট প্রস্তুত করে।
৭. Document Class এর মাধ্যমে Search
একবার ডেটা ইন্ডেক্সে সংরক্ষিত হয়ে গেলে, IndexSearcher এর মাধ্যমে আপনি তা সার্চ করতে পারেন।
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.Query;
public class LuceneSearch {
public static void main(String[] args) throws Exception {
Directory directory = FSDirectory.open(new java.nio.file.Path("indexDirectory"));
IndexReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
QueryParser parser = new QueryParser("content", new StandardAnalyzer());
Query query = parser.parse("Lucene");
// Search the index
int hits = searcher.search(query, 10).totalHits;
System.out.println("Total results: " + hits);
// Close the searcher
reader.close();
}
}
এখানে, QueryParser ব্যবহার করে ইনডেক্সে সার্চ করতে পারি এবং অনুসন্ধানের ফলাফল হিসেবে মোট হিট গুলো দেখতে পারি।
সারাংশ
Lucene এর Document Class একটি গুরুত্বপূর্ণ অংশ যা ডেটা ইনডেক্সিং এবং সার্চ প্রক্রিয়ায় ব্যবহৃত হয়। এটি ডেটা বা ইনফরমেশন সংরক্ষণের জন্য Field ব্যবহার করে, এবং IndexWriter এর মাধ্যমে ডেটাকে ইনডেক্সে যোগ করতে সাহায্য করে। Lucene Document Class বিভিন্ন Field Types ব্যবহার করে ডেটা স্টোর এবং সার্চ অপটিমাইজেশন সরবরাহ করে। এটি ডেটাকে টোকেনাইজ করতে সক্ষম, যা দ্রুত অনুসন্ধান কার্যক্রমে সহায়তা করে।
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 ব্যবহার করে আপনি সহজেই ইনডেক্স করা ডেটা খুঁজে পেতে পারেন।
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 ফিল্ডের মান সংরক্ষণের জন্য ব্যবহৃত হয়। এই ফিল্ড টাইপগুলির মধ্যে সঠিক নির্বাচন অনুসন্ধান কার্যকারিতা এবং পারফরম্যান্সে উন্নতি আনতে সাহায্য করে।
Apache Lucene একটি শক্তিশালী ফ্রি এবং ওপেন সোর্স ইনডেক্সিং এবং সার্চিং লাইব্রেরি যা Java-ভিত্তিক। এটি মূলত টেক্সট সার্চ ইঞ্জিন তৈরি করতে ব্যবহৃত হয়, এবং এটি ব্যাপকভাবে ডকুমেন্ট ইনডেক্সিং এবং সার্চিংয়ের জন্য ব্যবহৃত হয়। Lucene ব্যবহার করে আপনি বিভিন্ন ধরনের ডকুমেন্ট যেমন Plain Text, PDF, Word, HTML ইত্যাদি ইনডেক্স করতে পারেন। এই টিউটোরিয়ালে আমরা দেখব কিভাবে Lucene ব্যবহার করে বিভিন্ন ধরনের ডকুমেন্ট ইনডেক্স করা যায়।
১. Lucene ইনডেক্সিং প্রক্রিয়া
Lucene ইনডেক্সিং প্রক্রিয়ায় মূলত তিনটি প্রধান পদক্ষেপ থাকে:
- Document: Lucene-এ প্রতিটি ডকুমেন্ট একটি
Documentঅবজেক্ট হিসেবে থাকে, যেখানেFieldগুলি ধারণ করা হয়। প্রতিটিFieldহল ডকুমেন্টের একটি নির্দিষ্ট অংশ (যেমন: টাইটেল, কন্টেন্ট, প্রকার ইত্যাদি)। - Analyzer: এটি একটি টেক্সট প্রোসেসর যা ডকুমেন্টের টেক্সট থেকে প্রাসঙ্গিক তথ্য বের করে (যেমন: স্টপওয়ার্ড মুছে ফেলা, স্টেমিং, টোকেনাইজেশন)।
- IndexWriter: এটি ইনডেক্স লেখার জন্য ব্যবহৃত হয়। IndexWriter ডকুমেন্টগুলি ইনডেক্সে যোগ করে এবং ডাটা স্টোর করে।
উদাহরণ: Simple Lucene Indexing
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.Directory;
import java.io.IOException;
import java.nio.file.Paths;
public class LuceneIndexingExample {
public static void main(String[] args) throws IOException {
// Create a directory to store the index
Directory directory = FSDirectory.open(Paths.get("index"));
// Create an analyzer (text processor)
StandardAnalyzer analyzer = new StandardAnalyzer();
// Create an IndexWriterConfig object
IndexWriterConfig config = new IndexWriterConfig(analyzer);
// Create an IndexWriter
IndexWriter indexWriter = new IndexWriter(directory, config);
// Create a document to index
Document document = new Document();
document.add(new TextField("title", "Lucene in Action", Field.Store.YES));
document.add(new TextField("content", "This is a sample content for Lucene indexing.", Field.Store.YES));
// Add the document to the index
indexWriter.addDocument(document);
// Commit the changes and close the writer
indexWriter.commit();
indexWriter.close();
System.out.println("Document indexed successfully.");
}
}
এই উদাহরণে:
- StandardAnalyzer ব্যবহার করা হয়েছে টেক্সট প্রক্রিয়াকরণের জন্য।
- TextField ব্যবহার করা হয়েছে ইনডেক্সের জন্য টেক্সট ফিল্ডে ডেটা যোগ করতে।
২. Lucene তে PDF ডকুমেন্ট ইনডেক্সিং
Lucene দিয়ে PDF ডকুমেন্ট ইনডেক্স করতে হলে, Apache Tika বা PDFBox লাইব্রেরি ব্যবহার করতে হয়। Tika হলো একটি যন্ত্র যা বিভিন্ন ধরনের ডকুমেন্ট (যেমন PDF, Word, HTML) থেকে টেক্সট এক্সট্র্যাক্ট করতে সহায়তা করে।
উদাহরণ: PDF ডকুমেন্ট ইনডেক্সিং
import org.apache.lucene.analysis.standard.StandardAnalyzer;
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.FSDirectory;
import org.apache.lucene.store.Directory;
import org.apache.tika.parser.pdf.PDFParser;
import org.apache.tika.sax.BodyContentHandler;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.ParseContext;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Paths;
public class PDFLuceneIndexing {
public static void main(String[] args) throws Exception {
// Set up the Lucene index writer
Directory directory = FSDirectory.open(Paths.get("index"));
StandardAnalyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter indexWriter = new IndexWriter(directory, config);
// PDF parsing
FileInputStream pdfFile = new FileInputStream("sample.pdf");
PDFParser pdfParser = new PDFParser();
BodyContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata();
ParseContext context = new ParseContext();
pdfParser.parse(pdfFile, handler, metadata, context);
// Create a document for indexing
Document document = new Document();
document.add(new TextField("content", handler.toString(), Field.Store.YES));
// Add document to Lucene index
indexWriter.addDocument(document);
indexWriter.commit();
indexWriter.close();
System.out.println("PDF document indexed successfully.");
}
}
এখানে:
- Apache Tika ব্যবহার করে PDF থেকে টেক্সট এক্সট্র্যাক্ট করা হয়েছে।
- Lucene ব্যবহার করে টেক্সট ইনডেক্স করা হয়েছে।
৩. Lucene তে Word ডকুমেন্ট ইনডেক্সিং
Apache Tika বা POI (Apache POI) লাইব্রেরি ব্যবহার করে আপনি Word ডকুমেন্টের টেক্সট এক্সট্র্যাক্ট করতে পারেন।
উদাহরণ: Word ডকুমেন্ট ইনডেক্সিং
import org.apache.lucene.analysis.standard.StandardAnalyzer;
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.FSDirectory;
import org.apache.lucene.store.Directory;
import org.apache.tika.parser.microsoft.ooxml.WordExtractor;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.sax.BodyContentHandler;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Paths;
public class WordLuceneIndexing {
public static void main(String[] args) throws Exception {
// Set up Lucene index writer
Directory directory = FSDirectory.open(Paths.get("index"));
StandardAnalyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter indexWriter = new IndexWriter(directory, config);
// Word file parsing using Apache Tika
FileInputStream wordFile = new FileInputStream("sample.docx");
BodyContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata();
WordExtractor extractor = new WordExtractor();
extractor.parse(wordFile, handler, metadata);
// Create a document to index
Document document = new Document();
document.add(new TextField("content", handler.toString(), Field.Store.YES));
// Add the document to the Lucene index
indexWriter.addDocument(document);
indexWriter.commit();
indexWriter.close();
System.out.println("Word document indexed successfully.");
}
}
এখানে:
- Apache Tika ব্যবহার করে Word ডকুমেন্ট থেকে টেক্সট এক্সট্র্যাক্ট করা হয়েছে।
- Lucene এর মাধ্যমে সেই টেক্সট ইনডেক্স করা হয়েছে।
৪. Lucene তে HTML ডকুমেন্ট ইনডেক্সিং
Lucene এর মাধ্যমে HTML ডকুমেন্ট ইনডেক্স করতে, আপনি JSoup বা Tika ব্যবহার করতে পারেন HTML থেকে টেক্সট এক্সট্র্যাক্ট করার জন্য।
উদাহরণ: HTML ডকুমেন্ট ইনডেক্সিং
import org.apache.lucene.analysis.standard.StandardAnalyzer;
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.FSDirectory;
import org.apache.lucene.store.Directory;
import org.jsoup.Jsoup;
import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
public class HTMLLuceneIndexing {
public static void main(String[] args) throws IOException {
// Set up Lucene index writer
Directory directory = FSDirectory.open(Paths.get("index"));
StandardAnalyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter indexWriter = new IndexWriter(directory, config);
// Parse the HTML file using Jsoup
File htmlFile = new File("sample.html");
org.jsoup.nodes.Document doc = Jsoup.parse(htmlFile, "UTF-8");
String content = doc.body().text(); // Extract the text from the body
// Create a document to index
Document document = new Document();
document.add(new TextField("content", content, Field.Store.YES));
// Add the document to Lucene index
indexWriter.addDocument(document);
indexWriter.commit();
indexWriter.close();
System.out.println("HTML document indexed successfully.");
}
}
এখানে:
- JSoup ব্যবহার করা হয়েছে HTML থেকে টেক্সট এক্সট্র্যাক্ট করতে।
- Lucene ব্যবহার করে HTML ডকুমেন্টটি ইনডেক্স করা হয়েছে।
সারাংশ
Lucene ব্যবহার করে বিভিন্ন ধরনের ডকুমেন্ট (যেমন: PDF, Word, HTML) ইনডেক্সিং একটি গুরুত্বপূর্ণ প্রক্রিয়া যা আপনাকে সহজেই ডেটা এক্সট্র্যাক্ট করতে এবং সেগুলিকে ইনডেক্স করতে সহায়তা করে। Apache Tika এবং JSoup এর মতো লাইব্রেরি ব্যবহার করে আপনি PDF, Word, HTML এর মতো বিভিন্ন ফরম্যাটের ডকুমেন্টের টেক্সট এক্সট্র্যাক্ট করে Lucene-এ ইনডেক্স করতে পারেন। এর ফলে ডকুমেন্ট সার্চিং এবং রিট্রিভাল আরো দ্রুত এবং কার্যকরী হয়।
Read more