ElasticSearch 5.X 搜索并用高亮显示

public List<WOSearchModel> searchOrder(OrderSearchReqVO request) throws Exception{
        List<WOSearchModel> woSearchModels = new ArrayList<>();

        //设置高亮显示
        HighlightBuilder highlightBuilder = new HighlightBuilder().field("*").requireFieldMatch(false);
        highlightBuilder.preTags(EagleConst.PRE_TAGS);
        highlightBuilder.postTags(EagleConst.POST_TAGS);

        //搜索title和orperator和detail
        //TODO: 搜索项目名称
        QueryStringQueryBuilder queryBuilder = new QueryStringQueryBuilder(request.getKeyWord());
        queryBuilder.analyzer(EagleConst.ES_ANALYSER);
        queryBuilder.field(EagleConst.ORDER_TITLE).field(EagleConst.ORDER_OPERATOR).field(EagleConst.ORDER_DETAIL);

        //搜索
        SearchRequestBuilder searchRequestBuilder = eagleTcpClient.getClient().prepareSearch(EagleConst.INDEX)
                .setFrom(request.getStart())
                .setSize(request.getSize())
                .setTypes(EagleConst.TYPE)
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                //.setQuery(builder)
                .setQuery(queryBuilder)
                .highlighter(highlightBuilder)
                .setExplain(true); //设置是否按查询匹配度排序
        SearchResponse searchResponse = searchRequestBuilder.get();

        //获取搜索结果
        SearchHits searchHits = searchResponse.getHits();

        SearchHit[] hits = searchHits.getHits();
        if (hits != null && hits.length != 0){
            for (SearchHit hit : hits) {
                List<String> highLights = new ArrayList<>();
                Map<String, HighlightField> highlightFields = hit.getHighlightFields();
                Map<String, Object> source = hit.getSource();
                //处理高亮 获取高亮字符串
                if (highlightFields != null && highlightFields.size() != 0){
                    String[] needHighLightFields = new String[]{EagleConst.ORDER_TITLE, EagleConst.ORDER_DETAIL, EagleConst.ORDER_OPERATOR};
                    for (String needHighLightField : needHighLightFields){
                        HighlightField titleField = highlightFields.get(needHighLightField);
                        if(titleField != null){
                            Text[] fragments = titleField.fragments();
                            if (fragments != null && fragments.length != 0){
                                StringBuilder name = new StringBuilder();
                                for (Text text : fragments) {
                                    name.append(text);
                                }
                                source.put(needHighLightField, name.toString());
                                highLights.add(needHighLightField + ":" + name.toString());
                            }
                        }
                    }
                }
                WOSearchModel woSearchModel = new WOSearchModel();
                woSearchModel.setHighLightTexts(highLights);
                OrderModel orderModel = new OrderModel();
                BeanUtils.populate(orderModel, source);
                woSearchModel.setModel(orderModel);
                StringBuilder urlStringBuilder = new StringBuilder();
                urlStringBuilder.append(EagleConst.URL_PRE).append("ids=").append(orderModel.getId())
                        .append("&tenantId=").append(orderModel.getTenantId()).append("&projectId=").append(orderModel.getProjectId());
                woSearchModel.setUrl(urlStringBuilder.toString());
                woSearchModels.add(woSearchModel);
            }
        }

        return woSearchModels;
    }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值