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