Solr的學習使用之(六)獲取數據列表-SolrDocumentList


以下是我項目中獲取新聞數據列表的寫法,包括數據總量、數據列表,接下來會貼出分片查詢(facet)等高級查詢

基本的注釋都有了:

private ListPage<News> queryFromSolr(NewsQueryParameters queryParameters, Keyword keyword) {    
        if (queryParameters == null) {
            throw new IllegalArgumentException("查詢參數為空");
        }
        ListPage<News> result = new ListPage<News>();
        HttpSolrServer solrServer = SolrServer.getInstance().getServer();
        SolrQuery sQuery = new SolrQuery();
        
        try {
            String para = this.initKeywordQueryPara(keyword);//初始化para參數方法
            int pageNo=queryParameters.getPageNo();
            int pageSize=queryParameters.getPageSize();
                                                
            sQuery.setStart((pageNo - 1) * pageSize);//設置起始頁,類似於sql的分頁查詢
            sQuery.setRows(pageSize);//設置每頁大小,類似於sql的分頁查詢
            //排序條件
            sQuery.setSort("publishTime", SolrQuery.ORDER.desc); 
            
            sQuery.setQuery(para);//這邊的值大概是醬紫的 "* AND publishTime:[1360000 TO 13700000]  AND contentStr:\"關鍵字\"";
            QueryResponse response = solrServer.query(sQuery,SolrRequest.METHOD.POST);
            SolrDocumentList list = response.getResults();//response.getResults()返回的類型是SolrDocumentList,solr文檔集,所以用它來接收
            Integer counts = (int) list.getNumFound();//獲取總數,這個可以從solr Admin 管理頁面里看出來,當我們去Query時,結果中也有一個numFound的屬性
            List<News> newsList = new ArrayList<News>();
            for (SolrDocument solrDocument : list) {
                News news = null;
                String id = (String) solrDocument.getFieldValue("id");//這邊是獲取solr上有存儲的字段,也就是我們在schema.xml文件里配置的field標簽的stored屬性,=true就會存儲在solr服務器上,因為我的schema.xml只配置id的stored=true,所以這邊我先通過獲取id,在通過id去數據庫獲取具體的新聞信息
                news = newsDAO.findById(id);
                if(news != null){
                    newsList.add(news);                
                }

            }

            result.setCurrentPageSize(pageSize);
            result.setCurrentPageNo(pageNo);
            result.setTotalCount(counts);
            result.setDataList(newsList);
            return result;
        } catch (SolrServerException e) {
            log.error("查詢solr失敗", e);
            e.printStackTrace();
        } finally{
            solrServer.shutdown();
            solrServer = null;
        }

        return result;

    }

 

public String initKeywordQueryPara(Keyword keyword){
        
        String para = "*";
        
        long dataTimeStart = 0;
        long dataTimeEnd = 0; 
        
        if(keyword.getMonitoringBeginTime() != null){
            dataTimeStart = keyword.getMonitoringBeginTime().getTime();
        }
        if(keyword.getMonitoringEndTime() != null){
            Date endTime = DateUtil.getNextDayCurrDay(keyword.getMonitoringEndTime(), 1);
            dataTimeEnd = endTime.getTime();
        }
        para = para + " AND publishTime:["
        + (dataTimeStart == 0 ? "*" : dataTimeStart) + " TO "
        + (dataTimeEnd == 0 ? "*" : dataTimeEnd) + "]";
        
        String keywords = keyword.getKeywordName();
        if(keywords !=null && keywords.length() > 0){
            String[] targetArr = keywords.split(",");
            para = para + " AND (";
            for (int i = 0; i < targetArr.length; i++) {
                if (i != 0) {
                    para = para + " OR ";
                }
                para = para + "contentStr:\"" + targetArr[i] + "\"";
            }
            para = para + ")";    
        
        }return para;
    }

 

 

 

 


免責聲明!

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



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