Elasticsearch 在 Java 中的使用教程
1. Elasticsearch 簡(jiǎn)介
Elasticsearch 是一個(gè)分布式搜索和分析引擎,基于 Apache Lucene 構(gòu)建,能夠?qū)崿F(xiàn)實(shí)時(shí)數(shù)據(jù)的存儲(chǔ)、搜索、和分析。它廣泛應(yīng)用于全文搜索、日志分析、性能監(jiān)控等領(lǐng)域。Elasticsearch 的核心概念包括文檔(document)、索引(index)、和分片(shard)。
2. 環(huán)境準(zhǔn)備
2.1 安裝 Elasticsearch
從 Elasticsearch 官方網(wǎng)站 下載并安裝適合你操作系統(tǒng)的版本。
安裝完成后,通過(guò)以下命令啟動(dò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)建一個(gè) Maven 項(xiàng)目,添加 Elasticsearch Java 客戶端的依賴。
2.3 添加 Elasticsearch 客戶端依賴
在 Maven 項(xiàng)目的 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' }
添加依賴后,確保項(xiàng)目能夠正常編譯。
3. 使用 Java 連接 Elasticsearch
接下來(lái),我們將編寫一個(gè)簡(jiǎn)單的 Java 程序來(lái)連接 Elasticsearch。
3.1 編寫連接代碼
創(chuàng)建一個(gè) 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)行這個(gè)程序,如果成功,你將看到類似如下的輸出:
Connected to Elasticsearch cluster: elasticsearch
這表明你已經(jīng)成功連接到了 Elasticsearch。
4. 基本 CRUD 操作
Elasticsearch 的 CRUD 操作主要涉及對(duì)索引中的文檔進(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)計(jì)、計(jì)算平均值、最大值、最小值等操作。
7.1 聚合查詢:計(jì)算年齡的平均值
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); // 聚合查詢:計(jì)算年齡的平均值 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)容。通過(guò)這些示例,開發(fā)者可以一步步地掌握如何在 Java 項(xiàng)目中集成 Elasticsearch,并利用其強(qiáng)大的搜索和分析功能來(lái)構(gòu)建高效的應(yīng)用程序。
到此這篇關(guān)于Elasticsearch 在 Java 中的使用教程的文章就介紹到這了,更多相關(guān)Elasticsearch 在 Java使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java操作ElasticSearch聚合查詢的示例代碼
- Java查詢Elasticsearch數(shù)據(jù)根據(jù)指定id檢索(in查詢)、sql權(quán)限過(guò)濾、多字段匹配檢索及數(shù)據(jù)排序
- 一文詳解各種ElasticSearch查詢?cè)贘ava中的實(shí)現(xiàn)
- java向es中寫入數(shù)據(jù)報(bào)錯(cuò)org.elasticsearch.action.ActionReque問(wèn)題
- Java使用ES?Client?調(diào)用滾動(dòng)查詢及Elasticsearch滾動(dòng)查詢Scrolling機(jī)制
- Java利用ElasticSearch實(shí)現(xiàn)增刪改功能
- Java利用ElasticSearch實(shí)現(xiàn)自動(dòng)補(bǔ)全功能
- Java+ElasticSearch+Pytorch實(shí)現(xiàn)以圖搜圖功能
- java操作elasticsearch詳細(xì)方法總結(jié)
相關(guān)文章
Java實(shí)現(xiàn)網(wǎng)絡(luò)文件下載以及下載到指定目錄
在Spring框架中,StreamUtils和FileCopyUtils兩個(gè)工具類提供了方便的文件下載功能,它們都屬于org.springframework.util包,可以通過(guò)簡(jiǎn)單的方法調(diào)用實(shí)現(xiàn)文件流的復(fù)制和下載,這些工具類支持多種參數(shù)傳遞,涵蓋了文件下載的多種場(chǎng)景2024-09-09java中金額元轉(zhuǎn)萬(wàn)元工具類的實(shí)例
這篇文章主要介紹了java中金額元轉(zhuǎn)萬(wàn)元工具類的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02解決springboot application.properties server.port配置問(wèn)題
這篇文章主要介紹了解決springboot application.properties server.port配置問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08java編程FinalReference與Finalizer原理示例詳解
這篇文章主要為大家介紹了java編程FinalReference與Finalizer的核心原理以及示例源碼的分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-01-01Java同學(xué)找工作最懵圈的問(wèn)題:到底啥是分布式系統(tǒng)開發(fā)經(jīng)驗(yàn)?(推薦)
這篇文章主要介紹了分布式系統(tǒng)開發(fā)經(jīng)驗(yàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04