ElasticSearch 高亮查询-脚本

ElasticSearch 高亮查询-脚本

高亮三要素:需要高亮显示的字段,前缀,后缀;

默认前后缀 :em

<em>手机</em>
GET goods/_search
{
  "query": {
    "match": {
      "title": "电视"
    }
  },
  "highlight": {
    "fields": {
      "title": {
        "pre_tags": "<font color='red'>",
        "post_tags": "</font>" }}}}
 /* :高亮查询 : 就是将被用户搜索多的信息标题等,换颜色等来区分
  *  1.设置高亮
  *  要设置  需要高亮显示的字段,前缀,后缀
     2. 将高亮的数据,替换原有的数据  */
    @Test
    public void testHighLightQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest("goods");

        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

//        1.查询title标题包含手机的数据
        MatchQueryBuilder query = QueryBuilders.matchQuery("titls", "手机");
        sourceBuilder.query(query);


        // 设置高亮对象
        HighlightBuilder highlighter = new HighlightBuilder();
        // 设置高亮三要素
        /* 不设置前后缀 系统用默认的前后缀<em></em>*/
        highlighter.field("title");   //设置高亮的字段
        highlighter.preTags("<font color='red'>");        // 设置高亮前缀
        highlighter.postTags("</font>");       // 设置高粱后缀

        sourceBuilder.highlighter(highlighter);


//        2. 查询品牌列表
        /* 参数 "goods_brands" 自定义的名称,将来用于获取数据用的
         * 参数  "brandName"  分组的字段
         * size(100) 的意思是设置查询100条数据
         * 这个带有自动分页显示的功能*/
        AggregationBuilder agg = AggregationBuilders.terms("goods_brands").field("brandName").size(100);
        sourceBuilder.aggregation(agg);

        searchRequest.source(sourceBuilder);

        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        SearchHits searchHits = searchResponse.getHits();
        // 获取记录数
        long value = searchHits.getTotalHits().value;
        System.out.println("总记录数:"+value);

        List<Goods> goodsList = new ArrayList<>();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String sourceAsString = hit.getSourceAsString();
            // 转为Java
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);

            // 获取高亮结果,在这里 替换goods中的title
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            HighlightField HighlightField = highlightFields.get("title");
            Text[] fragments = HighlightField.fragments();
            // 替换
            goods.setTitle(fragments[0].toString());

            goodsList.add(goods);
        }


        for (Goods goods : goodsList) {
            System.out.println(goods);
        }
        // 获取聚合结果
        Aggregations aggregations = searchResponse.getAggregations();
        Terms goods_brands = (Terms) aggregations.get("goods_brands");
        List<? extends Terms.Bucket> buckets = goods_brands.getBuckets();

        List brands = new ArrayList();
        for (Terms.Bucket bucket : buckets) {
            Object key = bucket.getKey();
            brands.add(key);
        }

        for (Object brand : brands) {
            System.out.println(brand);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

普希托夫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值