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

SpringBoot集成elasticsearch使用圖文詳解

 更新時間:2023年04月17日 09:34:13   作者:我也可以是流浪的詩人  
Spring Boot集成Elasticsearch其實非常簡單,這篇文章主要給大家介紹了關(guān)于SpringBoot集成elasticsearch使用的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

前言

此文適合了解了es相關(guān)概念以及基礎(chǔ)知識的同學(xué)閱讀

elasticsearch簡介

Elasticsearch是一個基于Lucene的搜索服務(wù)器。它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful風(fēng)格的http接口。

簡單來說,es主要是用來做搜索的,比如像商城網(wǎng)站中(商品、店鋪……)的搜索、小說網(wǎng)站中(書名、作者……)的搜索。

我們要知道,任何一門新的技術(shù)、框架、中間件出來肯定是為了解決一些問題。es的誕生就是為了在Lucene的基礎(chǔ)上更好的幫助我們解決傳統(tǒng)搜索的問題。

最原始、傳統(tǒng)的搜索功能都是基于db表的模糊查詢,這樣做有很大的局限性

  • 多維度查詢實現(xiàn)復(fù)雜:現(xiàn)在的業(yè)務(wù)場景一般都是單輸入框、多維度搜索。舉個例子,你在電商網(wǎng)站的搜索框中,既能查詢商品、也能查詢店鋪。或者查詢品牌。這種業(yè)務(wù)場景下如果用傳統(tǒng)的db模糊查詢?nèi)崿F(xiàn),要么wehre語句后面多加好幾個條件,中間用or隔開,要么新增擴展字段,將:商品名稱、店鋪名稱、品牌名稱等信息存到一個字段中,然后模糊查詢該字段。不論用哪種方式,對查詢性能以及代碼可讀性來講都是難以接受的。
  • 查詢速度受數(shù)據(jù)限制:雖然模糊查詢寫的規(guī)范點也能走索引查詢,但是當(dāng)數(shù)據(jù)量起來之后,無可避免的會降低速度(索引也不是萬能的)。

es幫我們解決了上面的問題,它作為一個專業(yè)搜索的中間件,對于查詢搜索方面肯定跟redis做緩存一樣,完全沒問題。

elasticsearch使用

這里介紹SpringBoot如何集成es來使用。像目前主流的一些開源中間件技術(shù),Spring家族都幫我們集成進去了。使用起來很方便

環(huán)境安裝

系統(tǒng):windows 10

elasticsearch官網(wǎng)下載地址

下載好對應(yīng)的windows版本,解壓到任意工作目錄,es的安裝非常方便,解壓即用。

剛下載的es默認的分詞器只能分解英文,對于中文不太友好。所以我們需要為es下載安裝IK分詞器

IK分詞器下載:

Ik分詞器下載地址,分詞器下載跟es版本對應(yīng)的就行。下載好后解壓zip包

在你下載的es安裝路徑下的plugins文件夾下創(chuàng)建一個ik的文件夾,然后將上面解壓出來的分詞器內(nèi)容復(fù)制到創(chuàng)建的ik文件夾下面。下面圖ik分詞器官方安裝說明

效果如下

ik分詞器的安裝就完成了,而后回答es根目錄下的bin目錄里,雙擊啟動es

當(dāng)es正常啟動,且啟動過程出現(xiàn)下面情況時,說明ik分詞器已經(jīng)正常安裝好可以使用了

代碼演示

1、新建springboot項目,引入依賴

<!--springboot幫我們自動集成了es,所以只需要引入下面這一個依賴即可-->
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

RestHighLevelClient配置

@Configuration
public class EsConfig {

    @Bean
    public RestHighLevelClient highLevelClient(){
        final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                .connectedTo("localhost:9200")
                .build();
        return RestClients.create(clientConfiguration).rest();
    }
}

2、在你的數(shù)據(jù)庫實體類里每個字段加上相應(yīng)的注解即可(跟Jpa一樣)

