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

spring?boot?3使用?elasticsearch?提供搜索建議的實(shí)例詳解

 更新時(shí)間:2023年08月29日 17:02:53   作者:北漂的菜小白  
這篇文章主要介紹了spring?boot3使用elasticsearch提供搜索建議,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

業(yè)務(wù)場(chǎng)景

用戶輸入內(nèi)容,快速返回建議,示例效果如下

技術(shù)選型

  • spring boot 3
  • elasticsearch server 7.17.4
  • spring data elasticsearch 5.0.1
  • elasticsearch-java-api 8.5.3

pom.xml

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

yml

spring:
  elasticsearch:
    uris: http://127.0.0.1:9200
  data:
    elasticsearch:
      repositories:
        enabled: true

實(shí)體類

為了啟動(dòng)時(shí)候自己創(chuàng)建相關(guān)的index,以及存儲(chǔ)搜索內(nèi)容

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.CompletionField;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.core.suggest.Completion;
/**
 * 業(yè)務(wù)搜索建議
 * @author chunyang.leng
 * @date 2023-08-21 14:24
 */
@Document(indexName = "biz_suggest")
public class BizSuggestDocument {
    @Id
    private Long id;
    /**
     * 標(biāo)題,可以用于糾錯(cuò),不參與搜索建議
     */
    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String name;
    /**
     * 自動(dòng)補(bǔ)全標(biāo)題,搜索建議使用的對(duì)象
     */
    @CompletionField(analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
    private Completion completionName;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Completion getCompletionName() {
        return completionName;
    }
    public void setCompletionName(Completion completionName) {
        this.completionName = completionName;
    }
}

搜索結(jié)果對(duì)象

/**
 * 搜索建議返回對(duì)象
 * @author chunyang.leng
 * @date 2023-08-21 19:02
 */
public class SuggestVO {
    /**
     * 數(shù)據(jù)id
     */
    private Long id;
    /**
     * 內(nèi)容
     */
    private String text;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getText() {
        return text;
    }
    public void setText(String text) {
        this.text = text;
    }
}

搜索業(yè)務(wù)層

數(shù)據(jù)導(dǎo)入時(shí)候,因?yàn)橛袛?shù)據(jù)格式要求,必須使用實(shí)體類進(jìn)行寫(xiě)入

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.SearchRequest;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.search.CompletionSuggester;
import co.elastic.clients.elasticsearch.core.search.Suggester;
import co.elastic.clients.elasticsearch.core.search.Suggestion;
import co.elastic.clients.elasticsearch.core.search.TermSuggester;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
 * @author chunyang.leng
 * @date 2023-08-18 18:29
 */
@Component
public class SuggestionServiceImpl implements SuggestionService {
    /**
     * 搜索建議 key
     */
    private static final String SUGGEST_TAG = "suggest_query";
    /**
     * 糾錯(cuò)key
     */
    private static final String TERM_TAG = "suggest_team";
    @Autowired
    private ElasticsearchClient elasticsearchClient;
    /**
     * 根據(jù) 關(guān)鍵詞,返回搜索建議
     *
     * @param match 搜索關(guān)鍵詞
     * @return 搜索建議,10條
     */
    @Override
    public List<SuggestVO> suggest(String match) throws IOException {
        SearchRequest completionSuggestSearchRequest = new SearchRequest
            .Builder()
            .suggest(
                new Suggester
                    .Builder()
                    .suggesters(SUGGEST_TAG, builder -> builder.prefix(match)
                        .completion(new CompletionSuggester
                            .Builder()
                            .field("completionName")
                            .size(10)
                            .build()
                        )
                    )
                    .build())
            .build();
        SearchResponse<BizSuggestDocument> completionSuggestSearch = elasticsearchClient.search(completionSuggestSearchRequest, BizSuggestDocument.class);
        Map<String, List<Suggestion<BizSuggestDocument>>> suggest = completionSuggestSearch.suggest();
        List<Suggestion<BizSuggestDocument>> suggestions = suggest.get(SUGGEST_TAG);
        return suggestions
            .parallelStream()
            .flatMap(x -> x.completion()
                .options()
                .stream()
                .map(o -> {
                      // 原始數(shù)據(jù)對(duì)象,如果有需要,可以對(duì)其進(jìn)行操作
                    BizSuggestDocument source = o.source();
                    String text = o.text();
                    String idValue = o.id();
                    Long id = Long.valueOf(idValue);
                    SuggestVO vo = new SuggestVO();
                    vo.setId(id);
                    vo.setText(text);
                    return vo;
                }))
            .collect(Collectors.toList());
    }
}

導(dǎo)入數(shù)據(jù)

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.suggest.Completion;
/**
 * @author chunyang.leng
 * @date 2023-08-21 18:09
 */
