SpringDataElasticsearch没有处理高亮的方法,需要自己定义
引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
先定义一个处理结果集的实现类
package com.zzk.mapper;
import com.google.gson.Gson;
import org.apache.commons.beanutils.BeanUtils;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.SearchResultMapper;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @创建人
* @创建时间 2019/8/20
* @描述 处理结果集
*/
public class SearchResultMapperImpl<T> implements SearchResultMapper {
Gson gson=new Gson();
@Override
public <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) {
List<T> content=new ArrayList<>();
SearchHit[] hits = searchResponse.getHits().getHits();
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
T t = gson.fromJson(sourceAsString, aClass);
/*高亮*/
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
HighlightField highlightField = highlightFields.get("title");
Text[] fragments = highlightField.getFragments();
if (fragments!=null&&fragments.length>0){
String hight_title = fragments[0].toString();
try {
BeanUtils.setProperty(t,"title",hight_title);
} catch (Exception e) {
e.printStackTrace();
}
}
content.add(t);
}
long totalHits = searchResponse.getHits().getTotalHits();
Aggregations aggregations = searchResponse.getAggregations();
String scrollId = searchResponse.getScrollId();
float maxScore = searchResponse.getHits().getMaxScore();
return new AggregatedPageImpl<T>(content,pageable,totalHits,aggregations,scrollId,maxScore);
}
}
在SDE添加结合原生方法查询
/*高亮*/
@Test
public void nativeQuery(){
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withQuery(QueryBuilders.termQuery("title","小米"));
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<span style='color:red'>");
highlightBuilder.postTags("</span>");
// highlightBuilder.field("title");
nativeSearchQueryBuilder.withHighlightBuilder(highlightBuilder);
nativeSearchQueryBuilder.withHighlightFields(new HighlightBuilder.Field("title"));
AggregatedPage<Goods> aggregatedPage=esTemplate.queryForPage(nativeSearchQueryBuilder.build(),Goods.class,
new SearchResultMapperImpl<Goods>());
List<Goods> goodsList = aggregatedPage.getContent();
for (Goods goods : goodsList) {
System.out.println(goods);
}
}