以下是我項目中獲取新聞數據列表的寫法,包括數據總量、數據列表,接下來會貼出分片查詢(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; }