@Data
@Document(indexName = "book")
//es默認會自動創(chuàng)建索引,你可以把document理解為數(shù)據(jù)庫中的行,index理解為數(shù)據(jù)庫中的表,以前在index和document之間還有個type對應(yīng)數(shù)據(jù)庫中的表概念。后面es7之后將type去掉了,所以這里就簡單把index當(dāng)作一個表的概念去理解
public class Book {
    @Id
    @Field(type = FieldType.Long)//type表示存到es當(dāng)中的數(shù)據(jù)類型
    private Long id;
    @Field(type = FieldType.Text,analyzer = "ik-max-word")
    private String bookName;//analyzer 表示選擇分詞器
    @Field(type = FieldType.Text,analyzer = "ik-max-word")
    private String bookDesc;
    @Field(type = FieldType.Text)
    private String type;
    @Field(type = FieldType.Integer)
    private Integer status;
    @Field(analyzer = "ik-max-word")
    private String author;
    @Field(type = FieldType.Text)
    private String tag;
    @Field(type = FieldType.Date,format = DateFormat.basic_date_time)
    private LocalDateTime createTime;
    @Field(type = FieldType.Text)
    private String createBy;
    @Field(type = FieldType.Date,format = DateFormat.basic_date_time)
    private LocalDateTime updateTime;

}

由于spring官方對es的高度封裝,我們已經(jīng)可以做到像操作數(shù)據(jù)庫一樣操作es了

以上面的Book對象舉例,創(chuàng)建接口EsBooksRepository,繼承Spring封裝的ElasticsearchRepository,ElasticsearchRepository提供了一些簡單的操作es方法

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.springframework.data.elasticsearch.repository;

import org.elasticsearch.index.query.QueryBuilder;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.query.Query;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.lang.Nullable;

@NoRepositoryBean
public interface ElasticsearchRepository<T, ID> extends PagingAndSortingRepository<T, ID> {
    /** @deprecated */
    @Deprecated
    default <S extends T> S index(S entity) {
        return this.save(entity);
    }

    /** @deprecated */
    @Deprecated
    <S extends T> S indexWithoutRefresh(S entity);

    /** @deprecated */
    @Deprecated
    Iterable<T> search(QueryBuilder query);

    /** @deprecated */
    @Deprecated
    Page<T> search(QueryBuilder query, Pageable pageable);

    /** @deprecated */
    Page<T> search(Query searchQuery);

    Page<T> searchSimilar(T entity, @Nullable String[] fields, Pageable pageable);

    /** @deprecated */
    @Deprecated
    void refresh();
}

到這一步,就已經(jīng)可以簡單的使用了??梢栽谄渌胤街苯訉?chuàng)建的EsBooksRepository這個接口注入使用。比如我測試方便,直接在controller里使用

保存或者更新時,先存db后操作es。

普通查詢

上面說到集成了spring-boot-starter-data-elasticsearch后,用法上跟Jpa一樣,我們可以在自己創(chuàng)建的EsBooksRepository里自定義根據(jù)方法名查詢對應(yīng)的條件

簡單的查詢根據(jù)方法名定義就能實現(xiàn),比如說我需要查詢的是多條數(shù)據(jù),那我就選findBooksBy……,如果需要查詢1條就選findBookBy

findXXBy后面接條件,方法名定義了幾個條件,就需要傳幾個參數(shù)定義好調(diào)用的時候,直接將前端傳遞的搜索值所有參數(shù)塞一遍就好了

//這里定義了兩個查詢條件:書名和作者,直接將搜索值傳遞給定義好的方法就行
List<Book> booksByBookNameAndAuthor = esBookRepository.findBooksByBookNameOrAuthor(nameAndAuthor,nameAndAuthor);

測試結(jié)果:查詢條件值是“我的”,結(jié)果返回所有書名和作者名含有“我的”兩個字的book對象

高亮查詢

