天天看點

ES7中文多字段分詞搜尋,結果高亮顯示

ES7預設自帶了中文分詞,根據實際情況,可自選擇配置分詞政策

        //1、索引庫

        SearchRequest searchRequest = new SearchRequest("resource");

        //2、查詢條件

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()

                //資源類型type是精确比對

                .must(QueryBuilders.termQuery("type", type));

        if(StringUtils.isNotEmpty(code)) {

            //樹編碼是字首比對

            boolQueryBuilder.must(QueryBuilders.matchPhrasePrefixQuery("code", code));

        }

        boolean havKeywords =  StringUtils.isNotEmpty(keywords);

        if(havKeywords) {

            //關鍵字多字段分詞比對:搜尋範圍字段(分詞)

            String[] searchFields = {"name","pName","source","scope","desc","fieldNames"};

            BoolQueryBuilder boolQueryBuilder2 = QueryBuilders.boolQuery()

                    .should(QueryBuilders.multiMatchQuery(keywords, searchFields));

            boolQueryBuilder.must(boolQueryBuilder2);

            //3、設定高亮字段

            HighlightBuilder highlightBuilder = new HighlightBuilder();

            highlightBuilder.field("name");

            highlightBuilder.field("pName");

            highlightBuilder.field("source");

            highlightBuilder.field("scope");

            highlightBuilder.field("desc");

            highlightBuilder.field("fieldNames");

            //設定高亮前置标簽,設定紅色

            highlightBuilder.preTags("<span style='color:red'>");

            //設定高亮後置标簽

            highlightBuilder.postTags("</span>");

            searchSourceBuilder.highlighter(highlightBuilder);

        }

        //排序  2審批時間排序

        if(sortType == 2) {

            searchSourceBuilder.sort("approvalTime.keyword",SortOrder.DESC);

        }

        //3、執行查詢

        searchSourceBuilder.query(boolQueryBuilder);

        searchSourceBuilder.from(from);

        searchSourceBuilder.size(size);

        searchSourceBuilder.timeout(new TimeValue(10000));

        searchSourceBuilder.trackTotalHits(true);

        searchRequest.source(searchSourceBuilder);

        try {

            List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();

            //通過發送初始搜尋請求來初始化搜尋上下文

            searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);

            map.put("total",searchResponse.getHits().getTotalHits().value);

            SearchHit[] rows = searchResponse.getHits().getHits();

            for(SearchHit row : rows) {

                Map<String,Object> rowMap = row.getSourceAsMap();

                Map<String, HighlightField> highlightFields = row.getHighlightFields();

                rowMap.put("fieldNames", "");

                for(String highlightField : highlightFields.keySet()) {

                    //高亮值,預設取第一個即可

                    String val = highlightFields.get(highlightField).getFragments()[0].toString();

                    if("fieldNames".equals(highlightField)) {

                        //有關鍵字輸入才查詢傳回該字段

                        if(havKeywords) {

                            String[] fieldVals = val.split(",");

                            List<String> resultFields = new ArrayList<String>();

                            for(String field : fieldVals) {

                                if(field.contains("</span>")) {

                                    resultFields.add(field);

                                }

                            }

                            val = StringUtils.join(resultFields.toArray(), ",");

                            rowMap.put(highlightField, val);

                        }

                    }

                    rowMap.put(highlightField, val);

                }

                list.add(rowMap);

            }

            map.put("list",list);

繼續閱讀