spring boot 3使用 elasticsearch 提供搜索建议的实例详解
更新时间:2023年08月29日 17:02:53 作者:北漂的菜小白
这篇文章主要介绍了spring boot3使用elasticsearch提供搜索建议,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
业务场景
用户输入内容,快速返回建议,示例效果如下
技术选型
- spring boot 3
- elasticsearch server 7.17.4
- spring data elasticsearch 5.0.1
- elasticsearch-java-api 8.5.3
pom.xml
1 2 3 4 5 6 7 8 9 | < 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
1 2 3 4 5 6 7 | spring: elasticsearch: uris: http://127.0.0.1:9200 data: elasticsearch: repositories: enabled: true |
实体类
为了启动时候自己创建相关的index,以及存储搜索内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | 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; /** * 业务搜索建议 * @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; } } |
搜索结果对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | /** * 搜索建议返回对象 * @author chunyang.leng * @date 2023-08-21 19:02 */ public class SuggestVO { /** * 数据id */ private Long id; /** * 内容 */ 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; } } |
搜索业务层
数据导入时候,因为有数据格式要求,必须使用实体类进行写入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | 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; /** * 根据 关键词,返回搜索建议 * * @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 -> { // 原始数据对象,如果有需要,可以对其进行操作 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()); } } |
导入数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | 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搜索建议内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
相关文章
基于springMvc+hibernate的web application的构建
下面小编就为大家带来一篇基于springMvc+hibernate的web application的构建。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-10-10
最新评论