elasticsearch高亮查询
package com.jmyp.test;
import com.jmyp.SearchApplication;
import com.jmyp.dao.RepositoryDao;
import com.jmyp.pojo.Item;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
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 org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 高亮查询
*/
@Test
public void findByHeighLight(){
//创建查询构造器
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
//查询关键字
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("title", "手机"))
.filter(QueryBuilders.termQuery("brand", "华为"))
.filter(QueryBuilders.rangeQuery("price").from(10).to(50));
//条件搜索
//分类
// queryBuilder.withFilter(QueryBuilders.matchQuery("category","手机"));
// //品牌
// queryBuilder.withFilter(QueryBuilders.matchQuery("brand","华为"));
//
// //价格区间过滤
// queryBuilder.withFilter(QueryBuilders.rangeQuery("price").from(10).to(50));
// //排序
// queryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.ASC));
queryBuilder.withQuery(boolQueryBuilder);
//分页查询
queryBuilder.withPageable(PageRequest.of(0,5));
//设置高亮
queryBuilder.withHighlightFields(new HighlightBuilder.Field("title").preTags("<font color='red'>").postTags("</font>"));
//使用es查询
esTemplate.queryForPage(queryBuilder.build(), Item.class, new SearchResultMapper() {
@Override
public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> aClass, Pageable pageable) {
//从response中获取结果
SearchHits hits = response.getHits();
//定义一个集合
List<Item> itemList = new ArrayList<>();
//获取命中文本结果
//循环命中集合
for (SearchHit hit : hits) {
//获取结果数据
Map<String, Object> result = hit.getSource();
//创建商品对象
Item item = new Item();
//获取id
Integer id = (Integer)result.get("id");
//判断id是否为空
if(id!=null){
//设置id
item.setId((long)id);
}
//获取title
HighlightField title = hit.getHighlightFields().get("title");
//判断title不为空
if(title!=null){
//获取高亮值
String title2 = title.getFragments()[0].toString();
System.out.println("高亮字段:"+title2);
item.setTitle(title2);
}
//将查询结果放入集合
itemList.add(item);
}
//返回
if(itemList!=null && itemList.size()>0){
return new AggregatedPageImpl(itemList);
}
//否则返回null
return null;
}
});
}