Elasticsearch查询结果高亮操作实战

高亮显示

什么是高亮显示?

在进行关键字搜索时,搜索出的内容中的关键字会显示不同的颜色,称之为高亮

百度搜索关键字"狂飙",如下所示:
在这里插入图片描述
或者在淘宝搜索“手机”,如下所示:
在这里插入图片描述

我们可以发现搜索的关键字在搜索到的信息上都变成了红色高亮

高亮显示原理

通过开发者工具查看高亮数据的html代码实现:
在这里插入图片描述

ElasticSearch可以对查询出的内容中关键字部分进行标签和样式的设置,但是你需要告诉ElasticSearch使用什么标签对高亮关键字进行包裹

代码实现

这里要用到ElasticSearch的高亮数据对象HighlightBuilder

  • 构建一个HighlightBuilder对象
  • 设置高亮字段(title)
  • 使用preTags设置高亮前缀(<font color=’red’>),postTags设置高亮后缀(</font>
  • 将高亮添加到searchRequestBuilder
// 设置高亮数据
HighlightBuilder hiBuilder=new HighlightBuilder();
hiBuilder.field("title");
hiBuilder.preTags("<font style='color:red'>");
hiBuilder.postTags("</font>");
searchRequestBuilder.highlighter(hiBuilder);

完整测试代码如下:

@Test
//高亮查询
public void test11() throws Exception{
    
    
    // 创建Client连接对象
    Settings settings = Settings.builder().put("cluster.name", "my‐elasticsearch").build();
    TransportClient client = new PreBuiltTransportClient(settings)
            .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),
                    9300));
    // 搜索数据
    SearchRequestBuilder searchRequestBuilder = client
            .prepareSearch("blog").setTypes("article")
            .setQuery(QueryBuilders.termQuery("title", "要高亮的关键词"));
    //设置高亮数据
    HighlightBuilder hiBuilder=new HighlightBuilder();
    hiBuilder.preTags("<font style='color:red'>");
    hiBuilder.postTags("</font>");
    hiBuilder.field("title");
    searchRequestBuilder.highlighter(hiBuilder);
    //获得查询结果数据
    SearchResponse searchResponse = searchRequestBuilder.get();
    //获取查询结果集
    SearchHits searchHits = searchResponse.getHits();
    System.out.println("共搜到:"+searchHits.getTotalHits()+"条结果!");
    //遍历结果
    for(SearchHit hit:searchHits){
    
    
        System.out.println("String方式打印文档搜索内容:");
        System.out.println(hit.getSourceAsString());
        System.out.println("Map方式打印高亮内容");
        System.out.println(hit.getHighlightFields());
        System.out.println("遍历高亮集合,打印高亮片段:");
        Text[] text = hit.getHighlightFields().get("title").getFragments();
        for (Text str : text) {
    
    
            System.out.println(str);
        }
    }
    //释放资源
    client.close();
}

猜你喜欢

转载自blog.csdn.net/weixin_45525272/article/details/128762405