由于搜索多個索引沒辦法以定義好的Entity來接收quey的結(jié)果,所以keyword搜索時不能按照以前的方式來直接分頁搜索文章來源:http://www.zghlxwxcb.cn/news/detail-514119.html
AggregatedPage<ElasticService> elasticServices = elasticsearchTemplate.queryForPage(nativeSearchQuery, ElasticService.class);
所以這里選擇重寫搜索方法來自定義map返回結(jié)果,實(shí)現(xiàn)手動分頁和替換高亮搜索的結(jié)果文章來源地址http://www.zghlxwxcb.cn/news/detail-514119.html
Pageable pageable = PageRequest.of(pageNum, pageSize, Sort.Direction.DESC, "update_time");
// 關(guān)鍵字可在name字段進(jìn)行通配符搜索
QueryBuilder nameWildcardNameQuery = QueryBuilders.wildcardQuery("name", "*" + keywords + "*");
QueryBuilder categoryNameWildcardNameQuery = QueryBuilders.wildcardQuery("categoryName", "*" + keywords + "*");
// name字段boost提高,從而match之后提高得分
Map<String, Float> fieldMap = new HashMap<>();
fieldMap.put("name", 5.0f);
fieldMap.put("categoryName", 4.5f);
fieldMap.put("namespace", 1.0f);
fieldMap.put("description", 0.5f);
QueryBuilder multiMatchQuery = QueryBuilders.multiMatchQuery(keywords).fields(fieldMap);
// should不會影響搜索結(jié)果,但match多了可提高得分
QueryBuilder keywordMatchQuery = QueryBuilders.boolQuery().should(nameWildcardNameQuery).should(categoryNameWildcardNameQuery).should(multiMatchQuery);
//設(shè)置高亮條件
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.requireFieldMatch(false); // 如果要多個字段高亮,這項要為false
highlightBuilder.preTags("<span style=\"color:#2ba6ee\">"); // 高亮設(shè)置
highlightBuilder.postTags("</span>");
highlightBuilder.field("name");
highlightBuilder.field("description");
highlightBuilder.field("category_name");
NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
.withIndices("template_graph_contact", "tradition_ml_template_group")
.withQuery(
QueryBuilders.boolQuery()
.must(keywordMatchQuery)
)
.withHighlightBuilder(highlightBuilder)
.withPageable(pageable)
.build();
//查詢后自己構(gòu)造返回結(jié)果,手動分頁
Map search = elasticsearchTemplate.query(nativeSearchQuery, response -> {
SearchHits hits = response.getHits();
Map map = new HashMap();
//手動分頁
double totalPage = Math.ceil(hits.totalHits / (double)pageSize);
map.put("totalElements", hits.totalHits);
map.put("totalPages", Double.valueOf(totalPage).intValue());
map.put("pageNumber", pageNum);
map.put("pageSize", pageSize);
List<Map> list = new ArrayList<>();
for (SearchHit hit : hits) {
if (hits.getHits().length <= 0) {
return null;
}
Map<String, Object> source = hit.getSourceAsMap();
//將高亮部分進(jìn)行替換
HighlightField name = hit.getHighlightFields().get("name");
HighlightField description = hit.getHighlightFields().get("description");
HighlightField categoryName = hit.getHighlightFields().get("category_name");
if (name != null) {
source.replace("name", name.fragments()[0].toString());
}
if (description != null) {
source.replace("description", description.fragments()[0].toString());
}
if (categoryName != null) {
source.replace("category_name", categoryName.fragments()[0].toString());
}
list.add(source);
}
map.put("source", list);
return map;
});
到了這里,關(guān)于elasticsearch使用template搜索多個索引并且高亮返回結(jié)果的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!