最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot3整合Elasticsearch8(elasticsearch-java)最佳實(shí)踐

 更新時(shí)間:2025年07月21日 11:11:25   作者:TinpeaV  
文章推薦使用Elasticsearch官方新客戶端(ElasticsearchJavaAPIClient)替代已廢棄的RestHighLevelClient,對(duì)比SpringDataElasticsearch和easy-es的優(yōu)缺點(diǎn),詳解SpringBoot3整合步驟及高階用法,強(qiáng)調(diào)新客戶端功能全且適配最新版本,感興趣的朋友一起看看吧

1、Elasticsearch的JAVA客戶端選擇

Elasticsearch官方支持的客戶端

客戶端名稱簡(jiǎn)介使用建議
Elasticsearch Java API Client(新客戶端)官方推薦的新客戶端,基于 JSON Mapping(如 ElasticsearchClient 類(lèi)),從 Elasticsearch 7.15 開(kāi)始推出。?推薦用于 Spring Boot 3+,Elasticsearch 8+
RestHighLevelClient(已廢棄)基于 REST 的高級(jí)客戶端,是 ES 6 ~ 7 的主力客戶端,ES 8 中已標(biāo)記為 deprecated。?不推薦新項(xiàng)目使用
Low Level REST Client底層客戶端,只提供 HTTP 封裝,不解析 JSON。

??適合自定義協(xié)議或處理特殊 JSON 請(qǐng)求場(chǎng)景

Spring官方對(duì)Elasticsearch的封裝

客戶端名稱簡(jiǎn)介特點(diǎn)
Spring Data ElasticsearchSpring 官方對(duì) Elasticsearch 的數(shù)據(jù)訪問(wèn)封裝,支持 Repository 風(fēng)格的接口編程。??開(kāi)發(fā)效率高、和 JPA 風(fēng)格一致,但功能不如原生客戶端全

easy-es(dromara團(tuán)隊(duì)),國(guó)人之光!

客戶端名稱簡(jiǎn)介特點(diǎn)
easy-es風(fēng)格類(lèi)似 MyBatis-Plus,一致的 API 和分頁(yè)查詢方式,Java 開(kāi)發(fā)者易于理解。??開(kāi)發(fā)效率高、但是是對(duì)RestHighLevelClient的深層封裝,容易受版本影響,小團(tuán)隊(duì)維護(hù)

總結(jié):

RestHighLevelClient 是ES7中使用最多的客戶端,但是在ES8中已經(jīng)廢棄。

easy-es  是基于RestHighLevelClient封裝的,會(huì)比較重,代碼風(fēng)格類(lèi)似 MyBatis-Plus,熟悉MP的同學(xué)容易上手,但是容易受RestHighLevelClient和Elasticsearch版本的限制,并且目前社區(qū)雖然活躍,但項(xiàng)目主要靠小團(tuán)隊(duì)維護(hù),不如官方客戶端那樣穩(wěn)定長(zhǎng)期。

Elasticsearch Java API Client 是 Elasticsearch 7.15 開(kāi)始推出最新的客戶端,能使用Elasticsearch中所有功能,首選首選!?。。。?!

Spring Data Elasticsearch 是Spring 官方對(duì) Elasticsearch的封裝,Springboot3中已經(jīng)棄用了RestHighLevelClient,選擇引用了Elasticsearch Java API Client,直接解決了依賴版本沖突的問(wèn)題,Spring社區(qū)強(qiáng)大,所以...不用我說(shuō)了吧....選我?。。。?!

2、Spring Data Elasticsearch 官方文檔

Elasticsearch Clients :: Spring Data Elasticsearch

3、Springboot3整合Spring Data Elasticsearch

tips:我使用的是Springboot3.3.4版本

3.1 maven引入

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

引入成功之后可以看到:

elasticsearch的新客戶端elasticsearch-java也被引入了進(jìn)來(lái)。

