Apache Lucene একটি শক্তিশালী এবং ফাস্ট টেক্সট সার্চ লাইব্রেরি যা Java প্রোগ্রামিং ভাষায় তৈরি করা হয়েছে। এটি ডকুমেন্টসের মধ্যে টেক্সট সার্চ করতে ব্যবহৃত হয় এবং একটি Indexing সিস্টেম ব্যবহার করে দ্রুত সার্চ ফলাফল প্রদান করে। তবে, শুধু সার্চ ফলাফল পাওয়া নয়, কখনো কখনো সার্চ রেজাল্টে প্রাসঙ্গিক অংশগুলো হাইলাইট করা প্রয়োজন, যাতে ইউজার সহজেই তাদের খোঁজা শব্দ বা ফ্রেজ দেখতে পারে।
Lucene তে Highlighting হল একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা সার্চ রেজাল্টের মধ্যে প্রাসঙ্গিক অংশগুলি আলাদাভাবে প্রদর্শন করতে সহায়তা করে। এটি সাধারণত সার্চ কুয়েরি শব্দগুলিকে bold, italic বা অন্যান্য স্টাইলের মাধ্যমে হাইলাইট করে।
এই টিউটোরিয়ালে, আমরা Lucene Highlighting সম্পর্কে বিস্তারিত জানবো এবং কীভাবে Lucene তে Search Results এ highlighting যোগ করা যায় তা দেখব।
১. Lucene তে Highlighting এর ধারণা
Lucene তে Highlighting হল একটি প্রক্রিয়া যেখানে সার্চ কুয়েরির সাথে মেলানো টেক্সট অংশগুলো (যেমন কুয়েরি শব্দ) ডকুমেন্টের মধ্যে হাইলাইট করা হয়। এতে ইউজাররা সহজেই তাদের সার্চ কুয়েরির সাথে সম্পর্কিত অংশ দেখতে পারেন।
Lucene এর Highlighter ক্লাস একটি নির্দিষ্ট ডকুমেন্টের মধ্যে কুয়েরি শব্দ খুঁজে বের করে এবং সেগুলিকে একটি স্টাইলের মাধ্যমে আলাদা করে দেখায়।
২. Lucene তে Highlighting যোগ করার প্রক্রিয়া
Lucene তে Highlighting যোগ করার জন্য কয়েকটি ধাপ অনুসরণ করতে হয়:
- Index Creation: প্রথমে ডকুমেন্ট ইনডেক্স তৈরি করতে হবে।
- Query Execution: তারপর সার্চ কুয়েরি রান করতে হবে।
- Highlighting: সার্চ কুয়েরি থেকে মেলানো টেক্সট অংশ হাইলাইট করতে হবে।
এখানে আমরা একটি সাধারণ উদাহরণ দেখবো, যেখানে আমরা Lucene Indexing, Searching এবং Highlighting তিনটি ধাপের কাজ করবো।
৩. Lucene তে Index Creation Example
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.FSDirectory;
import java.io.File;
import java.io.IOException;
public class LuceneIndexingExample {
public static void main(String[] args) throws IOException {
// Directory where the index will be stored
FSDirectory directory = FSDirectory.open(new File("index").toPath());
// Create IndexWriter configuration
StandardAnalyzer analyzer = new StandardAnalyzer();
IndexWriter writer = new IndexWriter(directory, new IndexWriterConfig(analyzer));
// Sample document to index
Document document = new Document();
document.add(new Field("title", "Lucene Search Highlighting Example", Field.Store.YES, Field.Index.ANALYZED));
document.add(new Field("content", "This is a simple example of Lucene Search with Highlighting.", Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(document);
// Add another document
document = new Document();
document.add(new Field("title", "Lucene Highlighting Example", Field.Store.YES, Field.Index.ANALYZED));
document.add(new Field("content", "Lucene also supports highlighting the search terms.", Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(document);
// Commit and close the writer
writer.commit();
writer.close();
System.out.println("Indexing completed.");
}
}
এখানে, দুটি ডকুমেন্ট ইনডেক্স করা হয়েছে এবং তাদের মধ্যে title এবং content ফিল্ড যুক্ত করা হয়েছে।
৪. Lucene Query Execution Example
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.store.FSDirectory;
import java.io.File;
import java.io.IOException;
public class LuceneSearchExample {
public static void main(String[] args) throws Exception {
// Open the directory where the index is stored
FSDirectory directory = FSDirectory.open(new File("index").toPath());
DirectoryReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
// Create a query for the search term
String searchTerm = "highlighting";
QueryParser parser = new QueryParser("content", new StandardAnalyzer());
Query query = parser.parse(searchTerm);
// Search the index
int hits = searcher.search(query, 10).totalHits;
// Output the number of hits
System.out.println("Number of hits: " + hits);
}
}
এখানে, আমরা "highlighting" শব্দটি খুঁজছি এবং content ফিল্ডের মধ্যে এই শব্দটি পাওয়া গেলে তার সংখ্যা কনসোলে প্রদর্শন করছি।
৫. Lucene Search Result Highlighting Example
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.search.*;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.highlight.*;
import java.io.File;
import java.io.IOException;
public class LuceneHighlightingExample {
public static void main(String[] args) throws Exception {
// Open the directory where the index is stored
FSDirectory directory = FSDirectory.open(new File("index").toPath());
DirectoryReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
// Create a query for the search term
String searchTerm = "highlighting";
QueryParser parser = new QueryParser("content", new StandardAnalyzer());
Query query = parser.parse(searchTerm);
// Search the index
TopDocs topDocs = searcher.search(query, 10);
// Create a Highlighter
SimpleHTMLFormatter htmlFormatter = new SimpleHTMLFormatter("<b><font color='red'>", "</font></b>");
Highlighter highlighter = new Highlighter(htmlFormatter, new QueryScorer(query));
// Loop through the search results and highlight the relevant parts
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
Document doc = searcher.doc(scoreDoc.doc);
String content = doc.get("content");
// Highlight the text
TokenStream tokenStream = new StandardAnalyzer().tokenStream("content", content);
String highlightedText = highlighter.getBestFragment(tokenStream, content);
if (highlightedText != null) {
System.out.println("Highlighted content: " + highlightedText);
} else {
System.out.println("No highlighted content");
}
}
}
}
এখানে, আমরা StandardAnalyzer ব্যবহার করে content ফিল্ডের মধ্যে কুয়েরি শব্দ "highlighting" এর সঠিক অংশটি হাইলাইট করেছি এবং HTML ফরম্যাটে সেই অংশটিকে রেন্ডার করেছি। যদি কোনো ফলাফল না পাওয়া যায়, তবে "No highlighted content" মেসেজ প্রদর্শিত হবে।
৬. Lucene Highlighting এর মূল উপাদান
- SimpleHTMLFormatter: এই ক্লাসটি HTML ফরম্যাটে হাইলাইটেড টেক্সট প্রদান করতে ব্যবহৃত হয়।
- QueryScorer: এটি কুয়েরি দ্বারা হাইলাইট করতে হবে এমন শব্দের স্কোরিং করতে ব্যবহৃত হয়।
- Highlighter: এই ক্লাসটি হাইলাইটিং কার্যকরী করতে ব্যবহৃত হয় এবং এটি
SimpleHTMLFormatterএবংQueryScorerএর মাধ্যমে হাইলাইটেড টেক্সট প্রস্তুত করে।
সারাংশ
Lucene Highlighting একটি অত্যন্ত কার্যকরী ফিচার যা সার্চ রেজাল্টে প্রাসঙ্গিক অংশগুলো হাইলাইট করে প্রদর্শন করতে সহায়তা করে। এটি ইউজারকে তাদের সার্চ কুয়েরির সাথে সম্পর্কিত অংশগুলো দ্রুত খুঁজে পেতে সহায়তা করে। Lucene Highlighter ব্যবহার করে সার্চ রেজাল্টের মধ্যে সহজে হাইলাইট করা যায় এবং ব্যবহারকারীকে প্রাসঙ্গিক তথ্য দ্রুত সরবরাহ করা সম্ভব হয়।
Read more