タブとハイライトキーコード

//分页并高亮显示之多字段查询(multi_match)
    public List<Mytest> queryHighlightAndPageable(String keywords, Integer page, Integer pageSize) throws IOException {
        MultiMatchQueryBuilder queryBuilder =
                QueryBuilders.multiMatchQuery(keywords, "title", "subTitle");

        //分页设置
        if (pageSize == null) pageSize = 20;
        if (page == null) page = 1;
        Integer from = (page - 1) * pageSize;
        if (from <= 0) from = 0;


        //高亮
        //设置需要高亮的es字段
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.preTags("<em style='color:yellow'>");
        highlightBuilder.postTags("</em>");
        highlightBuilder.field("title");
        highlightBuilder.field("subTitle");

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //绑定高亮,查询条件
        searchSourceBuilder.query(queryBuilder).highlighter(highlightBuilder);
        //分页
        searchSourceBuilder.from(from);
        searchSourceBuilder.size(pageSize);

        System.out.println("searchSourceBuilder = " + searchSourceBuilder);

        //构建查询器
        SearchRequest searchRequest = new SearchRequest(indexName);
        searchRequest.source(searchSourceBuilder);

        //处理返回值:封装到list中
        SearchResponse searchResponse =
                restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits searchHits = searchResponse.getHits();
        System.out.println("总数 = " + searchHits.getTotalHits());

        //封装数据
        List<Mytest> items = new ArrayList<>();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            //把每条数据封入对象
            Mytest mytest = new Mytest();

            Map source = hit.getSourceAsMap();
            //把非高亮字段封进对象
            Object id = source.get("id");
            mytest.setId(Integer.parseInt(id.toString()));
            Object price = source.get("price");
            mytest.setPrice(BigDecimal.valueOf(Double.parseDouble(price.toString())));
            //首先从highlight获取es字段,如果命中关键字则有,没有命中直接从Source获取
            if (hit.getHighlightFields().get("title") != null) {
                Text[] titleTexts = hit.getHighlightFields().get("title").getFragments();
                String title = "";
                for (Text text : titleTexts) {
                    title += text;
                }
                System.out.println("title:" + title);
                mytest.setTitle(title);
            } else {
                mytest.setTitle(source.get("title").toString());
            }

            //获取es字段subTitle
            if (hit.getHighlightFields().get("subTitle") != null) {
                Text[] titleTexts = hit.getHighlightFields().get("subTitle").getFragments();
                String subTitle = "";
                for (Text text : titleTexts) {
                    subTitle += text;
                }
                System.out.println("subTitle:" + subTitle);
                mytest.setSubTitle(subTitle);
            } else {
                mytest.setSubTitle(source.get("subTitle").toString());
            }

            items.add(mytest);

        }

        for (Mytest item : items) {
            System.out.println("neibushuju:"+item);
        }
        return items;
    }
公開された14元の記事 ウォンの賞賛0 ビュー317

おすすめ

転載: blog.csdn.net/qq_38205881/article/details/104467204