業(yè)務(wù)場景
用戶輸入內(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í)體類
為了啟動時候自己創(chuàng)建相關(guān)的index,以及存儲搜索內(nèi)容
文章來源:http://www.zghlxwxcb.cn/news/detail-662620.html
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)題,可以用于糾錯,不參與搜索建議
*/
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String name;
/**
* 自動補(bǔ)全標(biāo)題,搜索建議使用的對象
*/
@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é)果對象
/**
* 搜索建議返回對象
* @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)入時候,因?yàn)橛袛?shù)據(jù)格式要求,必須使用實(shí)體類進(jìn)行寫入
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ù) 關(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ù)對象,如果有需要,可以對其進(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 測試結(jié)果如下
文章來源地址http://www.zghlxwxcb.cn/news/detail-662620.html
到了這里,關(guān)于spring boot 3使用 elasticsearch 提供搜索建議的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!