之前一值用单字段高亮,今天研究了一下RestHighLevelClient的高亮API
构建一个HighLightBuilder对象,这个对象有一个field方法,通过多次调用这个方法传入要高亮的字段就可以根据指定的前后缀进行高亮。
这个field又调用了this.field方法
再继续调用
发现最后是存放了一个List集合中。
但前后缀就不是了
前后缀只有一种高亮规则,并不是一个数组。
- 查看高亮结果和文档值
- 完整代码
/**
* highlight
*/
@Test
public void testhighlight02() throws IOException {
SearchRequest searchRequest = new SearchRequest(indexName);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.matchQuery("name","游戏"));
boolQueryBuilder.must(QueryBuilders.matchQuery("address","购物"));
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.field("name").field("address")
.preTags("<span style='color: red'>").postTags("</span>");
searchSourceBuilder.query(boolQueryBuilder);
searchSourceBuilder.highlighter(highlightBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse search = client.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);
for (SearchHit documentFields : search.getHits().getHits()) {
//获取本条文档的高亮字段
Map<String, HighlightField> highlightFields = documentFields.getHighlightFields();
HighlightField name = highlightFields.get("name");
HighlightField address = highlightFields.get("address");
//获取原始的source数据
Map<String, Object> sourceAsMap = documentFields.getSourceAsMap();
String newName = "";
String newAddress = "";
Text[] namefragments = name.getFragments();
Text[] addressFragments = address.getFragments();
if (namefragments != null){
for (Text namefragment : namefragments) {
newName = newName + namefragment.string();
}
}
if (addressFragments != null){
for (Text addressFragment : addressFragments) {
newAddress = newAddress + addressFragment.string();
}
}
if (!"".equals(newName)){
//覆盖原始数据的name字段的值
sourceAsMap.put("name",newName);
}
if (!"".equals(newAddress)){
sourceAsMap.put("address",newAddress);
}
System.out.println(JSON.toJSONString(sourceAsMap));
}
}
- 控制台输出
- 复制选中的数据,以html文件打开
多字段高亮搞定