欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Elasticsearch 在 Java 中的使用教程

 更新時(shí)間:2025年04月03日 15:22:08   作者:boydoy1987  
Elasticsearch 是一個(gè)分布式搜索和分析引擎,基于 Apache Lucene 構(gòu)建,能夠?qū)崿F(xiàn)實(shí)時(shí)數(shù)據(jù)的存儲(chǔ)、搜索、和分析,它廣泛應(yīng)用于全文搜索、日志分析、性能監(jiān)控等領(lǐng)域,本文給大家介紹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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 排序算法圖解之Java希爾排序

    排序算法圖解之Java希爾排序

    希爾排序是希爾(Donald?Shell)于1959年提出的一種排序算法,其也是一種特殊的插入排序,即將簡(jiǎn)單的插入排序進(jìn)行改進(jìn)后的一個(gè)更加高效的版本,也稱縮小增量排序。本文通過(guò)圖片和示例講解了希爾排序的實(shí)現(xiàn),需要的可以了解一下
    2022-11-11
  • Java 實(shí)現(xiàn)多線程的幾種方式匯總

    Java 實(shí)現(xiàn)多線程的幾種方式匯總

    JAVA多線程實(shí)現(xiàn)方式主要有三種:繼承Thread類、實(shí)現(xiàn)Runnable接口、使用ExecutorService、Callable、Future實(shí)現(xiàn)有返回結(jié)果的多線程。其中前兩種方式線程執(zhí)行完后都沒(méi)有返回值,只有最后一種是帶返回值的。
    2016-03-03
  • Java實(shí)現(xiàn)網(wǎng)絡(luò)文件下載以及下載到指定目錄

    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-09
  • Java方法的參數(shù)傳遞機(jī)制詳解

    Java方法的參數(shù)傳遞機(jī)制詳解

    這篇文章主要介紹了Java方法的參數(shù)傳遞機(jī)制詳解,對(duì)于Java初學(xué)者來(lái)說(shuō),剛學(xué)習(xí)Java的時(shí)候可能經(jīng)常會(huì)聽到調(diào)用方法時(shí)參數(shù)的值傳遞與引用傳遞,但是,實(shí)際上Java中方法的參數(shù)傳遞機(jī)制只有值傳遞,需要的朋友可以參考下
    2024-01-01
  • java中金額元轉(zhuǎn)萬(wàn)元工具類的實(shí)例

    java中金額元轉(zhuǎn)萬(wàn)元工具類的實(shí)例

    這篇文章主要介紹了java中金額元轉(zhuǎn)萬(wàn)元工具類的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Java中BEAN與EJB的區(qū)別淺析

    Java中BEAN與EJB的區(qū)別淺析

    這篇文章主要介紹了Java中BEAN與EJB的區(qū)別淺析,本文總結(jié)了它們之間的不同之處,需要的朋友可以參考下
    2015-03-03
  • 如何利用JAVA實(shí)現(xiàn)走迷宮程序

    如何利用JAVA實(shí)現(xiàn)走迷宮程序

    最近經(jīng)常在機(jī)房看同學(xué)在玩一個(gè)走迷宮的游戲,比較有趣,自己也用java實(shí)現(xiàn)了一個(gè),這篇文章主要給大家介紹了關(guān)于如何利用JAVA實(shí)現(xiàn)走迷宮程序的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • 解決springboot application.properties server.port配置問(wèn)題

    解決springboot application.properties server.port配置問(wèn)題

    這篇文章主要介紹了解決springboot application.properties server.port配置問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java編程FinalReference與Finalizer原理示例詳解

    java編程FinalReference與Finalizer原理示例詳解

    這篇文章主要為大家介紹了java編程FinalReference與Finalizer的核心原理以及示例源碼的分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-01-01
  • Java同學(xué)找工作最懵圈的問(wèn)題:到底啥是分布式系統(tǒng)開發(fā)經(jīng)驗(yàn)?(推薦)

    Java同學(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

最新評(píng)論