Apache Lucene একটি শক্তিশালী এবং জনপ্রিয় লুকআপ এবং অনুসন্ধান লাইব্রেরি যা টেক্সট ডেটা ইনডেক্স এবং অনুসন্ধানের জন্য ব্যবহৃত হয়। Highlighting হল একটি ফিচার যা ব্যবহারকারীদের তাদের অনুসন্ধান প্রশ্নের সাথে মেলে এমন অংশগুলিকে সহজে চিহ্নিত করতে সাহায্য করে। সাধারণত, যখন আপনি কোন শব্দ বা ফ্রেজ অনুসন্ধান করেন, তখন highlighting এই শব্দ বা ফ্রেজটি ডকুমেন্টে হাইলাইট করে, যাতে ব্যবহারকারী দ্রুত দেখতে পারে কোথায় সেগুলি পাওয়া গেছে।
Lucene এর মাধ্যমে Highlighting কার্যকর করার জন্য কিছু বিশেষ কৌশল এবং উপকরণ ব্যবহার করা হয়, যেমন Highlighter ক্লাস, যা অনুসন্ধানের রেজাল্ট থেকে নির্দিষ্ট অংশগুলো হাইলাইট করে।
১. Lucene Highlighting কীভাবে কাজ করে?
Lucene তে হাইলাইটিং এমনভাবে কাজ করে:
- Indexing: যখন আপনি ইনডেক্স তৈরি করেন, তখন Lucene প্রাসঙ্গিক ডেটার ইনডেক্স তৈরি করে, যাতে দ্রুত অনুসন্ধান করা যায়।
- Querying: আপনি যে কিওয়ার্ড বা প্যাটার্ন দিয়ে অনুসন্ধান করছেন, Lucene সেই অনুসন্ধানকে ইন্ডেক্সে মিলে খুঁজে বের করে।
- Highlighting: যখন একটি মেচিং টুকরো খুঁজে পাওয়া যায়, তখন Lucene Highlighter সেই টুকরোটিকে হাইলাইট করে, যাতে ব্যবহারকারী এটি দেখতে পারে। সাধারণত, এটি একটি
<span>ট্যাগ ব্যবহার করে বা অন্যান্য HTML ট্যাগ ব্যবহার করে হাইলাইট করা হয়।
Lucene-এ Highlighting করার জন্য Highlighter ক্লাস ব্যবহার করা হয়, যা অনুসন্ধানের রেজাল্টগুলির মধ্যে মেচিং অংশগুলিকে হাইলাইট করে।
২. Lucene Highlighter ব্যবহার করা
Lucene তে Highlighting কার্যকর করার জন্য আপনাকে Highlighter ক্লাস এবং Query Scorer বা Fragmenter ব্যবহার করতে হয়। Highlighter আপনাকে মেচিং টেক্সটের অংশগুলি হাইলাইট করার জন্য একটি সিস্টেম প্রদান করে।
২.১ Highlighter এবং Query Scorer উদাহরণ
এই উদাহরণে আমরা Lucene এর Highlighter ক্লাস এবং Query Scorer ব্যবহার করব, যা আমাদের অনুসন্ধান শব্দগুলির অংশগুলো হাইলাইট করতে সাহায্য করবে।
উদাহরণ কোড:
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.store.RAMDirectory;
public class LuceneHighlightingExample {
public static void main(String[] args) throws Exception {
// Creating a RAM directory to store the index
RAMDirectory ramDir = new RAMDirectory();
// Analyzer to tokenize the text
StandardAnalyzer analyzer = new StandardAnalyzer();
// Configuring the IndexWriter
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter writer = new IndexWriter(ramDir, config);
// Adding a document to the index
Document doc = new Document();
doc.add(new Field("content", "Lucene is an amazing search library", Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
writer.close();
// Creating an IndexSearcher
DirectoryReader reader = DirectoryReader.open(ramDir);
IndexSearcher searcher = new IndexSearcher(reader);
// Creating a QueryParser and a query
QueryParser parser = new QueryParser("content", analyzer);
Query query = parser.parse("search");
// Executing the search
TopDocs topDocs = searcher.search(query, 10);
// Highlighting the search results
SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<span style='background-color: yellow;'>", "</span>");
QueryScorer scorer = new QueryScorer(query);
Highlighter highlighter = new Highlighter(formatter, scorer);
for (int i = 0; i < topDocs.scoreDocs.length; i++) {
int docID = topDocs.scoreDocs[i].doc;
Document document = searcher.doc(docID);
String text = document.get("content");
// Extracting the highlighted fragment
String highlightedText = highlighter.getBestFragment(analyzer, "content", text);
System.out.println("Highlighted text: " + highlightedText);
}
reader.close();
}
}
২.২ কোড বিশ্লেষণ:
- RAMDirectory: এখানে RAMDirectory ব্যবহার করা হয়েছে যাতে ইনডেক্সকে মেমরিতে তৈরি করা হয়। এটি ফাইল সিস্টেমে ইনডেক্স সঞ্চয় না করে, দ্রুত অনুসন্ধান কার্যক্রম চালানোর জন্য আদর্শ।
- StandardAnalyzer: এটি একটি স্ট্যান্ডার্ড এনালাইজার যা ডকুমেন্টের টেক্সটকে টোকেনাইজ করে এবং ইন্ডেক্স তৈরি করে।
- IndexWriter: ইনডেক্স লেখার জন্য ব্যবহৃত হয়। এখানে, একাধিক ডকুমেন্ট ইনডেক্স করা হচ্ছে।
- QueryParser: ব্যবহারকারীর দেওয়া কিওয়ার্ড থেকে Query তৈরি করার জন্য ব্যবহৃত হয়।
- Highlighter: এটি QueryScorer এবং SimpleHTMLFormatter ব্যবহার করে মেচিং অংশগুলি হাইলাইট করে। এটি সাধারণত HTML ট্যাগের মাধ্যমে অংশগুলোকে হাইলাইট করে দেয়।
৩. Lucene Highlighter Formatting Options
Highlighter সাধারণত মেচিং টেক্সট অংশগুলিকে HTML ফরম্যাটে হাইলাইট করে, তবে আপনি চাইলে এটি অন্য ফরম্যাটেও করতে পারেন, যেমন XML, JSON, অথবা কাস্টম ফরম্যাট।
SimpleHTMLFormatter:
SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<b>", "</b>");
এটি এবং ট্যাগ ব্যবহার করে মেচিং টেক্সটগুলো বোল্ড করে।
Custom Formatter Example:
Formatter customFormatter = new Formatter() {
public String highlightTerm(String originalText, String highlightedText) {
return "<mark>" + highlightedText + "</mark>";
}
};
এটি মেচিং টেক্সটগুলোকে ট্যাগ দিয়ে হাইলাইট করবে।
৪. Lucene Highlighter Performance Considerations
Lucene এর হাইলাইটিং ফিচারটি খুবই শক্তিশালী, তবে কিছু ক্ষেত্রে পারফরম্যান্সের সমস্যা হতে পারে, বিশেষত যখন আপনি বড় ডকুমেন্ট বা বড় ইন্ডেক্সে অনুসন্ধান করছেন। Highlighter-এর পারফরম্যান্স উন্নত করার জন্য কিছু কৌশল ব্যবহার করা যেতে পারে:
- Fragmenter ব্যবহার করা: Highlighter বৃহত্তর ডকুমেন্টের মধ্যে ফ্রাগমেন্ট তৈরি করে এবং শুধুমাত্র মেচিং অংশগুলিকেই হাইলাইট করে।
- Query Scorer ব্যবহার করা: এটি শুধুমাত্র গুরুত্বপূর্ণ অংশগুলির স্কোর বৃদ্ধি করে, যার ফলে শুধুমাত্র প্রাসঙ্গিক অংশগুলিই হাইলাইট হয়।
- Optimize Tokenization: টোকেনাইজেশন প্রক্রিয়াকে অপটিমাইজ করুন যাতে দ্রুত হাইলাইটিং করা যায়।
সারাংশ
Lucene Highlighting ব্যবহারকারীকে দ্রুতভাবে অনুসন্ধান করা টেক্সটের অংশ দেখতে সাহায্য করে। এটি সাধারণত Highlighter ক্লাসের মাধ্যমে করা হয়, যেখানে QueryScorer এবং Fragmenter ব্যবহৃত হয় মেচিং অংশগুলিকে খুঁজে বের করার জন্য। Lucene-এ highlighting কোড জেনারেশন ও রিফ্লেকশন ছাড়া কার্যকরভাবে করা সম্ভব, যার ফলে এটি দ্রুত এবং পারফরম্যান্সের দিক থেকে দক্ষ। Lucene এর Highlighting ফিচারটি সহজে কাস্টমাইজ করা যায় এবং বিভিন্ন ফরম্যাটে আউটপুট দেওয়া যায়, যা আপনার প্রোজেক্টের প্রয়োজন অনুযায়ী উপযুক্ত হতে পারে।
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 ব্যবহার করে সার্চ রেজাল্টের মধ্যে সহজে হাইলাইট করা যায় এবং ব্যবহারকারীকে প্রাসঙ্গিক তথ্য দ্রুত সরবরাহ করা সম্ভব হয়।
Lucene একটি শক্তিশালী এবং জনপ্রিয় ওপেন সোর্স লাইব্রেরি যা মূলত টেক্সট ডেটা ইন্ডেক্সিং এবং সার্চিংয়ের জন্য ব্যবহৃত হয়। এটি Java ভিত্তিক এবং খুব দ্রুত তথ্য অনুসন্ধান করতে সক্ষম। যখন আপনি Lucene ব্যবহার করে কোনো টেক্সট ডেটাতে সার্চ করেন, তখন কখনও কখনও আপনি চান যে সার্চ করা শব্দগুলো (Search Terms) হাইলাইট করা হোক যাতে ব্যবহারকারী সহজে দেখতে পারে কোথায় তার সার্চ শব্দটি পাওয়া গেছে। Lucene তে এই কাজটি Highlighter ক্লাস ব্যবহার করে করা হয়।
এই টিউটোরিয়ালে, আমরা Lucene Highlighter ক্লাসের মাধ্যমে কিভাবে সার্চ শব্দগুলো হাইলাইট করা যায়, তা আলোচনা করব।
১. Lucene Highlighter Overview
Lucene এর Highlighter ক্লাস ব্যবহার করে আপনি যে টেক্সট ডকুমেন্টে সার্চ করছেন, সেখানে সার্চ শব্দগুলোর অবস্থান শনাক্ত করতে পারবেন এবং ওই শব্দগুলো হাইলাইট করতে পারবেন। এটি সাধারণত একটি Query এর ফলস্বরূপ প্রাপ্ত ডকুমেন্টের মধ্যে সার্চ শব্দগুলোকে স্পষ্টভাবে দেখানোর জন্য ব্যবহৃত হয়।
Lucene Highlighter ক্লাস মূলত Fragmenter এবং Formatter ব্যবহার করে কাজ করে:
- Fragmenter: এটি ডকুমেন্টের টেক্সটটিকে ছোট অংশে (fragments) ভাগ করে, যাতে হাইলাইটিং শুধুমাত্র প্রাসঙ্গিক অংশে করা হয়।
- Formatter: এটি হাইলাইট করা অংশকে নির্দিষ্ট ফরম্যাটে প্রক্রিয়া করে, যেমন HTML ট্যাগে রূপান্তর করা।
২. Lucene Highlighter ব্যবহার করার জন্য প্রয়োজনীয় ডিপেনডেন্সি
Lucene Highlighter ব্যবহার করতে আপনার pom.xml ফাইলে Lucene Core ডিপেনডেন্সি যোগ করতে হবে।
<dependencies>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>8.11.0</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-highlighter</artifactId>
<version>8.11.0</version>
</dependency>
</dependencies>
এখানে, lucene-core এবং lucene-highlighter ডিপেনডেন্সি ব্যবহার করা হয়েছে।
৩. Lucene Highlighter ক্লাসে সার্চ টার্ম হাইলাইট করার উদাহরণ
ধরা যাক, আমাদের কাছে কিছু ডকুমেন্ট রয়েছে, এবং আমরা Lucene সার্চ ইঞ্জিন ব্যবহার করে একটি টেক্সট ডকুমেন্টে অনুসন্ধান করতে চাই এবং যে শব্দটি খুঁজে পেয়েছি, সেটি হাইলাইট করতে চাই।
৩.১ Indexing Data
প্রথমে, আমাদের ডেটা ইনডেক্স করতে হবে। নিচে একটি উদাহরণ দেয়া হলো যেখানে Lucene IndexWriter ব্যবহার করে ডেটা ইনডেক্স করা হয়েছে।
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.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import java.io.IOException;
import java.nio.file.Paths;
public class LuceneIndexer {
public static void main(String[] args) throws IOException {
// Directory where the index will be stored
Directory directory = FSDirectory.open(Paths.get("indexDirectory"));
// Create IndexWriter
IndexWriterConfig config = new IndexWriterConfig(new StandardAnalyzer());
IndexWriter writer = new IndexWriter(directory, config);
// Create a new Document
Document doc = new Document();
doc.add(new TextField("content", "Lucene is a powerful search engine library", Field.Store.YES));
// Add document to the index
writer.addDocument(doc);
// Commit changes and close
writer.commit();
writer.close();
}
}
এই কোডের মাধ্যমে, আমরা একটি টেক্সট ইনডেক্স করেছি যেখানে "Lucene is a powerful search engine library" টেক্সট রয়েছে।
৩.২ Searching and Highlighting the Search Term
এখন আমরা ইনডেক্সের মধ্যে সার্চ করে, আমাদের সার্চ শব্দ "Lucene" কে হাইলাইট করব। আমরা Lucene Highlighter ক্লাস ব্যবহার করব হাইলাইটিং করার জন্য।
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.highlight.*;
import java.io.IOException;
import java.nio.file.Paths;
import org.apache.lucene.store.FSDirectory;
public class LuceneSearcher {
public static void main(String[] args) throws Exception {
// Directory where the index is stored
IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get("indexDirectory")));
IndexSearcher searcher = new IndexSearcher(reader);
// Create a query to search the term "Lucene"
QueryParser parser = new QueryParser("content", new StandardAnalyzer());
Query query = parser.parse("Lucene");
// Search the index
TopDocs results = searcher.search(query, 10);
// Initialize Highlighter
Formatter formatter = new SimpleHTMLFormatter("<b>", "</b>");
Fragmenter fragmenter = new SimpleFragmenter(50); // Fragment size of 50 characters
Highlighter highlighter = new Highlighter(formatter, fragmenter);
// Process the hits and highlight the term "Lucene"
for (int i = 0; i < results.scoreDocs.length; i++) {
int docId = results.scoreDocs[i].doc;
Document doc = searcher.doc(docId);
String text = doc.get("content");
TokenStream tokenStream = TokenSources.getAnyTokenStream(reader, docId, "content", new StandardAnalyzer());
String highlightedText = highlighter.getBestFragment(tokenStream, text);
// Output the highlighted result
if (highlightedText != null) {
System.out.println("Highlighted: " + highlightedText);
} else {
System.out.println("No Highlighted Text Found");
}
}
// Close the index reader
reader.close();
}
}
এখানে:
- Formatter: এটি হাইলাইট করা অংশের ফরম্যাট নির্ধারণ করে (এখানে
<b>এবং</b>ব্যবহার করা হয়েছে)। - Fragmenter: এটি ডকুমেন্টের মধ্যে টেক্সট ভাগ করে, যাতে শুধু সংশ্লিষ্ট অংশটিই হাইলাইট হয় (এখানে ৫০ ক্যারেক্টারের ফ্র্যাগমেন্ট ব্যবহার করা হয়েছে)।
- Highlighter: এটি Formatter এবং Fragmenter এর মাধ্যমে সার্চ টার্ম হাইলাইট করে।
এখন, যদি আমরা "Lucene" শব্দটি খুঁজে পাই, তাহলে এটি বোল্ড করে (যেমন <b>Lucene</b>) দেখাবে।
৪. Lucene Highlighter এর উপকারিতা
- User-friendly Search Results: সার্চ শব্দগুলো হাইলাইট করার মাধ্যমে ব্যবহারকারীরা দ্রুত এবং সহজে প্রয়োজনীয় তথ্য খুঁজে পেতে পারে।
- Performance: Lucene Highlighter compile-time এ কাজ করে, ফলে এটি দ্রুত এবং কার্যকর।
- Customization: আপনি সহজেই হাইলাইটিং ফরম্যাট এবং ফ্র্যাগমেন্ট আকার কাস্টমাইজ করতে পারেন।
সারাংশ
Lucene Highlighter ক্লাস ব্যবহার করে আপনি সার্চ টার্মগুলোর হাইলাইটিং করতে পারেন, যা ব্যবহারকারীদের জন্য খুবই উপকারী। এই প্রক্রিয়ায় Formatter এবং Fragmenter ব্যবহার করে আপনি সার্চ টার্মের অবস্থান শনাক্ত করতে এবং হাইলাইট করতে পারেন। Lucene Highlighter সরল ও কার্যকরী উপায়ে হাইলাইটিং ফিচার প্রদান করে, যা অনেক সার্চ অ্যাপ্লিকেশনে ব্যবহার করা হয়।
Apache Lucene একটি শক্তিশালী ফ্রি এবং ওপেন সোর্স সনাক্তকরণ এবং টেক্সট অনুসন্ধান লাইব্রেরি, যা বড় আকারের টেক্সট ডেটাবেস বা ডকুমেন্ট ইনডেক্সিং এবং অনুসন্ধান করার জন্য ব্যবহৃত হয়। Lucene এর হাইলাইটিং সুবিধা আপনাকে অনুসন্ধান করা শব্দ বা প্যাটার্নগুলি ডকুমেন্টের মধ্যে হাইলাইট করার সুযোগ দেয়, যাতে ইউজাররা তাদের অনুসন্ধান ফলাফল আরও সহজে দেখতে পারে।
এই গাইডে, আমরা Lucene তে Custom Highlighting Techniques এর বিষয়ে আলোচনা করব, যেখানে আপনি কাস্টমাইজড হাইলাইটিং স্টাইল এবং পদ্ধতি তৈরি করতে পারবেন।
১. Lucene Highlighting Overview
Lucene হাইলাইটিং হল একটি প্রক্রিয়া যার মাধ্যমে অনুসন্ধান ফলাফলে পাওয়া কিওয়ার্ড বা প্যাটার্ন গুলি হাইলাইট করা হয়। এটি বিশেষভাবে গুরুত্বপূর্ণ যখন আপনি বড় ডেটাসেটে অনুসন্ধান করছেন এবং আপনি চান যে ইউজাররা দ্রুত তাদের অনুসন্ধানের ফলাফল দেখতে পাক।
Lucene হাইলাইটিং সাধারণত Fragmenter, Formatter, এবং Scorer ব্যবহার করে কাজ করে। Fragmenter ডকুমেন্টের টেক্সটকে ছোট ছোট অংশে বিভক্ত করে, এবং Formatter সেই অংশগুলোকে কাস্টমাইজডভাবে প্রদর্শন করে।
২. Lucene Highlighting API
Lucene হাইলাইটিং করতে আপনাকে Highlighter ক্লাসটি ব্যবহার করতে হবে। সাধারণত, Highlighter টেক্সটের মধ্যে কিওয়ার্ডগুলো খুঁজে বের করে এবং তাদের জন্য কাস্টম হাইলাইটিং তৈরি করে।
Highlighter ক্লাসের মৌলিক কনফিগারেশন:
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.*;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.search.highlight.*;
import java.io.IOException;
import java.nio.file.Paths;
public class LuceneHighlightingExample {
public static void main(String[] args) throws Exception {
String queryStr = "searchTerm"; // The term you're searching for
String indexDir = "path/to/index"; // The index directory path
FSDirectory directory = FSDirectory.open(Paths.get(indexDir));
IndexReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
QueryParser parser = new QueryParser("content", new StandardAnalyzer());
Query query = parser.parse(queryStr);
// Highlighter setup
Highlighter highlighter = new Highlighter(new QueryScorer(query));
Formatter formatter = new SimpleHTMLFormatter("<b>", "</b>"); // Use <b> tag for highlighting
highlighter.setTextFragmenter(new SimpleFragmenter(100)); // Fragment size of 100 characters
TopDocs topDocs = searcher.search(query, 10);
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
Document doc = searcher.doc(scoreDoc.doc);
String content = doc.get("content");
// Apply highlighting
String highlightedText = highlighter.getBestFragment(new StandardAnalyzer(), "content", content);
if (highlightedText != null) {
System.out.println("Highlighted: " + highlightedText);
} else {
System.out.println("No highlight found");
}
}
reader.close();
}
}
এখানে:
- QueryScorer এবং SimpleHTMLFormatter ব্যবহার করে, আপনি কিওয়ার্ডগুলোকে
<b>ট্যাগ দিয়ে হাইলাইট করছেন। - SimpleFragmenter সেটআপ করা হয়েছে যাতে ফ্রাগমেন্টের দৈর্ঘ্য ১০০ ক্যারেক্টার হয়।
৩. Custom Highlighting Techniques
Lucene এ কাস্টম হাইলাইটিং করার জন্য আপনি Fragmenter, Formatter, এবং Scorer কাস্টমাইজ করতে পারেন, যা আপনাকে আপনার টেক্সটের হাইলাইটিং প্রক্রিয়াটি আরও বিশেষায়িত এবং নিয়ন্ত্রিতভাবে করতে সাহায্য করবে।
৩.১ Custom Formatter
Formatter হল সেই ক্লাস যা কাস্টম হাইলাইটিং আউটপুট ফরম্যাট তৈরি করে। আপনি Formatter ক্লাস কাস্টমাইজ করে আপনার পছন্দমতো হাইলাইটিং স্টাইল তৈরি করতে পারেন।
উদাহরণস্বরূপ, CustomFormatter ক্লাস তৈরি করতে পারেন যা হাইলাইট করা শব্দগুলোর চারপাশে [highlight] ট্যাগ যুক্ত করবে:
public class CustomFormatter extends Formatter {
@Override
public String highlightTerm(String originalText, TokenGroup tokenGroup) {
StringBuffer highlightedText = new StringBuffer();
for (Token token : tokenGroup.getTokens()) {
highlightedText.append("[highlight]").append(token.getTerm()).append("[/highlight]");
}
return highlightedText.toString();
}
}
এখানে, [highlight] ট্যাগে হাইলাইটিং করা টোকেনগুলোর মধ্যে কাস্টম স্টাইল প্রয়োগ করা হয়েছে।
৩.২ Custom Fragmenter
Fragmenter হল সেই ক্লাস যা কিভাবে টেক্সট ফ্রাগমেন্ট করা হবে তা নির্ধারণ করে। আপনি SimpleFragmenter বা EdgeFragmenter এর মতো স্ট্যান্ডার্ড ফ্রাগমেন্টার ব্যবহার করতে পারেন অথবা নিজস্ব ফ্রাগমেন্টার ক্লাস তৈরি করতে পারেন।
একটি কাস্টম ফ্রাগমেন্টার উদাহরণ:
public class CustomFragmenter extends Fragmenter {
@Override
public String[] getFragments(TokenStream tokenStream) throws IOException {
// Custom logic to fragment text
// You can use custom rules to split the text
return new String[] { "Custom Fragmented Text" };
}
}
এখানে আপনি আপনার টেক্সটের কাস্টম ফ্রাগমেন্টেশন লজিক সংজ্ঞায়িত করতে পারবেন।
৩.৩ Custom Scorer
Scorer ক্লাস ব্যবহার করে আপনি যেভাবে শব্দ বা প্যাটার্ন স্কোর করবেন তা কাস্টমাইজ করতে পারেন। স্কোরার আপনাকে কোনো নির্দিষ্ট প্যাটার্নের জন্য হাইলাইটিংয়ের গুরুত্ব নির্ধারণে সহায়তা করে।
public class CustomQueryScorer extends QueryScorer {
public CustomQueryScorer(Query query) {
super(query);
}
@Override
public float score(int docId, int freq) throws IOException {
// Custom scoring logic
return super.score(docId, freq) * 2; // Example: Double the score for certain terms
}
}
এখানে, কাস্টম স্কোরার ব্যবহার করে আপনি শব্দগুলোর স্কোরিং প্রক্রিয়া কাস্টমাইজ করতে পারেন।
৪. Performance Considerations for Highlighting
Lucene হাইলাইটিং ব্যবহারের সময় পারফরম্যান্সের বিষয়টি লক্ষ্য রাখা জরুরি, বিশেষ করে যখন বিশাল ডেটাসেট বা অনেক অনুসন্ধান শব্দ থাকে। Highlighter ক্লাসের ব্যবহারে বিভিন্ন টেকনিক যেমন Caching, Fragmentation, এবং Scoring অপটিমাইজ করা হতে পারে।
Best Practices:
- Text Fragment Size: ফ্রাগমেন্ট সাইজ কমানো (যেমন ২০০ থেকে ১০০ ক্যারেক্টার) পারফরম্যান্সের জন্য সহায়ক হতে পারে।
- Caching: যদি একাধিক বার একই টেক্সট হাইলাইট করা হয়, তাহলে সেগুলো কেবল একবার প্রসেস করে কেচে রাখা যেতে পারে।
- Limit the Number of Hits: খুব বেশি অনুসন্ধান ফলাফল না আসতে দিন, এতে হাইলাইটিং আরো দ্রুত হবে।
সারাংশ
Lucene Custom Highlighting Techniques বিভিন্ন ধরনের কাস্টমাইজেশন সুযোগ প্রদান করে, যা আপনাকে টেক্সট অনুসন্ধান এবং ফলাফলের মধ্যে হাইলাইটিং প্রক্রিয়াটি আরও নিয়ন্ত্রিত এবং উন্নত করতে সাহায্য করে। আপনি Formatter, Fragmenter, এবং Scorer ক্লাস কাস্টমাইজ করে আপনার প্রয়োজন অনুযায়ী হাইলাইটিং স্টাইল তৈরি করতে পারেন, যা টেক্সট ফরম্যাটিং এবং ডেটা প্রদর্শনে শক্তিশালী ফিচার প্রদান করে।
Lucene এর কাস্টম হাইলাইটিং কৌশল আপনার প্রোজেক্টের টেক্সট অনুসন্ধান ফলাফলে আরও মানসম্পন্ন এবং সহজে ব্যবহৃত হাইলাইটিং ফিচার তৈরি করতে সহায়ক।
Apache Lucene একটি শক্তিশালী এবং জনপ্রিয় ওপেন সোর্স লাইব্রেরি যা Java ভিত্তিক টেক্সট সার্চ ইঞ্জিন তৈরি করতে ব্যবহৃত হয়। এটি Indexing এবং Searching কার্যক্রম খুব দ্রুত এবং কার্যকরভাবে সম্পাদন করতে সক্ষম। Lucene এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হল Term Highlighting, যার মাধ্যমে আপনি সার্চ রেজাল্টের মধ্যে যে টার্ম বা শব্দটি খোঁজা হয়েছে, তা হাইলাইট করতে পারেন।
এই টিউটোরিয়ালে আমরা দেখব কিভাবে Lucene ব্যবহার করে সার্চ রেজাল্টে টার্ম হাইলাইট করা যায়। এটি খুবই কার্যকরী যখন আপনি সার্চ রেজাল্টে ব্যবহারকারীর দেওয়া কিওয়ার্ডগুলো হাইলাইট করতে চান, যাতে ব্যবহারকারী সঠিক তথ্য দ্রুত খুঁজে পায়।
১. Lucene Indexing এবং Searching প্রক্রিয়া
Lucene তে টার্ম হাইলাইট করতে, প্রথমে আপনাকে Index তৈরি করতে হবে, তারপর Search করতে হবে। সেই সার্চের ফলাফল থেকে আপনি হাইলাইট করতে চান এমন টার্ম বা শব্দগুলো আলাদা করতে হবে।
Indexing
Indexing হল প্রক্রিয়া যেখানে টেক্সট ডেটা থেকে গুরুত্বপূর্ণ তথ্য বা টার্ম সংরক্ষণ করা হয়, যা পরে দ্রুত সার্চ করতে সাহায্য করে।
Searching
Searching হল প্রক্রিয়া যেখানে ব্যবহারকারী একটি কিওয়ার্ড প্রদান করে এবং Lucene ইন্ডেক্স থেকে সেই কিওয়ার্ডের সাথে সম্পর্কিত ডেটা খুঁজে বের করে।
২. Lucene Search Result এ Term Highlighting
Lucene তে সার্চ রেজাল্টে টার্ম হাইলাইট করার জন্য Highlighter ক্লাস ব্যবহার করা হয়। এটি সার্চ রেজাল্টে টার্মগুলোকে HTML ফরম্যাটে হাইলাইট করে, যাতে আপনি সহজে সার্চ রেজাল্টে প্রাসঙ্গিক শব্দ বা টার্মগুলো চিহ্নিত করতে পারেন।
৩. Example: Term Highlighting in Lucene
এই উদাহরণে, আমরা দেখব কিভাবে Lucene এ Indexing এবং Searching এর মাধ্যমে সার্চ রেজাল্টে টার্ম হাইলাইট করা যায়।
৩.১ Lucene Indexing
প্রথমে, আপনাকে Lucene ইনডেক্স তৈরি করতে হবে, যেখানে আপনার ডকুমেন্টের সব টার্ম ইনডেক্স করা হবে।
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.RAMDirectory;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
public class LuceneIndexer {
public static void main(String[] args) throws Exception {
// Create an in-memory index
RAMDirectory directory = new RAMDirectory();
// Create an analyzer (StandardAnalyzer is used here)
StandardAnalyzer analyzer = new StandardAnalyzer();
// Create IndexWriter configuration
IndexWriterConfig config = new IndexWriterConfig(analyzer);
// Create IndexWriter
IndexWriter writer = new IndexWriter(directory, config);
// Create a document
Document doc = new Document();
doc.add(new TextField("content", "Lucene is a powerful search library", Field.Store.YES));
// Add the document to the index
writer.addDocument(doc);
// Commit and close the writer
writer.close();
}
}
এখানে, RAMDirectory ব্যবহার করা হয়েছে যাতে ইন-মেমরি ডিরেক্টরি তৈরি হয় এবং TextField ব্যবহার করা হয়েছে যাতে টেক্সট ডেটা ইনডেক্স করা হয়।
৩.২ Lucene Search Query
এখন, আমরা ইন্ডেক্সে একটি সার্চ কিউয়ারি রান করব এবং সেই কিউয়ারির মাধ্যমে পাওয়া রেজাল্টে টার্ম হাইলাইট করব।
import org.apache.lucene.search.Query;
import org.apache.lucene.search.QueryParser;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
public class LuceneSearchAndHighlight {
public static void main(String[] args) throws Exception {
// Create an IndexReader to read the index
DirectoryReader reader = DirectoryReader.open(new RAMDirectory());
IndexSearcher searcher = new IndexSearcher(reader);
// Create a query (search for the word "Lucene")
QueryParser parser = new QueryParser("content", new StandardAnalyzer());
Query query = parser.parse("Lucene");
// Perform the search
TopDocs results = searcher.search(query, 10);
// Set up the highlighter
SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<b>", "</b>");
QueryScorer scorer = new QueryScorer(query);
Highlighter highlighter = new Highlighter(formatter, scorer);
// Highlight the results
for (int i = 0; i < results.scoreDocs.length; i++) {
int docId = results.scoreDocs[i].doc;
Document doc = searcher.doc(docId);
String text = doc.get("content");
// Highlight the text with the query
String highlightedText = highlighter.getBestFragment(new StandardAnalyzer(), "content", text);
System.out.println("Highlighted Text: " + highlightedText);
}
// Close the reader
reader.close();
}
}
এখানে:
- QueryParser ব্যবহার করে একটি কিউয়ারি তৈরি করা হয়েছে (যেমন
"Lucene"শব্দটি খুঁজতে)। - Highlighter ক্লাস ব্যবহার করে, সার্চ রেজাল্টে টার্ম Lucene হাইলাইট করা হয়েছে।
- SimpleHTMLFormatter ব্যবহার করে, হাইলাইট করা টার্মগুলি
<b>এবং</b>ট্যাগে রাখা হয়েছে।
৪. Output
যদি আপনি উপরের কোডটি চালান, আপনি নিম্নলিখিত আউটপুট দেখতে পাবেন:
Highlighted Text: <b>Lucene</b> is a powerful search library
এখানে, Lucene শব্দটি <b> এবং </b> ট্যাগে হাইলাইট হয়েছে।
৫. Summary
Lucene তে টার্ম হাইলাইট করা খুবই সহজ এবং কার্যকরী। এটি ব্যবহারকারীর জন্য একটি চমৎকার সুবিধা প্রদান করে, কারণ তারা তাদের সার্চ রেজাল্টে অবিলম্বে খোঁজা শব্দ বা টার্ম দেখতে পারে। Highlighter ক্লাস ব্যবহার করে আপনি সার্চ রেজাল্টে হাইলাইট করতে পারেন এবং সহজেই HTML ফরম্যাটে কাস্টম টার্ম হাইলাইট করতে পারেন। এই টুলটি বিশেষত ব্যবহারকারীর জন্য সহজ এবং কার্যকরী সোজাসুজি সার্চ রেজাল্ট তৈরি করতে সহায়তা করে।
Read more