@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
/**
* 添加搜索条件
* @param doc
* @param searchQuery
*/
private void withQuery(EsDoc doc,NativeSearchQueryBuilder searchQuery){
if (!StringUtils.isEmpty(doc.getContent())) {
BoolQueryBuilder bqb = QueryBuilders.boolQuery();
if (StringUtils.isEmpty(doc.getSearchtype()) || doc.getSearchtype().equals("1"))
bqb.must(QueryBuilders.matchPhraseQuery("content", doc.getContent()));
else if (doc.getSearchtype().equals("2"))
bqb.must(QueryBuilders.matchQuery("content", doc.getContent()));
searchQuery.withQuery(bqb);
}
}
/**
* 添加高亮条件
* @param searchQuery
*/
private void withHighlight(NativeSearchQueryBuilder searchQuery){
Field hfield= new HighlightBuilder.Field("content")
.preTags("<em style='color:red'>")
.postTags("</em>")
.fragmentSize(100);
searchQuery.withHighlightFields(hfield);
}
/**
* 根据搜索结果创建esdoc对象
* @param smap
* @param hmap
* @return
*/
private EsDoc createEsDoc(Map<String, Object> smap,Map<String, HighlightField> hmap){
EsDoc ed = new EsDoc();
if (smap.get("title") != null)
ed.setTitle(smap.get("title").toString());
if (hmap.get("content") != null)
ed.setContent(hmap.get("content").fragments()[0].toString());
else if(smap.get("content")!=null)
ed.setContent(smap.get("content").toString());
if (smap.get("id") != null)
ed.setId(smap.get("id").toString());
return ed;
}
public Page<EsDoc> getPage(EsDoc doc, HttpServletRequest request, HttpServletResponse response){
Page<EsDoc> esdocpage = new Page<EsDoc>(request, response);
NativeSearchQueryBuilder searchQuery = new NativeSearchQueryBuilder();
//设置索引
searchQuery.withIndices(index);
//设置分页
searchQuery.withPageable(new PageRequest(esdocpage.getPageNo() - 1, esdocpage.getPageSize()));
//设置高亮
withHighlight(searchQuery);
//设置查询条件
withQuery(doc,searchQuery);
//自定义查询结果封装
AggregatedPage<EsDoc> page = elasticsearchTemplate.queryForPage(searchQuery.build(), EsDoc.class,
new SearchResultMapper() {
@Override
public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz,
Pageable pageable) {
// TODO Auto-generated method stub
List<T> chunk = new ArrayList<T>();
for (SearchHit searchHit : response.getHits().getHits()) {
Map<String, Object> smap = searchHit.getSource();
Map<String, HighlightField> hmap = searchHit.getHighlightFields();
chunk.add((T)createEsDoc(smap,hmap));
}
AggregatedPage<T> result=new AggregatedPageImpl<T>(chunk,pageable,response.getHits().getTotalHits());
return result;
}
});
esdocpage.setList(page.getContent());
esdocpage.setCount(page.getTotalElements());
return esdocpage;
}