spring?boot?3使用?elasticsearch?提供搜索建議的實例詳解
業(yè)務場景
用戶輸入內(nèi)容,快速返回建議,示例效果如下

技術選型
- 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實體類
為了啟動時候自己創(chuàng)建相關的index,以及存儲搜索內(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è)務搜索建議
* @author chunyang.leng
* @date 2023-08-21 14:24
*/
@Document(indexName = "biz_suggest")
public class BizSuggestDocument {
@Id
private Long id;
/**
* 標題,可以用于糾錯,不參與搜索建議
*/
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String name;
/**
* 自動補全標題,搜索建議使用的對象
*/
@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;
}
}搜索結果對象
/**
* 搜索建議返回對象
* @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è)務層
數(shù)據(jù)導入時候,因為有數(shù)據(jù)格式要求,必須使用實體類進行寫入
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";
/**
* 糾錯key
*/
private static final String TERM_TAG = "suggest_team";
@Autowired
private ElasticsearchClient elasticsearchClient;
/**
* 根據(jù) 關鍵詞,返回搜索建議
*
* @param match 搜索關鍵詞
* @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ù)對象,如果有需要,可以對其進行操作
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());
}
}導入數(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 測試結果如下


到此這篇關于spring boot 3使用 elasticsearch 提供搜索建議的文章就介紹到這了,更多相關spring boot elasticsearch搜索建議內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
基于Flyway實現(xiàn)簡化Spring Boot項目部署
這篇文章主要介紹了基于Flyway實現(xiàn)簡化Spring Boot項目部署,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-06-06
SpringBoot自動配置之自定義starter的實現(xiàn)代碼
這篇文章主要介紹了SpringBoot自動配置之自定義starter的實現(xiàn)代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
SpringBoot+RabbitMQ實現(xiàn)消息可靠傳輸詳解
消息的可靠傳輸是面試必問的問題之一,保證消息的可靠傳輸主要在生產(chǎn)端開啟?comfirm?模式,RabbitMQ?開啟持久化,消費端關閉自動?ack?模式。本文將詳解SpringBoot整合RabbitMQ如何實現(xiàn)消息可靠傳輸,需要的可以參考一下2022-05-05
基于Java將Excel科學計數(shù)法解析成數(shù)字
這篇文章主要介紹了基于Java將Excel科學計數(shù)法解析成數(shù)字,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09

