先看代碼:
controller:
//根據(jù)關(guān)鍵字搜索
@RequestMapping(value = "/searchWC", produces = "application/json; charset=utf-8")
public Resp searchWC(Integer page, Integer limit, String kw){
return searchService.searchWC(page, limit, kw);
}
//ft http://localhost:11011/search-api/search/searchWC?page=1&limit=5&kw=白色
serviceImpl:
@Override
public Resp searchWC(Integer page, Integer limit, String kw) {
//todo: 搜索ES中的數(shù)據(jù),保存到data中。
//準(zhǔn)備需要用到的變量:搜索請(qǐng)求、存放最終響應(yīng)數(shù)據(jù)的Map、搜索源構(gòu)造器、
// 高亮構(gòu)造器、搜索結(jié)果、存放搜索結(jié)果的List。
SearchRequest request = new SearchRequest("item");
Map searchResultMap = new HashMap<>();
SearchSourceBuilder builder = new SearchSourceBuilder();
HighlightBuilder highlightBuilder = new HighlightBuilder();
SearchResponse searchResponse = null;
List list = new ArrayList<>();
//添加搜索條件:關(guān)鍵字模糊查詢(xún)、分頁(yè)、高亮
if(kw != null && !"".equals(kw)){
//★★注意這里是matchQuery,不是fuzzyQuery,模糊搜索有空再學(xué)★★
builder.query(QueryBuilders.matchQuery("title", kw).maxExpansions(1));
}
builder.from((page - 1) * limit);
builder.size(limit);
highlightBuilder.preTags("<em style='color: red'>");
highlightBuilder.postTags("</em>");
highlightBuilder.field("title");
builder.highlighter(highlightBuilder);
//設(shè)置查詢(xún)條件,查詢(xún)
request.source(builder);
try {
searchResponse = highLevelClient.search(request, RequestOptions.DEFAULT);
long hitsTotalValue = searchResponse.getHits().getTotalHits().value;//總條數(shù)
// System.out.println("hitsTotalValue: " + hitsTotalValue);//ft
searchResultMap.put("total", hitsTotalValue);
//頁(yè)數(shù)(ceil后結(jié)果類(lèi)型是double)
searchResultMap.put("pages", (long) Math.ceil(hitsTotalValue * 1.0 / limit));
searchResultMap.put("currPage", page);
//用高亮數(shù)據(jù)替換原數(shù)據(jù)
SearchHits hits = searchResponse.getHits();
for(SearchHit hit: hits){
//數(shù)據(jù),不包含高亮數(shù)據(jù)
Map<String, Object> sourceMap = hit.getSourceAsMap();
//單獨(dú)取出高亮數(shù)據(jù)
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
HighlightField highlightTitle = highlightFields.get("title");//注意是數(shù)組
if(highlightTitle != null){
Text[] fragments = highlightTitle.getFragments();
if(fragments != null && fragments.length > 0){
//替換(fargment[0]是Text類(lèi)型的)
sourceMap.replace("title", fragments[0].toString());
}
}
list.add(sourceMap);//循環(huán)將數(shù)據(jù)添加入列表
}
} catch (Exception e) {
e.printStackTrace();
}
searchResultMap.put("data", list);//設(shè)置最終結(jié)果數(shù)據(jù)域
return Resp.ok("搜索成功", searchResultMap);
}
小結(jié):
1、添加ES場(chǎng)景啟動(dòng)器
<!-- 添加ES的場(chǎng)景啟動(dòng)器的依賴(lài) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2、yaml配置ES
spring:
application:
name: buy-search
elasticsearch:
rest:
uris:
- 192.168.66.132:9200
3、準(zhǔn)備需要用到的變量
注:還有一個(gè)注入的RestHighLevelClient
結(jié)構(gòu)如下:
具體調(diào)用的方法以及設(shè)置頁(yè)碼等參看代碼。
加斷點(diǎn)查看對(duì)應(yīng)searchResponse數(shù)據(jù)結(jié)構(gòu):
HighlightFields的數(shù)據(jù)結(jié)構(gòu):
對(duì)照kinaba結(jié)果:
3、根據(jù)結(jié)構(gòu)圖,完成相關(guān)構(gòu)造器的配置,調(diào)用對(duì)應(yīng)方法,完成查詢(xún),處理結(jié)果,響應(yīng)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-508337.html
最終響應(yīng)結(jié)果:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-508337.html
到了這里,關(guān)于【Elasticsearch】SpringBoot整合ES實(shí)現(xiàn)搜索功能 | 高亮顯示的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!