声明:本站文章均为作者个人原创,图片均为实际截图。如有需要请收藏网站,禁止转载,谢谢配合!!!

一、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();
    }

}