3.2 配置

yml配置文件

spring:
  application:
    name: cloud-elasticsearch
  elasticsearch:
    uris: http://127.0.0.1:9200 #  這里還要注意是https還是http協(xié)議
#    username: elastic #如果有賬號(hào)密碼就要配置賬號(hào)密碼,否則可以不配置
#    password: 123456
server:
  port: 20000

4、【簡(jiǎn)單使用】Spring Data Elasticsearch

4.1 創(chuàng)建ES實(shí)體類(lèi)

創(chuàng)建完實(shí)體類(lèi)后,啟動(dòng)項(xiàng)目Spring會(huì)自動(dòng)根據(jù)注解,來(lái)創(chuàng)建ES的索引(index)和映射(mapping)

@Data
@Document(indexName = "news")
public class EsNews {
    @Id
    private String id;
    @Field(type = FieldType.Text, analyzer = "ik_max_word",searchAnalyzer = "ik_smart")
    private String title;//標(biāo)題
    @Field(type = FieldType.Text, analyzer = "ik_max_word",searchAnalyzer = "ik_smart")
    private String content;//內(nèi)容
    @Field(type = FieldType.Keyword)
    private String author;//作者
    @Field(type = FieldType.Keyword)
    private List<String> tags;//標(biāo)簽
    @Field(type = FieldType.Date,pattern = "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd")
    @JsonProperty("publish_date")
    private Date publishDate;//發(fā)布時(shí)間
    @Field(type = FieldType.Date,pattern = "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd")
    @JsonProperty("create_time")
    private Date createTime;//創(chuàng)建時(shí)間
    @Field(type = FieldType.Long)
    @JsonProperty("view_count")
    private Long viewCount;//閱讀量
}

注解解析:

@Document(indexName = "news")

該實(shí)體對(duì)應(yīng)的索引名稱為:news

@Id

ES的唯一標(biāo)識(shí)

@Field

@Field(type = FieldType.Text, analyzer = "ik_max_word",searchAnalyzer = "ik_smart")

Field(字段名) , type = FieldType.Text(字段類(lèi)型為T(mén)EXT) ,analyzer = "ik_max_word"(存入時(shí)的分詞器為ik_max_word),searchAnalyzer = "ik_smart"(搜索時(shí)的分詞器為ik_smart)

@JsonProperty("publish_date")

ES中JSON字段,迎來(lái)進(jìn)行序列化映射

tips:實(shí)際開(kāi)發(fā)中業(yè)務(wù)實(shí)體類(lèi)和ES實(shí)體類(lèi)最好是分開(kāi)的,業(yè)務(wù)實(shí)體類(lèi)主要用來(lái)做數(shù)據(jù)庫(kù)操作,ES實(shí)體類(lèi)只用來(lái)做ES檢索

4.2 繼承ElasticsearchRepository接口

public interface EsNewsRepository extends ElasticsearchRepository<EsNews,String> {
}

查看ElasticsearchRepository源碼可以看到

ElasticsearchRepository也繼承了PagingAndSortingRepository(分頁(yè)和排序接口)、CrudRepository(常用基礎(chǔ)crud接口)

當(dāng)你的類(lèi)接口繼承了ElasticsearchRepository后,你輸入find,你會(huì)看到Spring幫你生成的所有常用簡(jiǎn)單的查詢語(yǔ)句。

大部分關(guān)鍵詞用法:

