SpringBoot整合ES7.6實現高亮
阿新 • • 發佈:2020-12-14
技術標籤:Spring
最近跟牛客寫java,整個ES時發現找不到SearchResultMapper,後在網上找到解決方法,記錄下來。
文章目錄
修改配置
在配置類那個包下中增加EsConfig這個類
package cn.edu.njtech.community.config;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org. springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.client.RestClients;
@Configuration
public class EsConfig{
//localhost:9200 寫在配置檔案中就可以了
@Value("${elasticSearch.url}")
private String esUrl;
@Bean
RestHighLevelClient client() {
ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo(esUrl)//elasticsearch地址
.build();
return RestClients. create(clientConfiguration).rest();
}
}
測試程式碼
@Test
public void testSearchByTemplate(){
NativeSearchQuery query = new NativeSearchQueryBuilder().
withQuery(QueryBuilders.multiMatchQuery("網際網路寒冬","title","content"))
.withSort(SortBuilders.fieldSort("type").order(SortOrder.DESC))
.withSort(SortBuilders.fieldSort("score").order(SortOrder.DESC))
.withSort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC))
.withPageable(PageRequest.of(0,10))
.withHighlightFields(
new HighlightBuilder.Field("title").preTags("<em>").postTags("</em>"),
new HighlightBuilder.Field("content").preTags("<em>").postTags("</em>")
).build();
SearchHits<DiscussPost> search = elasticsearchRestTemplate.search(query,DiscussPost.class);
// 得到查詢結構返回的內容
List<SearchHit<DiscussPost>> searchHits = search.getSearchHits();
// 設定一個需要返回的實體類集合
List<DiscussPost> discussPosts = new ArrayList<>();
for(SearchHit<DiscussPost> searchHit:searchHits){
Map<String,List<String>> highLightFields = searchHit.getHighlightFields();
// 將高亮內容填充到content中
searchHit.getContent().setTitle(highLightFields.get("title") == null ? searchHit.getContent().getTitle() : highLightFields.get("title").get(0));
searchHit.getContent().setContent(highLightFields.get("content") == null ? searchHit.getContent().getContent() : highLightFields.get("content").get(0));
// 放到實體類中
discussPosts.add(searchHit.getContent());
}
System.out.println(discussPosts.size());
for(DiscussPost discussPost:discussPosts){
System.out.println(discussPost);
}
}