一、highlight简介
highlight是提升用户体验的重要手段,搜索引擎通过高亮突出命中关键字等方式,方便用户通过关键字周围的信息快速的确认是否是自己希望的结果;
highlight功能通常包含以下三个主要的处理过程
1.将字段文本拆分为小的片段;
2.找出最相关的片段;
3.高亮查询关键字;
二、elasticsearch的highlight功能
elasticsearch提供了专门的高亮请求参数highlight,返回的记过中也会包含对应的高亮信息;
三、完整代码
package cn.babk.hotel;
import cn.bdbk.hotel.pojo.HotelDoc;
import com.alibaba.fastjson.JSON;
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.util.CollectionUtils;
import java.io.IOException;
import java.util.Map;
public class HotelSearchTest {
private RestHighLevelClient client;
@Test
void testHighlight() throws IOException {
//准备request
SearchRequest request = new SearchRequest("hotel");
//准备dsl
request.source().query(QueryBuilders.matchQuery("name", "北京"));
//高亮
request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
//发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//解析响应
handleResponse(response);
}
private void handleResponse(SearchResponse response) {
//解析响应
SearchHits searchHits = response.getHits();
//获取总条数
long total = searchHits.getTotalHits().value;
//获取文档数组
SearchHit[] searchHit = searchHits.getHits();
for (SearchHit hit : searchHit){
//获取文档source
String json = hit.getSourceAsString();
//反序列化
HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
if (!CollectionUtils.isEmpty(highlightFields)){
HighlightField highlightField = highlightFields.get("name");
if (highlightField != null){
String name = highlightField.getFragments()[0].toString();
hotelDoc.setName(name);
}
}
System.out.println(hotelDoc);
}
System.out.println("--" + total);
}
@BeforeEach
void setUP(){
this.client = new RestHighLevelClient(RestClient.builder(
HttpHost.create("http://170.106.116.159:9200")
));
}
@AfterEach
void tearTown() throws IOException {
this.client.close();
}
}