Elasticsearch 在 Java 中的使用示例教程
1. Elasticsearch 簡介
Elasticsearch 是一個分布式搜索和分析引擎,基于 Apache Lucene 構(gòu)建,能夠?qū)崿F(xiàn)實時數(shù)據(jù)的存儲、搜索、和分析。它廣泛應(yīng)用于全文搜索、日志分析、性能監(jiān)控等領(lǐng)域。Elasticsearch 的核心概念包括文檔(document)、索引(index)、和分片(shard)。
2. 環(huán)境準(zhǔn)備
2.1 安裝 Elasticsearch
從 Elasticsearch 官方網(wǎng)站 下載并安裝適合你操作系統(tǒng)的版本。
安裝完成后,通過以下命令啟動 Elasticsearch 服務(wù):
./bin/elasticsearch
默認(rèn)情況下,Elasticsearch 運(yùn)行在 http://localhost:9200。
2.2 Java 開發(fā)環(huán)境配置
- 安裝 Java SDK(JDK 11 或更高版本)。
- 安裝 Maven 或 Gradle。
- 創(chuàng)建一個 Maven 項目,添加 Elasticsearch Java 客戶端的依賴。
2.3 添加 Elasticsearch 客戶端依賴
在 Maven 項目的 pom.xml 文件中添加以下依賴:
<dependencies>
<!-- Elasticsearch Java Client -->
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>8.10.0</version>
</dependency>
</dependencies>如果你使用 Gradle,可以在 build.gradle 文件中添加以下依賴:
dependencies {
implementation 'co.elastic.clients:elasticsearch-java:8.10.0'
}添加依賴后,確保項目能夠正常編譯。
3. 使用 Java 連接 Elasticsearch
接下來,我們將編寫一個簡單的 Java 程序來連接 Elasticsearch。
3.1 編寫連接代碼
創(chuàng)建一個 Java 類,例如 ElasticsearchConnection.java,并編寫以下代碼:
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.InfoResponse;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
public class ElasticsearchConnection {
public static void main(String[] args) throws Exception {
// 創(chuàng)建 REST 客戶端
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200, "http")).build();
// 創(chuàng)建傳輸層
RestClientTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());
// 創(chuàng)建 Elasticsearch 客戶端
ElasticsearchClient client = new ElasticsearchClient(transport);
// 獲取集群信息
InfoResponse info = client.info();
System.out.println("Connected to Elasticsearch cluster: " + info.clusterName());
// 關(guān)閉客戶端
transport.close();
}
}3.2 運(yùn)行代碼
編譯并運(yùn)行這個程序,如果成功,你將看到類似如下的輸出:
Connected to Elasticsearch cluster: elasticsearch
這表明你已經(jīng)成功連接到了 Elasticsearch。
4. 基本 CRUD 操作
Elasticsearch 的 CRUD 操作主要涉及對索引中的文檔進(jìn)行增(Create)、查(Read)、改(Update)、刪(Delete)操作。
4.1 創(chuàng)建索引和插入文檔
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.IndexResponse;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import co.elastic.clients.elasticsearch.core.IndexRequest;
public class ElasticsearchCRUD {
public static void main(String[] args) throws Exception {
// 創(chuàng)建 REST 客戶端
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200, "http")).build();
// 創(chuàng)建傳輸層
RestClientTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());
// 創(chuàng)建 Elasticsearch 客戶端
ElasticsearchClient client = new ElasticsearchClient(transport);
// 創(chuàng)建文檔
String json = "{ \"name\": \"John Doe\", \"age\": 30, \"city\": \"New York\" }";
// 插入文檔到索引
IndexRequest<Object> request = new IndexRequest.Builder<>()
.index("users")
.id("1")
.document(json)
.build();
IndexResponse response = client.index(request);
System.out.println("Document inserted with ID: " + response.id());
// 關(guān)閉客戶端
transport.close();
}
}4.2 查詢文檔
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.GetResponse;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import co.elastic.clients.elasticsearch.core.GetRequest;
public class ElasticsearchRead {
public static void main(String[] args) throws Exception {
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200, "http")).build();
RestClientTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 查詢文檔
GetRequest getRequest = new GetRequest.Builder()
.index("users")
.id("1")
.build();
GetResponse<Object> response = client.get(getRequest, Object.class);
if (response.found()) {
System.out.println("Document found: " + response.source());
} else {
System.out.println("Document not found");
}
transport.close();
}
}4.3 更新文檔
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.UpdateResponse;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import co.elastic.clients.elasticsearch.core.UpdateRequest;
import java.util.Map;
public class ElasticsearchUpdate {
public static void main(String[] args) throws Exception {
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200, "http")).build();
RestClientTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 更新文檔
Map<String, Object> updateJson = Map.of(
"age", 31,
"city", "San Francisco"
);
UpdateRequest<Object, Map<String, Object>> updateRequest = new UpdateRequest.Builder<>()
.index("users")
.id("1")
.doc(updateJson)
.build();
UpdateResponse<Object> updateResponse = client.update(updateRequest, Object.class);
System.out.println("Document updated: " + updateResponse.result());
transport.close();
}
}4.4 刪除文檔
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.DeleteResponse;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import co.elastic.clients.elasticsearch.core.DeleteRequest;
public class ElasticsearchDelete {
public static void main(String[] args) throws Exception {
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200, "http")).build();
RestClientTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 刪除文檔
DeleteRequest deleteRequest = new DeleteRequest.Builder()
.index("users")
.id("1")
.build();
DeleteResponse deleteResponse = client.delete(deleteRequest);
System.out.println("Document deleted: " + deleteResponse.result());
transport.close();
}
}5. 復(fù)雜查詢操作
Elasticsearch 提供了強(qiáng)大的查詢 DSL(Domain Specific Language),支持布爾查詢、范圍查詢、聚合查詢等。
5.1 布爾查詢
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.search.Hit;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import co.elastic.clients.elasticsearch.core.SearchRequest;
import co.elastic.clients.elasticsearch.core.search.Query;
public class ElasticsearchBooleanQuery {
public static void main(String[] args) throws Exception {
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200, "http")).build();
RestClientTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 布爾查詢
SearchRequest searchRequest = new SearchRequest.Builder()
.index("users")
.query(Query
.bool(b -> b
.must(m -> m.match(match -> match.field("name").query("John Doe")))
.filter(f -> f.range(r -> r.field("age").gte(30)))
))
.build();
SearchResponse<Object> searchResponse = client.search(searchRequest, Object.class);
for (Hit<Object> hit : searchResponse.hits().hits()) {
System.out.println("Document found: " + hit.source());
}
transport.close();
}
}5.2 范圍查詢
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.search.Hit;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import co.elastic.clients.elasticsearch.core.SearchRequest;
import co.elastic.clients.elasticsearch.core.search.Query;
public class ElasticsearchRangeQuery {
public static void main(String[] args) throws Exception {
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200, "http")).build();
RestClientTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 范圍查詢:查詢 age 在 25 到 35 之間的文檔
SearchRequest searchRequest = new SearchRequest.Builder()
.index("users")
.query(Query.range(r -> r.field("age").gte(25).lte(35)))
.build();
SearchResponse<Object> searchResponse = client.search(searchRequest, Object.class);
for (Hit<Object> hit : searchResponse.hits().hits()) {
System.out.println("Document found: " + hit.source());
}
transport.close();
}
}6. 索引管理與優(yōu)化
在 Elasticsearch 中,索引管理是非常重要的操作,合理的索引設(shè)置和優(yōu)化可以大幅提升查詢性能。
6.1 創(chuàng)建索引并設(shè)置映射
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.indices.CreateIndexResponse;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import co.elastic.clients.elasticsearch.indices.CreateIndexRequest;
public class ElasticsearchCreateIndex {
public static void main(String[] args) throws Exception {
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200, "http")).build();
RestClientTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 創(chuàng)建索引并設(shè)置映射
CreateIndexRequest createIndexRequest = new CreateIndexRequest.Builder()
.index("users")
.mappings(m -> m
.properties("name", p -> p.text(t -> t))
.properties("age", p -> p.integer(i -> i))
.properties("city", p -> p.text(t -> t))
)
.build();
CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest);
if (createIndexResponse.acknowledged()) {
System.out.println("Index created successfully!");
}
transport.close();
}
}6.2 刪除索引
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.indices.DeleteIndexResponse;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import co.elastic.clients.elasticsearch.indices.DeleteIndexRequest;
public class ElasticsearchDeleteIndex {
public static void main(String[] args) throws Exception {
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200, "http")).build();
RestClientTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 刪除索引
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest.Builder()
.index("users")
.build();
DeleteIndexResponse deleteIndexResponse = client.indices().delete(deleteIndexRequest);
if (deleteIndexResponse.acknowledged()) {
System.out.println("Index deleted successfully!");
}
transport.close();
}
}7. 聚合操作
Elasticsearch 的聚合功能非常強(qiáng)大,能夠?qū)?shù)據(jù)進(jìn)行分組統(tǒng)計、計算平均值、最大值、最小值等操作。
7.1 聚合查詢:計算年齡的平均值
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.search.Hit;
import co.elastic.clients.elasticsearch.core.search.Aggregation;
import co.elastic.clients.elasticsearch.core.search.Bucket;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import co.elastic.clients.elasticsearch.core.SearchRequest;
public class ElasticsearchAggregation {
public static void main(String[] args) throws Exception {
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200, "http")).build();
RestClientTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
// 聚合查詢:計算年齡的平均值
SearchRequest searchRequest = new SearchRequest.Builder()
.index("users")
.size(0) // 不返回文檔,只返回聚合結(jié)果
.aggregations("average_age", a -> a.avg(avg -> avg.field("age")))
.build();
SearchResponse<Object> searchResponse = client.search(searchRequest, Object.class);
double averageAge = searchResponse.aggregations().get("average_age").avg().value();
System.out.println("Average age: " + averageAge);
transport.close();
}
}8. 總結(jié)
本教程詳細(xì)介紹了如何在 Java 中使用 Elasticsearch,涵蓋了連接、基本 CRUD 操作、復(fù)雜查詢、索引管理和聚合操作等方面的內(nèi)容。通過這些示例,開發(fā)者可以一步步地掌握如何在 Java 項目中集成 Elasticsearch,并利用其強(qiáng)大的搜索和分析功能來構(gòu)建高效的應(yīng)用程序。
到此這篇關(guān)于Elasticsearch 在 Java 中的使用教程的文章就介紹到這了,更多相關(guān)Java 使用Elasticsearch內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中的服務(wù)發(fā)現(xiàn)與負(fù)載均衡及Eureka與Ribbon的應(yīng)用小結(jié)
這篇文章主要介紹了Java中的服務(wù)發(fā)現(xiàn)與負(fù)載均衡:Eureka與Ribbon的應(yīng)用,通過使用Eureka和Ribbon,我們可以在Java項目中實現(xiàn)高效的服務(wù)發(fā)現(xiàn)和負(fù)載均衡,需要的朋友可以參考下2024-08-08
SpringBoot自定義Starter實現(xiàn)流程詳解
SpringBoot中的starter是一種非常重要的機(jī)制,能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進(jìn)starter,應(yīng)用者只需要在maven中引入starter依賴,SpringBoot就能自動掃描到要加載的信息并啟動相應(yīng)的默認(rèn)配置。starter讓我們擺脫了各種依賴庫的處理,需要配置各種信息的困擾2022-09-09
基于SpringBoot服務(wù)端表單數(shù)據(jù)校驗的實現(xiàn)方式
這篇文章主要介紹了基于SpringBoot服務(wù)端表單數(shù)據(jù)校驗的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
詳解如何使用ModelMapper庫進(jìn)行對象之間的屬性映射
這篇文章主要介紹了如何使用ModelMapper庫進(jìn)行對象之間的屬性映射實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
Spring HttpMessageConverter的作用及替換解析
這篇文章主要介紹了Spring HttpMessageConverter的作用及替換解析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02

