c798281869c4

高亮查询是搜索引擎中最基础的也是最重要的一个功能,站内搜索、电商等都可以通过高亮查询来提升用户体验。在ElasticSearch中高亮查询(highlight)是与query平级的查询

基础语法如下

GET /_index/_search

{

"query": {

"match": {

"address": "循化县"

}

},

"highlight" : {

"fields": {

"_FIELD":{

"type": "unified"

}

},

"pre_tags": [""],

"post_tags": [""]

}

}

示例

在索引库check_station_index中address字段被定义为text类型,也就是说可以分词

"address" : {

"type" : "text",

"fields" : {

"keyword" : {

"type" : "keyword",

"ignore_above" : 256

}

}

}

高亮查询

GET /check_station_index/_search

{

"query": {

"match": {

"address": "循化县"

}

},

"highlight": {

"fields": {

"address":{

"type": "unified"

}

},

"pre_tags": [""],

"post_tags": [""]

}

}

查询结果

{

"_index" : "check_station_index",

"_type" : "_doc",

"_id" : "1279939719420968994",

"_score" : 8.563546,

"_source" : {

"id" : "1279939719420968994",

"waterDepartment" : "黄河干流",

"riverName" : "黄河",

"num" : "40100550",

"name" : "循化(二)",

"stationType" : "水文",

"address" : "青海省循化县积石镇",

"longitude" : "102°30′",

"latitude" : "35°50′",

"buildDate" : "1945.10",

"waterNet" : "黄河流域"

},

"highlight" : {

"address" : [

"青海省积石镇"

]

}

}

可以看到结果hits中highlight字段中返回了对应的高亮字段结果,并添加了指定的前缀和后缀,这里定义了红色字体样式,这样在前端展示的时候可以自动呈现为红色的

通过Java HighLevel Api进行查询

在Service中编写address高亮查询

@Override

public List> highlighted(String address) throws IOException {

//定义索引库

SearchRequest searchRequest = new SearchRequest("check_station_index");

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

//定义query查询

QueryBuilder queryBuilder = QueryBuilders.matchQuery("address", address);

//定义高亮查询

HighlightBuilder highlightBuilder = new HighlightBuilder();

//设置需要高亮的字段

highlightBuilder.field("address")

// 设置前缀、后缀

.preTags("")

.postTags("");

searchSourceBuilder.query(queryBuilder);

searchSourceBuilder.highlighter(highlightBuilder);

searchRequest.source(searchSourceBuilder);

SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

List> list = Lists.newArrayList();

//遍历高亮结果

for (SearchHit hit : searchResponse.getHits().getHits()) {

Map highlightFields = hit.getHighlightFields();

HighlightField nameHighlight = highlightFields.get("address");

Map sourceAsMap = hit.getSourceAsMap();

if (nameHighlight != null) {

Text[] fragments = nameHighlight.getFragments();

String _address = "";

for (Text text : fragments) {

_address += text;

}

sourceAsMap.put("address", _address);

list.add(sourceAsMap);

}

}

return list;

}[图片上传中...(thumb.jpg-eeb740-1595602689859-0)]

编写测试类

/**

* @author haopeng

* @date 2020-07-24 22:09

*/

@SpringBootTest

@RunWith(SpringRunner.class)

public class HighLightTest {

@Autowired

private WeatherEsService weatherEsService;

@Test

public void highlight() throws IOException {

List> highlighted = weatherEsService.highlighted("循化县");

highlighted.forEach(System.out::println);

}

}

运行结果

{address=青海省积石镇, stationType=水文, num=40100550, latitude=35°50′, name=循化(二), waterNet=黄河流域, id=1279939719420968994, buildDate=1945.10, waterDepartment=黄河干流, riverName=黄河, longitude=102°30′}

{address=青海省梁什滩, stationType=水文, num=40203200, latitude=35°48′, name=文都(三), waterNet=黄河流域, id=1279939720733786132, buildDate=1960.04, waterDepartment=黄河上游区上段, riverName=街子河, longitude=102°24′}

{address=青海省道帏乡古雷村, stationType=雨量, num=40228300, latitude=35°39′, name=道帏, waterNet=黄河流域, id=1279939719420968981, buildDate=1985.01, waterDepartment=黄河上游区上段, riverName=清水, longitude=102°39′}

c798281869c4

c798281869c4

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