基于springboot datda 代码如下,可直接使用
@Resource
private ElasticsearchOperations elasticsearchOperations;
@GetMapping("getHighByContent")
public List<Job> getHighByContent(String keyword) {
if(StringUtils.isBlank(keyword)){
return new ArrayList<>();
}
//根据一个值查询多个字段 并高亮显示 这里的查询是取并集,即多个字段只需要有一个keyword满足即可
//需要查询的字段
/**
* must
* 所有的语句都 必须(must) 匹配,与 AND 等价。
* must_not
* 所有的语句都 不能(must not) 匹配,与 NOT 等价。
* should
* 至少有一个语句要匹配,与 OR 等价
*/
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
.should(QueryBuilders.matchQuery("content", keyword))
.should(QueryBuilders.matchQuery("name", keyword));
//构建高亮查询
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(boolQueryBuilder)
.withHighlightFields(
new HighlightBuilder.Field("content")
, new HighlightBuilder.Field("name"))
.withHighlightBuilder(new HighlightBuilder().preTags("<span style='color:red'>").postTags("</span>"))
//分页数据
.withPageable(PageRequest.of(0, 10))
.build();
//查询
SearchHits<Job> search = elasticsearchOperations.search(searchQuery, Job.class);
//得到查询返回的内容
List<SearchHit<Job>> searchHits = search.getSearchHits();
//设置一个最后需要返回的实体类集合
List<Job> jobs = new ArrayList<>();
//遍历返回的内容进行处理
for (SearchHit<Job> searchHit : searchHits) {
//高亮的内容
Map<String, List<String>> highlightFields = searchHit.getHighlightFields();
//将高亮的内容填充到content中
searchHit.getContent().setName(highlightFields.get("name") == null ? searchHit.getContent().getName() : highlightFields.get("name").get(0));
searchHit.getContent().setContent(highlightFields.get("content") == null ? searchHit.getContent().getContent() : highlightFields.get("content").get(0));
//放到实体类中
jobs.add(searchHit.getContent());
}
return jobs;
}