ElasticSearch多個字段分詞查詢高亮顯示


ElasticSearch關鍵字查詢,將關鍵字分詞后查詢,多個字段,查詢出來字段高亮顯示。
查詢方法如下:

public List<NewsInfo> searcher2(String key, String indexId, String type) {
        List<NewsInfo> newsInfos= new ArrayList<NewsInfo>();
        try {
            // 創建查詢索引,參數productindex表示要查詢的索引庫為productindex
            SearchRequestBuilder searchRequestBuilder = client
                    .prepareSearch(indexId);

            // 設置查詢索引類型,setTypes("productType1", "productType2","productType3");
            // 用來設定在多個類型中搜索
            searchRequestBuilder.setTypes(type);
            // 設置查詢類型 1.SearchType.DFS_QUERY_THEN_FETCH = 精確查詢 2.SearchType.SCAN
            // = 掃描查詢,無序
            searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
            // 設置查詢關鍵詞
//          searchRequestBuilder
//                  .setQuery(QueryBuilders.boolQuery().should(QueryBuilders.termQuery("title", key))
//                          .should(QueryBuilders.termQuery("content", key)));
            QueryStringQueryBuilder queryBuilder = new QueryStringQueryBuilder(key);
            queryBuilder.analyzer("ik_smart");
            queryBuilder.field("title").field("content");
            searchRequestBuilder.setQuery(queryBuilder);
            // 分頁應用
             searchRequestBuilder.setFrom(1).setSize(3000);

            // 設置是否按查詢匹配度排序
            searchRequestBuilder.setExplain(true);
            // 按照字段排序
            searchRequestBuilder.addSort("publish_time", SortOrder.DESC);
            // 設置高亮顯示
            searchRequestBuilder.addHighlightedField("title");
            searchRequestBuilder.addHighlightedField("content");
            searchRequestBuilder
                    .setHighlighterPreTags("<span style=\"color:red\">");
            searchRequestBuilder.setHighlighterPostTags("</span>");
//          searchRequestBuilder.setHighlighterPreTags("<em>");
//          searchRequestBuilder.setHighlighterPostTags("<em>");
            // 執行搜索,返回搜索響應信息
            SearchResponse response = searchRequestBuilder.execute()
                    .actionGet();

            // 獲取搜索的文檔結果
            SearchHits searchHits = response.getHits();
            SearchHit[] hits = searchHits.getHits();
            // ObjectMapper mapper = new ObjectMapper();
            for (int i = 0; i < hits.length; i++) {
                SearchHit hit = hits[i];
                // 將文檔中的每一個對象轉換json串值
                String json = hit.getSourceAsString();
                // 將json串值轉換成對應的實體對象
                NewsInfo newsInfo = JsonUtils
                        .readToObject(json, NewsInfo.class);
                // 獲取對應的高亮域
                Map<String, HighlightField> result = hit.highlightFields();
                // 從設定的高亮域中取得指定域
                HighlightField titleField = result.get("title");
                if (titleField !=null) {
                    // 取得定義的高亮標簽
                    Text[] titleTexts = titleField.fragments();
                    // 為title串值增加自定義的高亮標簽
                    String title = "";
                    for (Text text : titleTexts) {
                        title += text;
                    }
                    newsInfo.setTitle(title);
                }
                // 從設定的高亮域中取得指定域
                HighlightField contentField = result.get("content");
                if (contentField !=null) {
                    // 取得定義的高亮標簽
                    Text[] contentTexts = contentField.fragments();
                    // 為title串值增加自定義的高亮標簽
                    String content = "";
                    for (Text text : contentTexts) {
                        content += text;
                    }
                    // 將追加了高亮標簽的串值重新填充到對應的對象
                    newsInfo.setContent(content);
                }
                newsInfos.add(newsInfo);
//              System.out.println(newsInfo.toString());
                // 打印高亮標簽追加完成后的實體對象
            }
            // 防止出現:遠程主機強迫關閉了一個現有的連接
//          Thread.sleep(10000);
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        return newsInfos;
    }

多字段查詢方法:

QueryStringQueryBuilder queryBuilder = new QueryStringQueryBuilder(key);
            queryBuilder.analyzer("ik_smart");
            queryBuilder.field("title").field("content");
            searchRequestBuilder.setQuery(queryBuilder);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM