HighlightBuilder高亮显示

ES上存在如下数据



如果想查询interest中含有basketball的文档,并对basketball进行高亮,ES查询语句如下

GET my_index/my_type/_search
{
  "query": {
    "match": {
      "interest": "basketball"
    }
  }, 
  "highlight":{
    "fields": {
      "interest": {}
    }
  },
  "size": 10
}
从搜索结果中可以看出basketball前后加上了<em></em>,对basketball进行了高亮


下面用JAVA代码实现搜索结果的高亮


1.创建带有高亮的搜索方法,实现高亮可以使用HighlightBuilder

public class ElasticsearchUtils {

    private Client client;

    public ElasticsearchUtils(String clusterName, String ipAddress) {
        Settings settings = ImmutableSettings
                .settingsBuilder()
                //设置集群名称 
                .put("cluster.name", clusterName)
                .put("client.transport.ignore_cluster_name", false)
                .put("node.client", true).put("client.transport.sniff", true)
                .build();
        client = new TransportClient(settings)
                .addTransportAddress(new InetSocketTransportAddress(ipAddress,
                        9300));
    }
    /**
     * 执行搜索(带高亮)
     * @param indexname 索引名称
     * @param type 索引类型
     * @param queryBuilder 查询条件
     * @param highligtFiled 高亮字段
     * @return
     */
    public SearchResponse searcherHighlight(String indexName, String typeName,
            QueryBuilder queryBuilder, String highligtFiled) {
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//构造搜索对象
        searchSourceBuilder.query(queryBuilder);//设置查询条件
        //设置高亮
        String preTags = "<strong>";
        String postTags = "</strong>";
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.preTags(preTags);//设置前缀
        highlightBuilder.postTags(postTags);//设置后缀
        highlightBuilder.field(highligtFiled);//设置高亮字段
        searchSourceBuilder.highlight(highlightBuilder);//设置高亮信息

        SearchRequest searchRequest = new SearchRequest(indexName);//创建查询请求对象
        searchRequest.types(typeName);//设置type
        searchRequest.extraSource(searchSourceBuilder);//设置searchSourceBuilder

        SearchResponse searchResponse = client.search(searchRequest)
                .actionGet();//执行查询
        return searchResponse;
    }
}

2.创建测试类

public class HighlightTest {
    public static void main(String[] args) {
        //创建对象,设置集群名称和IP地址
        ElasticsearchUtils es = new ElasticsearchUtils("im_shanmenglu",
                "localhost");
        String indexName = "my_index";//索引名称
        String typeName = "my_type";//类型名称
        String highligtFiled = "interest";//设置高亮的字段,此处查询的是interest中含有basketball的文档,因此高亮字段设为interest
        QueryBuilder queryBuilder = QueryBuilders.matchQuery("interest",
            "basketball");//查询interest中含有basketball的文档
        SearchResponse searchResponse = es.searcherHighlight(indexName,
            typeName, queryBuilder, highligtFiled);
        SearchHits hits = searchResponse.getHits();
        SearchHit[] searchHits = hits.getHits();
        for (SearchHit searchHit : searchHits) {
            Map<String, HighlightField> map = searchHit.getHighlightFields();
            System.out.println(map.toString());
        }
    }
}

searchResponse的结果如下,可以看到highlight中的basketball前后已经加上了设置的前缀和后缀

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 0.19178301,
    "hits" : [ {
      "_index" : "my_index",
      "_type" : "my_type",
      "_id" : "1",
      "_score" : 0.19178301,
      "_source":{ "name": "a",
  "interest": "football basketball"
}
,
      "highlight" : {
        "interest" : [ "football <strong>basketball</strong>" ]
      }
    }, {
      "_index" : "my_index",
      "_type" : "my_type",
      "_id" : "2",
      "_score" : 0.19178301,
      "_source":{ "name": "b",
  "interest": "music basketball"
}
,
      "highlight" : {
        "interest" : [ "music <strong>basketball</strong>" ]
      }
    } ]
  }
}

控制台输出结果如下:

{interest=[interest], fragments[[football <strong>basketball</strong>]]}
{interest=[interest], fragments[[music <strong>basketball</strong>]]}


  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RestHighLevelClient 是一个用于与 Elasticsearch 进行交互的 Java 客户端,在其中可以实现高亮显示功能。具体实现步骤如下: 1. 首先,使用 RestHighLevelClient 对象创建一个 SearchRequest 对象来设置搜索请求的参数。 2. 调用 SearchRequest.source() 方法来设置搜索的源。源包括查询条件、过滤条件、排序等。 3. 在源中使用 HighlightBuilder 对象来设置高亮显示的参数,比如需要高亮显示的字段、高亮的前缀和后缀等。 4. 调用 RestHighLevelClient.search() 方法来执行搜索请求,并获取搜索结果。 5. 从搜索结果中提取出高亮的内容。 在这个过程中,可以使用 QueryBuilders 工具类来构建查询条件,同时也可以使用其他相关的工具类和方法来进行更复杂的操作。 总结一下,使用 RestHighLevelClient 可以通过设置搜索请求的源和高亮显示参数来实现高亮显示功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [57、ElasticSearch RestHighLevelClient 排序、分页、高亮](https://blog.csdn.net/weixin_40968009/article/details/128002104)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [易语言高亮显示模块](https://download.csdn.net/download/weixin_38691220/12717223)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值