ElasticsearchTemplate 搜索分页 并高亮显示搜索条件

@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("")
				 .postTags("")
				 .fragmentSize(100);
		searchQuery.withHighlightFields(hfield);
	}
	
	/**
	 * 根据搜索结果创建esdoc对象
	 * @param smap
	 * @param hmap
	 * @return
	 */
	private EsDoc createEsDoc(Map smap,Map 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 getPage(EsDoc doc, HttpServletRequest request, HttpServletResponse response){
		
		Page esdocpage = new Page(request, response);
		NativeSearchQueryBuilder searchQuery = new NativeSearchQueryBuilder();
		//设置索引
		searchQuery.withIndices(index);
		//设置分页
		searchQuery.withPageable(new PageRequest(esdocpage.getPageNo() - 1, esdocpage.getPageSize()));
		//设置高亮
		withHighlight(searchQuery);
		//设置查询条件
		withQuery(doc,searchQuery);
		
		//自定义查询结果封装
		AggregatedPage page = elasticsearchTemplate.queryForPage(searchQuery.build(), EsDoc.class,
				new SearchResultMapper() {

					@Override
					public  AggregatedPage mapResults(SearchResponse response, Class clazz,
							Pageable pageable) {
						// TODO Auto-generated method stub
						List chunk = new ArrayList();

						for (SearchHit searchHit : response.getHits().getHits()) {
							Map smap = searchHit.getSource();
							Map hmap = searchHit.getHighlightFields();
							chunk.add((T)createEsDoc(smap,hmap));
						}
						
						AggregatedPage result=new AggregatedPageImpl(chunk,pageable,response.getHits().getTotalHits());
						
						return result;
					}
				});

		esdocpage.setList(page.getContent());
		esdocpage.setCount(page.getTotalElements());
		
		return esdocpage;
	}

 

你可能感兴趣的:(java,elasticsearch)