Lucene হল একটি শক্তিশালী ফ্রি এবং ওপেন সোর্স লাইব্রেরি যা মূলত টেক্সট ডেটা ইনডেক্সিং এবং সার্চিংয়ের জন্য ব্যবহৃত হয়। যদিও Lucene নিজেই একটি সিম্পল লাইব্রেরি, Elasticsearch একে ব্যবহার করে আরো শক্তিশালী এবং স্কেলেবেল সার্চ ইঞ্জিন তৈরি করেছে। Elasticsearch হল Lucene এর উপর ভিত্তি করে তৈরি একটি ডিসট্রিবিউটেড সার্চ এবং অ্যানালিটিক্স ইঞ্জিন, যা বড় পরিসরে ডেটা ইনডেক্স এবং সার্চিং কার্যক্রম পরিচালনা করতে ব্যবহৃত হয়।
এই টিউটোরিয়ালে আমরা দেখব কিভাবে Elasticsearch API ব্যবহার করে ডেটা ইনডেক্স করা যায় এবং কিভাবে সার্চ করা যায়।
১. ElasticSearch API সেটআপ
ElasticSearch ইনস্টল করার পর, Java ক্লায়েন্ট লাইব্রেরি ব্যবহার করে API-এর সাথে যোগাযোগ করা যায়। এটির জন্য Elasticsearch Rest High Level Client বা Elasticsearch Rest Client ব্যবহার করা হয়।
Maven Dependency (Elasticsearch Rest High Level Client)
<dependencies>
<!-- Elasticsearch Rest Client -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.10.0</version>
</dependency>
<!-- Jackson (JSON Parsing for Elasticsearch Client) -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.0</version>
</dependency>
</dependencies>
Gradle Dependency
dependencies {
implementation 'org.elasticsearch.client:elasticsearch-rest-high-level-client:7.10.0'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.10.0'
}
২. Elasticsearch Client সেটআপ
Elasticsearch API-এর সাথে Java অ্যাপ্লিকেশন সংযোগ করতে, প্রথমে ক্লায়েন্ট কনফিগার করতে হবে। সাধারণত, RestHighLevelClient ব্যবহার করে ক্লায়েন্ট তৈরি করা হয়।
Elasticsearch Client Initialization
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.apache.http.HttpHost;
public class ElasticsearchClient {
public static RestHighLevelClient createClient() {
return new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http"))
);
}
}
এখানে, localhost এবং 9200 হল Elasticsearch সার্ভারের হোস্ট এবং পোর্ট। আপনি যদি আপনার সার্ভার কোথাও অন্যত্র ইনস্টল করেন, তবে সেই অনুযায়ী এগুলি পরিবর্তন করতে হবে।
৩. Data Indexing with Elasticsearch API
ডেটা ইনডেক্স করার জন্য, প্রথমে ইনডেক্স তৈরি করতে হবে এবং তারপর ডেটা ইনডেক্স করা হবে। সাধারণত, Index API ব্যবহার করে ডেটা ইনডেক্স করা হয়।
Data Indexing Example:
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
public class IndexData {
public static void indexData(RestHighLevelClient client) throws IOException {
IndexRequest request = new IndexRequest("my_index"); // Create or specify the index
String jsonString = "{" +
"\"user\":\"john_doe\"," +
"\"message\":\"Elasticsearch indexing example\"" +
"}";
request.source(jsonString, XContentType.JSON); // JSON source for indexing
// Index the document
client.index(request, RequestOptions.DEFAULT);
}
}
এখানে, IndexRequest তৈরি করা হচ্ছে এবং একটি JSON ডকুমেন্ট ইনডেক্স করা হচ্ছে "my_index" ইনডেক্সে।
Index Creation and Mapping
Elasticsearch ইনডেক্সে ডেটা ইনডেক্স করার আগে, আপনি একটি mapping সেটআপ করতে পারেন, যা ডেটার স্কিমা সংজ্ঞায়িত করে।
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
public class CreateIndex {
public static void createIndex(RestHighLevelClient client) throws IOException {
CreateIndexRequest request = new CreateIndexRequest("my_index");
// Define mapping or other settings if required
request.mapping("properties", "{\n" +
" \"user\": { \"type\": \"text\" },\n" +
" \"message\": { \"type\": \"text\" }\n" +
"}");
client.indices().create(request, RequestOptions.DEFAULT);
}
}
এখানে, "my_index" নামের ইনডেক্স তৈরি করা হচ্ছে, যেখানে "user" এবং "message" ফিল্ডের জন্য টাইপ সেট করা হয়েছে।
৪. Searching Data from Elasticsearch
এখন, যখন ইনডেক্সিং সম্পন্ন হবে, তখন আপনি Search API ব্যবহার করে ডেটা অনুসন্ধান করতে পারবেন। এখানে একটি সাধারণ সার্চ উদাহরণ দেওয়া হলো।
Search Example:
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
public class SearchData {
public static void searchData(RestHighLevelClient client) throws IOException {
SearchRequest searchRequest = new SearchRequest("my_index");
// Define the query to search for documents containing the word "Elasticsearch"
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchQuery("message", "Elasticsearch"));
searchRequest.source(sourceBuilder);
// Execute the search request
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
// Output search results
System.out.println("Total Hits: " + response.getHits().getTotalHits().value);
response.getHits().forEach(hit -> {
System.out.println(hit.getSourceAsString());
});
}
}
এখানে, "my_index" ইনডেক্সে "message" ফিল্ডে "Elasticsearch" শব্দটি অনুসন্ধান করা হচ্ছে। সার্চের ফলাফলগুলি কনসোলে আউটপুট করা হচ্ছে।
৫. ElasticSearch Query Types
Elasticsearch বিভিন্ন ধরনের queries সাপোর্ট করে, যা আপনি ডেটা অনুসন্ধান করার সময় ব্যবহার করতে পারেন। প্রধান Query Types গুলি হল:
- Match Query: টেক্সট ফিল্ডের জন্য ব্যবহৃত, যা টার্গেট ফিল্ডে দেওয়া শব্দের সাথে মেলানো হয়।
- Term Query: একক শব্দ বা মানের জন্য ব্যবহৃত, সাধারণত non-analyzed fields এর জন্য।
- Range Query: নির্দিষ্ট রেঞ্জের মধ্যে ডেটা অনুসন্ধান করতে ব্যবহৃত হয় (যেমন, সময়, সংখ্যা ইত্যাদি)।
- Bool Query: একাধিক সাব-কোয়েরি সংযুক্ত করার জন্য ব্যবহৃত (AND, OR, NOT)।
- Prefix Query: একটি নির্দিষ্ট প্রিফিক্স দিয়ে অনুসন্ধান করা হয়।
৬. ElasticSearch Index and Search Optimization
- Bulk Indexing: যখন অনেক ডেটা ইনডেক্স করতে হয়, তখন Bulk API ব্যবহার করা উচিত। এটি একসাথে একাধিক ডকুমেন্ট ইনডেক্স করতে সক্ষম।
- Filtered Search: বড় ডেটাসেট থেকে দ্রুত সার্চের জন্য ফিল্টার এবং রেঞ্জ ব্যবহার করতে পারেন।
- Sharding and Replication: Elasticsearch-এ ডেটার শার্ডিং এবং রেপ্লিকেশন নিশ্চিত করুন যাতে পারফরম্যান্স এবং ডেটা নিরাপত্তা বৃদ্ধি পায়।
সারাংশ
Elasticsearch API ব্যবহার করে ডেটা ইনডেক্স এবং সার্চিং একটি সোজা প্রক্রিয়া। প্রথমে ডেটা ইনডেক্স করতে হয়, তারপর Search API ব্যবহার করে ডেটা অনুসন্ধান করা হয়। Elasticsearch একটি শক্তিশালী এবং স্কেলেবল সার্চ ইঞ্জিন, যা সহজেই Java অ্যাপ্লিকেশন এবং অন্যান্য প্ল্যাটফর্মে ইন্টিগ্রেট করা যায়। এর মধ্যে রয়েছে বিভিন্ন ধরনের কুইরি যেমন Match Query, Term Query, Range Query ইত্যাদি যা ডেটা অনুসন্ধানকে আরও কার্যকরী করে তোলে।
Read more