1.什么是高亮查询?ES如何实现高亮查询?
高亮查询就是把查询到的关键词以显著的颜色标识出来,在百度,京东上很多地方都可以看到;
ES有默认的高亮查询插件;非常的方便;
高亮查询就是你用户输入的关键字,以一定的特殊样式展示给用户,让用户知道为什么这个结果被检索出来。高亮展示的数据,本身就是文档中的一个Field,单独将Field以highlight的形式返回给你。
ES提供了一个highlight属性,和query同级别的。
fragment_size:指定高亮数据展示多少个字符回来。
pre_tags:指定前缀标签,举个栗子< font color="red" >
post_tags:指定后缀标签,举个栗子< /font >
fields:指定哪几个(字段)Field以高亮形式返回
既然ES很支持高亮显示,那么他是如何进行实现的呢?其实也非常简单,他就是让你在拿到搜索结果的时候在,搜索结果里面放入Html的颜色标签,这样,你就可以,在web页面上看到高亮显示了;
至于怎么放颜色标签,就通过前缀pre_tags:
前缀标签;post_tags:
后缀标签;
POST /book/novel/_search
{
"query": {
"match": {
"desc": "好书"
}
},
"highlight": {
"fields": {
"desc": {}
},
"pre_tags": "<font color = 'red'>",
"post_tags": "</font>",
"number_of_fragments": 5
}
}
解释:这是对desc字段进行匹配查询”好书”这个关键字;highlight:{}
里面来设置高亮的词语;fields:{}
用来设置需要进行高亮的字段;
查询结果,他会显示两个结果;一个是正常的结果,然后你要显示高亮的部分他会他别给你展示出来;
{
"_index" : "book",
"_type" : "novel",
"_id" : "1001",
"_score" : 0.26706278,
"_source" : {
"id" : 1001,
"name" : "金瓶梅",
"author" : "任凯",
"count" : 100,
"price" : 200,
"pubdate" : "2020-11-26 09:18:19",
"desc" : "人生好书"
},
"highlight" : {
"desc" : [
"人生<font color = 'red'>好</font><font color = 'red'>书</font>"
]
}
}
2.Java如何实现高亮显示?
@Test //高亮显示
public void test23() throws IOException {
//1. SearchRequest
SearchRequest request = new SearchRequest(indextName);
request.types(typeName);
//2. 指定查询条件(高亮)
SearchSourceBuilder builder = new SearchSourceBuilder();
//2.1 指定查询条件
builder.query(QueryBuilders.matchQuery("desc", "好书"));
//2.2 指定高亮
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.field("desc", 5)//传入要高亮哪一个字段,并且高亮几个字
.preTags("<font color='red'>") //传入前缀
.postTags("</font>");//传入后缀
builder.highlighter(highlightBuilder);
request.source(builder);
//3. 执行查询
SearchResponse resp = ClientUtils.client().search(request, RequestOptions.DEFAULT);
//4. 获取高亮数据,输出
for (SearchHit hit : resp.getHits().getHits()) { //因为高亮数据是在碰撞数据里面的,所以要两个getHits()
//获取普通数据是无法获取到高亮数据的
System.out.println(hit.getHighlightFields().get("desc"));//获取碰撞数据的高亮字段
}
}
。。。。。。。。。。。。。