Lucene একটি উচ্চ-পারফরম্যান্স, full-text search library যা Java এ তৈরি করা হয়েছে। এটি Elasticsearch এর মূল অনুসন্ধান ইঞ্জিন এবং বিশাল পরিমাণ ডেটা থেকে দ্রুত অনুসন্ধান এবং বিশ্লেষণ করতে সক্ষম। Lucene এবং Elasticsearch একসাথে ব্যবহৃত হলে আপনি খুব শক্তিশালী এবং দ্রুত অনুসন্ধান সিস্টেম তৈরি করতে পারেন।
এই টিউটোরিয়ালে, আমরা Lucene এবং Elasticsearch ব্যবহার করে একটি Advanced Search Application তৈরি করার প্রক্রিয়া উদাহরণ সহ দেখব।
১. Lucene এবং Elasticsearch এর মধ্যে সম্পর্ক
Lucene একটি powerful search library যা text indexing এবং searching-এর জন্য ব্যবহৃত হয়। Elasticsearch Lucene-এর উপরে নির্মিত একটি distributed search and analytics engine যা বড় পরিমাণের ডেটা থেকে দ্রুত এবং স্কেলেবল সার্চ কিউরি চালাতে সক্ষম। Elasticsearch Lucene কে ব্যবহার করে ডেটার ইনডেক্স তৈরি এবং অনুসন্ধান পরিচালনা করে, এবং এটি সহজেই ক্লাস্টারে স্কেল করা যায়।
২. Elasticsearch ইনস্টলেশন এবং কনফিগারেশন
Elasticsearch ব্যবহার শুরু করতে প্রথমে আপনাকে এটি ইনস্টল করতে হবে।
২.১ Elasticsearch ইনস্টল করা
- Elasticsearch ডাউনলোড এবং ইনস্টল করুন Elasticsearch official website থেকে।
- ডাউনলোড করা ফাইলটি আনজিপ করুন এবং টার্মিনালে
bin/elasticsearchকমান্ড চালান।
২.২ Elasticsearch চালানো
ইনস্টলেশনের পর, আপনাকে কমান্ড লাইন থেকে নিম্নলিখিত কমান্ডটি চালাতে হবে:
bin/elasticsearch
এটি Elasticsearch সার্ভার চালু করবে। আপনি এটি http://localhost:9200 এ দেখতে পারবেন।
৩. Lucene ইনডেক্সিং এবং সার্চিং
৩.১ Lucene ইনডেক্সিং
Lucene ইনডেক্স তৈরি করার জন্য IndexWriter এবং Document ব্যবহার করা হয়। প্রথমে আপনাকে একটি IndexWriter তৈরি করতে হবে এবং তারপর সেখানে Document যুক্ত করতে হবে।
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.RAMDirectory;
public class LuceneIndexExample {
public static void main(String[] args) throws Exception {
// RAMDirectory is an in-memory directory
RAMDirectory index = new RAMDirectory();
// Create an analyzer
StandardAnalyzer analyzer = new StandardAnalyzer();
// Create an IndexWriter
IndexWriter writer = new IndexWriter(index, new IndexWriterConfig(analyzer));
// Create a document
Document doc = new Document();
doc.add(new Field("title", "Lucene and Elasticsearch", Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("content", "This is a basic example of using Lucene for search.", Field.Store.YES, Field.Index.ANALYZED));
// Add document to index
writer.addDocument(doc);
// Commit and close the writer
writer.commit();
writer.close();
}
}
এখানে, আমরা একটি RAMDirectory তৈরি করেছি (যা ইন-মেমরি ইনডেক্স হিসাবে কাজ করে), একটি StandardAnalyzer ব্যবহার করেছি এবং একটি Document তৈরি করেছি যা title এবং content ফিল্ডস নিয়ে কাজ করছে।
৩.২ Lucene সার্চিং
Lucene ইনডেক্সে সার্চ করার জন্য IndexSearcher এবং QueryParser ব্যবহার করা হয়।
import org.apache.lucene.search.Query;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
public class LuceneSearchExample {
public static void main(String[] args) throws Exception {
RAMDirectory index = new RAMDirectory();
StandardAnalyzer analyzer = new StandardAnalyzer();
// Assuming the index has been created as shown in the previous code
DirectoryReader reader = DirectoryReader.open(index);
IndexSearcher searcher = new IndexSearcher(reader);
// Parse a query string
QueryParser parser = new QueryParser("content", analyzer);
Query query = parser.parse("Lucene");
// Execute the search
TopDocs results = searcher.search(query, 10);
// Display results
for (ScoreDoc scoreDoc : results.scoreDocs) {
Document doc = searcher.doc(scoreDoc.doc);
System.out.println("Title: " + doc.get("title"));
}
}
}
এখানে QueryParser ব্যবহার করে আমরা content ফিল্ডে "Lucene" শব্দটি খুঁজে বের করছি। এবং সার্চের ফলাফলটি ডিসপ্লে করছি।
৪. Elasticsearch এর সাথে Lucene সার্চ একত্রিত করা
এখন, Lucene এবং Elasticsearch একসাথে ব্যবহার করা হবে, যেখানে Elasticsearch Lucene-এর সাথে ইন্টিগ্রেটেড এবং এটি ক্লাস্টার স্কেলিং এবং উন্নত অনুসন্ধান ফিচার প্রদান করবে।
৪.১ Elasticsearch Indexing
Elasticsearch ব্যবহার করে ডেটা ইনডেক্স করা খুবই সহজ। এটি RESTful API-এর মাধ্যমে ইনডেক্সিং সমর্থন করে। নিচে একটি Elasticsearch index তৈরি করার উদাহরণ দেয়া হলো:
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
public class ElasticsearchIndexExample {
public static void main(String[] args) throws Exception {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
IndexRequest request = new IndexRequest("posts");
String jsonString = "{" +
"\"title\":\"Lucene and Elasticsearch\"," +
"\"content\":\"This is a basic example of using Elasticsearch and Lucene\"" +
"}";
request.source(jsonString, XContentType.JSON);
client.index(request, RequestOptions.DEFAULT);
client.close();
}
}
এখানে, আমরা RestHighLevelClient ব্যবহার করে একটি posts ইনডেক্সে একটি ডকুমেন্ট ইনডেক্স করছি। jsonString এর মাধ্যমে ডকুমেন্টের কন্টেন্ট এবং টাইটেল পাস করা হচ্ছে।
৪.২ Elasticsearch Search
Elasticsearch এ সার্চ করার জন্য আমরা SearchRequest ব্যবহার করি।
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
public class ElasticsearchSearchExample {
public static void main(String[] args) throws Exception {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
SearchRequest searchRequest = new SearchRequest("posts");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchQuery("content", "Elasticsearch"));
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
// Process search results
searchResponse.getHits().forEach(hit -> {
System.out.println(hit.getSourceAsString());
});
client.close();
}
}
এখানে, matchQuery ব্যবহার করে content ফিল্ডে "Elasticsearch" শব্দটি খুঁজে বের করা হচ্ছে। এবং সার্চের ফলাফল প্রদর্শন করা হচ্ছে।
৫. Elasticsearch এবং Lucene এর মধ্যে পার্থক্য
- Lucene একটি লাইটওয়েট, high-performance text search library যা মূলত কোডে সরাসরি ব্যবহৃত হয়, যেখানে Elasticsearch একটি distribured search engine যা Lucene এর উপর তৈরি এবং এটি ক্লাস্টার এবং স্কেলিং সাপোর্ট করে।
- Lucene কোডে directly ব্যবহার করা হয় এবং index এবং search এর জন্য API সরবরাহ করে, কিন্তু Elasticsearch একটি RESTful API সরবরাহ করে যা ডেটা সংগ্রহ এবং অনুসন্ধান পরিচালনা করতে সহায়তা করে।
- Elasticsearch আরও powerful features প্রদান করে যেমন real-time indexing, full-text search, এবং multi-index search যা Lucene সরাসরি সরবরাহ করে না।
সারাংশ
এটি একটি Elasticsearch এবং Lucene ব্যবহারের উদাহরণ ছিল, যেখানে Lucene ব্যবহার করে full-text indexing এবং searching দেখানো হয়েছে। এছাড়াও, Elasticsearch ব্যবহার করে Lucene এর উপর ডিস্ট্রিবিউটেড সিস্টেমে ডেটা ইনডেক্স এবং অনুসন্ধান করার কিভাবে করা যায় তা দেখানো হয়েছে। এটি বড় ডেটা সেটে দ্রুত অনুসন্ধান করতে সহায়তা করবে এবং বিভিন্ন ফিচার সহ আপনার সার্চ অ্যাপ্লিকেশনকে আরো শক্তিশালী করে তুলবে।
Read more