高亮查詢需要設(shè)置一些地方,下面是高亮查詢的簡單demo。

 /**
     * 書名、作者搜索
     */
    @RequestMapping(method = RequestMethod.GET, value = {"/book/search" })
    public RestResponse<List<Book>> search(@RequestParam String nameAndAuthor){
        BoolQueryBuilder queryBuilder = new BoolQueryBuilder();

//匹配兩個高亮字段:書名、作者
        queryBuilder.should(QueryBuilders.matchQuery("bookName",nameAndAuthor))
                .should(QueryBuilders.matchQuery("author",nameAndAuthor));
                //設(shè)置查詢高亮樣式preTags、postTags
                //高亮查詢其實就是給相應(yīng)需要高亮顯示的字段加個自定義樣式
        NativeSearchQuery query = new NativeSearchQueryBuilder()
                .withQuery(queryBuilder)
                        .withHighlightFields(new HighlightBuilder.Field("bookName")
                        ,new HighlightBuilder.Field("author"))
                                .withHighlightBuilder(new HighlightBuilder().preTags("<span style='color:red'>").postTags("</span>"))
                                        .build();
        SearchHits<Book> search = elasticsearchRestTemplate.search(query, Book.class);
        List<SearchHit<Book>> searchHits = search.getSearchHits();
        //查詢返回結(jié)果,將高亮字段重新賦值給相應(yīng)book對象,以便返回前端展示
        List<Book> collect = searchHits.stream().map(
                bookSearchHit -> {
                    Book content = bookSearchHit.getContent();
                    List<String> bookName = bookSearchHit.getHighlightField("bookName");
                    List<String> author = bookSearchHit.getHighlightField("author");
                    if (!CollectionUtils.isEmpty(bookName)){
                        content.setBookName(bookName.get(0));
                    }
                    if (!CollectionUtils.isEmpty(author)){
                        content.setAuthor(author.get(0));
                    }
                    return content;
                }
        ).collect(Collectors.toList());
        return RestResponse.success(collect);
    }

結(jié)果:可以看到返回的數(shù)據(jù)中,“我的”這兩個字都添加了高亮樣式,放到前端html展示就是紅字字體

結(jié)束

以上就是springboot集成es后的一個簡單使用,spring封裝過后的spring-boot-starter-data-elasticsearch使用起來還是非常方便簡單的。

到此這篇關(guān)于SpringBoot集成elasticsearch使用的文章就介紹到這了,更多相關(guān)SpringBoot集成elasticsearch使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java手機號碼工具類示例詳解(判斷運營商、獲取歸屬地)

    Java手機號碼工具類示例詳解(判斷運營商、獲取歸屬地)

    這篇文章主要介紹了Java手機號碼工具類示例詳解,通過手機號碼來判斷運營商獲取歸屬地,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • JWT 設(shè)置token過期時間無效的解決

    JWT 設(shè)置token過期時間無效的解決

    這篇文章主要介紹了JWT 設(shè)置token過期時間無效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • java使用poi讀取doc和docx文件的實現(xiàn)示例

    java使用poi讀取doc和docx文件的實現(xiàn)示例

    這篇文章主要介紹了java使用poi讀取doc和docx文件的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • mybatis空值插入處理的解決方法

    mybatis空值插入處理的解決方法

    本文主要介紹了mybatis空值插入處理的解決方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Spring Cloud 中@FeignClient注解中的contextId屬性詳解

    Spring Cloud 中@FeignClient注解中的contextId屬性詳解

    這篇文章主要介紹了Spring Cloud 中@FeignClient注解中的contextId屬性詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java面試題之HashSet的實現(xiàn)原理

    Java面試題之HashSet的實現(xiàn)原理

    這篇文章主要介紹了Java面試題之HashSet的實現(xiàn)原理,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • java中關(guān)于文本文件的讀寫方法實例總結(jié)

    java中關(guān)于文本文件的讀寫方法實例總結(jié)

    這篇文章主要介紹了java中關(guān)于文本文件的讀寫方法,實例總結(jié)了Java針對文本文件讀寫的幾種常用方法,并對比了各個方法的優(yōu)劣及特點,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • SpringBoot+log4j2.xml使用application.yml屬性值問題

    SpringBoot+log4j2.xml使用application.yml屬性值問題

    這篇文章主要介紹了SpringBoot+log4j2.xml使用application.yml屬性值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • springboot配置https訪問的方法

    springboot配置https訪問的方法

    這篇文章主要介紹了springboot配置https訪問的方法,需要的朋友可以參考下
    2018-11-11
  • MyBatis框架之mybatis逆向工程自動生成代碼

    MyBatis框架之mybatis逆向工程自動生成代碼

    Mybatis屬于半自動ORM,在使用這個框架中,工作量最大的就是書寫Mapping的映射文件,由于手動書寫很容易出錯,我們可以利用Mybatis-Generator來幫我們自動生成文件。本文主要給大家介紹mybatis逆向工程自動生成代碼,感興趣的朋友一起學(xué)習(xí)吧
    2016-04-04

最新評論