關(guān)鍵詞說(shuō)明等價(jià) Elasticsearch 查詢類(lèi)型
findBy查詢開(kāi)始(必須)-
And / Or條件連接符bool 查詢
Is / Equals等于term
Between在兩個(gè)值之間range
LessThan小于range
LessThanEqual小于等于range
GreaterThan大于range
GreaterThanEqual大于等于range
After大于(時(shí)間)range
Before小于(時(shí)間)range
IsNull字段為 nullmust_not exists
IsNotNull / NotNull字段非 nullexists
Like類(lèi)似(不建議用,Elasticsearch 中更推薦 Containingmatch (部分分詞匹配)
NotLike不類(lèi)似bool + must_not
StartingWith以…開(kāi)頭(需要 keyword 類(lèi)型字段,match 不支持)prefix / wildcard
EndingWith以…結(jié)尾(需 keyword 類(lèi)型字段)wildcard
Containing / Contains包含(常用于全文檢索)match
NotContaining不包含bool + must_not
In包含在列表中terms
NotIn不包含在列表中bool + must_not terms
True / False布爾值判斷term
OrderBy排序sort

4.3 CRUD接口使用

使用SpringBoot單元測(cè)試

4.3.1 新增

文檔單個(gè)新增(save): 

    @Test
    @DisplayName("新增單個(gè)文檔")
    void saveDoc(){
        EsNews news = new EsNews();
        news.setId("1");//如果不設(shè)置ID,Spring則會(huì)幫你生成一個(gè)ES風(fēng)格的隨機(jī)ID
        news.setTitle("電影《不能說(shuō)的秘密》熱映");
        news.setContent("內(nèi)容:不能說(shuō)的秘密............牛X..");
        news.setAuthor("周杰倫");
        news.setTags(Arrays.asList("電影", "國(guó)產(chǎn)"));
        news.setPublishDate(new Date());
        news.setCreateTime(new Date());
        news.setViewCount(100L);
        esNewsRepository.save(news);
    }

文檔批量新增(saveAll):

    @Test
    @DisplayName("批量新增文檔")
    void saveBatchDoc(){
        List<EsNews> newsList = new ArrayList<>();
        for (int i = 1; i <= 11; i++) {
            EsNews news = new EsNews();
            news.setId(String.valueOf(i));
            news.setTitle("電影《CPW的奇幻世界 " + i + "》");
            news.setContent("內(nèi)容 " + i);
            news.setAuthor("作者" + i);
            news.setTags(Arrays.asList("電影", "奇幻"));
            news.setPublishDate(new Date());
            news.setCreateTime(new Date());
            news.setViewCount(100L + i);
            newsList.add(news);
        }
        esNewsRepository.saveAll(newsList);
    }

4.3.3 修改

?。。lasticsearchRepository?。?!的修改跟新增是同一個(gè)接口,如果你的對(duì)象攜帶ID,那么ES會(huì)先查詢文檔庫(kù)里是有存在這么一個(gè)ID,如果存在的話則進(jìn)行 先刪除 然后 覆蓋??!

    @Test
    @DisplayName("新增單個(gè)文檔")
    void saveDoc(){
        EsNews news = new EsNews();
        news.setId("1");//ES會(huì)先找文檔庫(kù)里是否存在改ID,先刪除再覆蓋
        news.setTitle("電影《不能說(shuō)的秘密》熱映");
        news.setContent("內(nèi)容:不能說(shuō)的秘密........牛X..更新覆蓋操作");
        news.setAuthor("周杰倫");
        news.setTags(Arrays.asList("電影", "國(guó)產(chǎn)"));
        news.setPublishDate(new Date());
        news.setCreateTime(new Date());
        news.setViewCount(100L);
        esNewsRepository.save(news);
    }

如果你想做到只修改文檔中其中一條數(shù)據(jù),比如只把作者周杰倫修改成CPW,那就需要用到第五節(jié)【高階用法】Elasticsearch Java API Client

4.3.3 查詢

需求:我要查詢文檔編號(hào)為999的文檔

tips:簡(jiǎn)單的查詢,比如根據(jù)ID查詢文檔,ElasticsearchRepository已經(jīng)自己封裝好了,不用另外寫(xiě)。(findById)

    @Test
    @DisplayName("根據(jù)ID查詢文檔")
    void searchByID(){
        Optional<EsNews> news = esNewsRepository.findById("999");
        System.out.println(news);
    }

需求:我要分頁(yè)查詢,標(biāo)題包含【奇幻世界】,作者精準(zhǔn)是【作者1】的文檔

tips:這種復(fù)雜多條件的就需要我們自己寫(xiě),如果是模糊查詢的則用Containing

1、EsNewsRepository新增接口findByTitleContainingOrAuthor:

public interface EsNewsRepository extends ElasticsearchRepository<EsNews,String> {
    Page<EsNews> findByTitleContainingOrAuthor(String Title, String Author,Pageable pageable);
}

2、使用

    @Test
    @DisplayName("分頁(yè)查詢條件")
    void searchAll(){
        Pageable pageable = PageRequest.of(0, 10);
        Page<EsNews> pageList = esNewsRepository.findByTitleContainingOrAuthor("奇幻世界","作者1",pageable);
        for (EsNews news : pageList) {
            System.out.println(news);
        }
    }

根據(jù)4.2中的關(guān)鍵詞,還有更多的用法例如過(guò)濾、排序

4.3.4 刪除

刪除就沒(méi)什么好說(shuō)的了,直接上代碼!

    @Test
    @DisplayName("根據(jù)ID刪除文檔")
    void deleteDocById(){
        esNewsRepository.deleteById("1");
        System.out.println("ID為1的文檔刪除成功");
    }
    @Test
    @DisplayName("批量刪除文檔")
    void deleteBatchDoc(){
        esNewsRepository.deleteAll();
        System.out.println("文檔批量刪除成功");
    }
    @Test
    @DisplayName("根據(jù)ID批量刪除文檔")
    void deleteBatchDocByIds(){
        List<String> idList = Arrays.asList("1", "2");
        esNewsRepository.deleteAllById(idList);
        System.out.println("根據(jù)ID批量刪除文檔刪除成功");
    }

5、【高階用法】Elasticsearch Java API Client

1、修改文檔中的某一條數(shù)據(jù)

2、高級(jí)聚合查詢

6、【最佳實(shí)踐】Elasticsearch+消息隊(duì)列(RabbitMQ)+數(shù)據(jù)庫(kù)(MYSQL)

實(shí)際應(yīng)用

到此這篇關(guān)于Springboot3整合Elasticsearch8(elasticsearch-java)最佳實(shí)踐的文章就介紹到這了,更多相關(guān)Springboot3整合Elasticsearch內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java編程GUI中的事件綁定代碼示例

    Java編程GUI中的事件綁定代碼示例

    這篇文章主要介紹了Java編程GUI中的事件綁定代碼示例,簡(jiǎn)單介紹了綁定的概念,然后分享了相關(guān)代碼,具有一定參考價(jià)值,需要的朋友可以參考下。
    2017-10-10
  • SpringBoot整合Knife4j的實(shí)戰(zhàn)示例

    SpringBoot整合Knife4j的實(shí)戰(zhàn)示例

    Knife4j是一個(gè)為Java MVC框架集成Swagger生成API文檔的增強(qiáng)解決方案,本文就來(lái)介紹一下SpringBoot整合Knife4j的實(shí)戰(zhàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-08-08
  • 詳解Java中String,StringBuffer和StringBuilder的使用

    詳解Java中String,StringBuffer和StringBuilder的使用

    這篇文章主要為大家詳細(xì)介紹了Java中String,StringBuffer和StringBuilder三者的區(qū)別以及使用,文中的少了講解詳細(xì),感興趣的可以了解一下
    2022-07-07
  • IntelliJIDEA中實(shí)現(xiàn)SpringBoot多實(shí)例運(yùn)行的兩種方式

    IntelliJIDEA中實(shí)現(xiàn)SpringBoot多實(shí)例運(yùn)行的兩種方式

    在微服務(wù)開(kāi)發(fā)中,經(jīng)常需要同時(shí)啟動(dòng)多個(gè)服務(wù)實(shí)例進(jìn)行測(cè)試或模擬集群環(huán)境,?IntelliJ?IDEA?作為Java開(kāi)發(fā)者常用工具,提供了靈活的多實(shí)例啟動(dòng)支持,本文將詳細(xì)介紹如何通過(guò)修改配置?和批量啟動(dòng)?兩種方式實(shí)現(xiàn)SpringBoot多實(shí)例運(yùn)行,并解決常見(jiàn)問(wèn)題,需要的朋友可以參考下
    2025-03-03
  • SpringBoot+Shiro學(xué)習(xí)之密碼加密和登錄失敗次數(shù)限制示例

    SpringBoot+Shiro學(xué)習(xí)之密碼加密和登錄失敗次數(shù)限制示例

    本篇文章主要介紹了SpringBoot+Shiro學(xué)習(xí)之密碼加密和登錄失敗次數(shù)限制示例,可以限制登陸次數(shù),有興趣的同學(xué)可以了解一下。
    2017-03-03
  • Java程序的初始化順序,static{}靜態(tài)代碼塊和實(shí)例語(yǔ)句塊的使用方式

    Java程序的初始化順序,static{}靜態(tài)代碼塊和實(shí)例語(yǔ)句塊的使用方式

    這篇文章主要介紹了Java程序的初始化順序,static{}靜態(tài)代碼塊和實(shí)例語(yǔ)句塊的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Maven+SSM框架實(shí)現(xiàn)簡(jiǎn)單的增刪改查

    Maven+SSM框架實(shí)現(xiàn)簡(jiǎn)單的增刪改查

    這篇文章主要介紹了Maven+SSM框架實(shí)現(xiàn)簡(jiǎn)單的增刪改查,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • 使用IDEA搭建Hadoop開(kāi)發(fā)環(huán)境的操作步驟(Window10為例)

    使用IDEA搭建Hadoop開(kāi)發(fā)環(huán)境的操作步驟(Window10為例)

    經(jīng)過(guò)三次重裝,查閱無(wú)數(shù)資料后成功完成hadoop在win10上實(shí)現(xiàn)偽分布式集群,以及IDEA開(kāi)發(fā)環(huán)境的搭建。一步一步跟著本文操作可以避免無(wú)數(shù)天坑
    2021-07-07
  • 圖文詳解SpringBoot中Log日志的集成

    圖文詳解SpringBoot中Log日志的集成

    這篇文章主要給大家介紹了關(guān)于SpringBoot中Log日志的集成的相關(guān)資料,文中通過(guò)實(shí)例代碼以及圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-12-12
  • 一文掌握SpringBoot多環(huán)境配置

    一文掌握SpringBoot多環(huán)境配置

    在實(shí)際項(xiàng)目的開(kāi)發(fā)過(guò)程中,我們程序往往需要在不同環(huán)境中運(yùn)行,每個(gè)環(huán)境中的配置參數(shù)可能都會(huì)有所不同,例如數(shù)據(jù)庫(kù)連接信息、文件服務(wù)器等等,下面小編給大家介紹SpringBoot多環(huán)境配置,感興趣的朋友一起看看吧
    2024-04-04

最新評(píng)論

阿拉善右旗| 城固县| 鱼台县| 阆中市| 鸡东县| 海淀区| 保康县| 衡山县| 宁远县| 泗洪县| 将乐县| 横峰县| 万宁市| 林州市| 龙海市| 德兴市| 永吉县| 观塘区| 石河子市| 拉萨市| 白河县| 隆回县| 金门县| 迁安市| 靖远县| 安岳县| 内黄县| 永福县| 阿拉善左旗| 临颍县| 新河县| 茂名市| 内丘县| 黄冈市| 伊宁县| 神农架林区| 韶关市| 柯坪县| 遂昌县| 仁布县| 阿鲁科尔沁旗|