最近做了一個爬蟲項目,需要把數據存入ES中,在網上找資料的過程中挺辛苦的,大部分文章上來就是貼代碼,沒有講springboot和es之間版本關系,而本身ES更新真的是快,坑是真的多(自我學習能力不強,見諒),很多方法在新版本中都被棄用,最后冷靜下來,也算是終於解決了各種問題吧。
博客園...
`
@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;
// 高亮、分頁、條件查詢 從es查詢
public PageInfo resultSearch(int pageNum, int pageSize, String query, String relationSiteNames) {
log.info(query);
log.info(relationSiteNames);
// (a or b) and c 條件查詢
BoolQueryBuilder filterBuilder = QueryBuilders.boolQuery();
BoolQueryBuilder filterCaseBuilder = QueryBuilders.boolQuery();
filterCaseBuilder.should(QueryBuilders.matchQuery("title", query));
filterCaseBuilder.should(QueryBuilders.matchQuery("content", query));
BoolQueryBuilder filterPhoneBuilder = QueryBuilders.boolQuery();
if (StrUtil.isNotBlank(relationSiteNames)) {
// 模糊匹配
MatchPhraseQueryBuilder relationSiteNames1 = QueryBuilders.matchPhraseQuery("relationSiteNames", relationSiteNames);
filterPhoneBuilder.must(relationSiteNames1);
}
filterBuilder.must(filterCaseBuilder).must(filterPhoneBuilder);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(filterBuilder);
// 高亮顯示
HighlightBuilder.Field message = new HighlightBuilder.Field("title").preTags("<span style=\"color:red\">").postTags("</span>");
// 分頁查詢
pageNum = pageNum - 1;
Pageable of = PageRequest.of(pageNum, pageSize);
// 構建查詢條件
NativeSearchQuery query2 = new NativeSearchQueryBuilder()
.withQuery(boolQueryBuilder)
.withHighlightFields(message)
.withPageable(of)
.build();
// 分頁查詢
AggregatedPage<LawRegulationResultEs> lawRegulationResultEs = elasticsearchRestTemplate
.queryForPage(query2, LawRegulationResultEs.class, new HighlightResultMapper());
List<LawRegulationResultEs> resultEsList = lawRegulationResultEs.getContent();
resultEsList.stream().forEach(e -> e.setContent(""));
PageInfo pageHelper = new PageInfo();
pageHelper.setList(resultEsList);
pageHelper.setPages(lawRegulationResultEs.getTotalPages());
pageHelper.setTotal(lawRegulationResultEs.getTotalElements());
return pageHelper;
}
`
public class HighlightResultMapper extends DefaultResultMapper {
@Override
public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {
for (SearchHit hit : response.getHits()) {
Map<String, Object> sourceMap = hit.getSourceAsMap();
for (Map.Entry<String, HighlightField> entry : hit.getHighlightFields().entrySet()) {
String key = entry.getKey();
if (sourceMap.containsKey(key)) {
Text[] fragments = entry.getValue().getFragments();
sourceMap.put(key, transTextArrayToString(fragments));
}
}
hit.sourceRef(new ByteBufferReference(ByteBuffer.wrap(JSONObject.toJSONString(sourceMap).getBytes())));
}
return super.mapResults(response, clazz, pageable);
}
private String transTextArrayToString(Text[] fragments) {
if (null == fragments) {
return "";
}
StringBuffer buffer = new StringBuffer();
for (Text fragment : fragments) {
buffer.append(fragment.string());
}
return buffer.toString();
}