ES查询操作之高亮多个字段
2021-12-13 本文已影响0人
rainbowz
请求突出显示
可以通过HighlightBuilder.FieldHighlightBuilder来进行设置
高亮请求的高亮API如下:
![](https://img.haomeiwen.com/i819104/2887d82fb40c93f9.png)
DSL语句
GET /hotel/_search
{
"from": 0,
"size": 3,
"query": {
"multi_match": {
"query": "速8",
"fields": [
"brand^1.0",
"name^1.0"
],
"type": "best_fields",
"operator": "AND",
"slop": 0,
"prefix_length": 0,
"max_expansions": 50,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"fuzzy_transpositions": true,
"boost": 1
}
},
"highlight": {
"pre_tags": [
"<span style=color:green>"
],
"post_tags": [
"</span>"
],
"fields": {
"brand": {},
"name": {}
}
}
}
java代码如下
/**
* index :hotel
*
* @throws IOException
*/
@Test
public void testHighLights() throws IOException {
SearchRequest searchRequest = new SearchRequest("hotel");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
MultiMatchQueryBuilder multiMatchQuery = QueryBuilders
.multiMatchQuery("速8", "brand", "name")
//默认是OR
.operator(Operator.AND);
HighlightBuilder highlightBuilder = new HighlightBuilder();
HighlightBuilder.Field highlightTitle = new HighlightBuilder.Field("brand");
highlightBuilder.field(highlightTitle);
HighlightBuilder.Field highlightFilecontent = new HighlightBuilder.Field("name");
highlightBuilder.field(highlightFilecontent);
highlightBuilder
.preTags("<span style=color:green>")
.postTags("</span>");
searchSourceBuilder.highlighter(highlightBuilder);
searchSourceBuilder.query(multiMatchQuery);
searchSourceBuilder.from((0));
searchSourceBuilder.size(3);
searchRequest.source(searchSourceBuilder);
ArrayList<Map<String, Object>> resultList = new ArrayList<>();
ArrayList<HotelDoc> hotelDocArrayList = new ArrayList<>();
SearchResponse searchResponse = client
.search(searchRequest, RequestOptions.DEFAULT);
log.info("DSL语句为:{}", searchRequest.source().toString());
SearchHits hits = searchResponse.getHits();
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
String source = hit.getSourceAsString();
HotelDoc hotelDoc = JSON.parseObject(source, HotelDoc.class);
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
HighlightField hTitle = highlightFields.get("brand");
if (hTitle != null) {
String hBrandText = "";
Text[] fragments = hTitle.fragments();
for (Text text : fragments) {
hBrandText += text;
}
sourceAsMap.put("brand", hBrandText);
hotelDoc.setBrand(hBrandText);
}
HighlightField hFilecontent = highlightFields.get("name");
if (hFilecontent != null) {
String hNametText = "";
Text[] fragments = hFilecontent.fragments();
for (Text text : fragments) {
hNametText += text;
}
sourceAsMap.put("name", hNametText);
hotelDoc.setName(hNametText);
}
resultList.add(sourceAsMap);
hotelDocArrayList.add(hotelDoc);
}
// resultList.stream().forEach(System.out::println);
hotelDocArrayList.stream().forEach(System.out::println);
}
![](https://img.haomeiwen.com/i819104/495fac237ea09b43.png)
打印高亮结果
![](https://img.haomeiwen.com/i819104/77aab7d26bd36f4b.png)
可以看到我们的高亮已经设置成功。