@SpringBootTest
public class EsTest {
    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;
    @Test
    public void test() {
        BizSuggestDocument document = new BizSuggestDocument();
        document.setId(1L);
        document.setName("飛翔的世界");
        String[] s = "你的世界1.0,我的世界2.0".split(",");
        Completion completion = new Completion(s);
        completion.setWeight(10);
        document.setCompletionName(completion);
        elasticsearchTemplate.save(document);
        BizSuggestDocument document2 = new BizSuggestDocument();
        document2.setId(2L);
        document2.setName("路人甲乙丙");
        String[] s2 = "你的滑板鞋1.0,我的滑板鞋2.0".split(",");
        Completion completion1 = new Completion(s2);
        completion1.setWeight(5);
        document2.setCompletionName(completion1);
        elasticsearchTemplate.save(document2);
    }
}

POSTMAN 測(cè)試結(jié)果如下

在這里插入圖片描述

在這里插入圖片描述

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

相關(guān)文章

  • Java中return的用法(兩種)

    Java中return的用法(兩種)

    這篇文章主要介紹了Java中return的用法(兩種)的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • Java實(shí)現(xiàn)FIFO、LRU、LFU、OPT頁(yè)面置換算法

    Java實(shí)現(xiàn)FIFO、LRU、LFU、OPT頁(yè)面置換算法

    本文主要介紹了Java實(shí)現(xiàn)FIFO、LRU、LFU、OPT頁(yè)面置換算法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Java完整實(shí)現(xiàn)記事本代碼

    Java完整實(shí)現(xiàn)記事本代碼

    這篇文章主要介紹了Java實(shí)現(xiàn)的簡(jiǎn)易記事本,較為詳細(xì)的分析了基于java實(shí)現(xiàn)記事本程序的完整過(guò)程,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • Spring Data MongoDB構(gòu)建高效數(shù)據(jù)訪問(wèn)層的實(shí)現(xiàn)步驟

    Spring Data MongoDB構(gòu)建高效數(shù)據(jù)訪問(wèn)層的實(shí)現(xiàn)步驟

    本文主要介紹了Spring Data MongoDB構(gòu)建高效數(shù)據(jù)訪問(wèn)層的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-04-04
  • Java實(shí)現(xiàn)簡(jiǎn)單小畫(huà)板

    Java實(shí)現(xiàn)簡(jiǎn)單小畫(huà)板

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單小畫(huà)板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 詳解Spring框架注解掃描開(kāi)啟之配置細(xì)節(jié)

    詳解Spring框架注解掃描開(kāi)啟之配置細(xì)節(jié)

    本篇文章主要介紹了詳解Spring框架注解掃描開(kāi)啟之配置細(xì)節(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • jar包啟動(dòng)時(shí)如何讀取配置文件優(yōu)先順序

    jar包啟動(dòng)時(shí)如何讀取配置文件優(yōu)先順序

    SpringBoot啟動(dòng)時(shí)讀取配置文件有優(yōu)先順序,從高到低為:bat文件目錄/config、bat文件目錄、classpath/config、classpath,可以通過(guò)spring.config.location指定配置位置,覆蓋默認(rèn)順序,優(yōu)先級(jí)高的配置會(huì)覆蓋低的配置
    2026-05-05
  • SWT(JFace)體驗(yàn)之FormLayout布局

    SWT(JFace)體驗(yàn)之FormLayout布局

    SWT(JFace)體驗(yàn)之FormLayout布局示例代碼。
    2009-06-06
  • Java?源碼重讀系列之?HashMap

    Java?源碼重讀系列之?HashMap

    這篇文章主要為大家介紹了Java源碼重讀系列之HashMap示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Java用鄰接表存儲(chǔ)圖的示例代碼

    Java用鄰接表存儲(chǔ)圖的示例代碼

    鄰接表是圖的一種鏈?zhǔn)酱鎯?chǔ)方法,其數(shù)據(jù)結(jié)構(gòu)包括兩部分:節(jié)點(diǎn)和鄰接點(diǎn)。本文將用鄰接表實(shí)現(xiàn)存儲(chǔ)圖,感興趣的小伙伴可以了解一下
    2022-06-06

最新評(píng)論

盘锦市| 永兴县| 雷山县| 桐乡市| 綦江县| 花垣县| 松滋市| 泗阳县| 本溪市| 阜新| 贵南县| 治多县| 沽源县| 大关县| 周口市| 泽州县| 遂溪县| 神池县| 信阳市| 文登市| 威海市| 临沧市| 永春县| 定结县| 天峨县| 南昌市| 甘谷县| 醴陵市| 宜兰县| 蓬溪县| 宁夏| 顺昌县| 旺苍县| 呼和浩特市| 天祝| 松江区| 潍坊市| 秭归县| 德保县| 宾川县| 祥云县|