lucene两个分页操作
生活随笔
收集整理的這篇文章主要介紹了
lucene两个分页操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ?基于lucene兩個分頁:
? ?lucene3.5查詢方式(每次查詢所有記錄,然后取當中部分記錄。這樣的方式用的最多),lucene官方的解釋:因為我們的速度足夠快。
處理海量數據時。內存easy內存溢出。
? ?lucene3.5以后提供一個searchAfter,這個是在特大數據量採用(億級數據量),速度相對慢一點,像google搜索圖片的時候,點擊很多其它,然后再出來一批。這樣的方式就是把數據保存在緩存里面。然后再去取。
下面是再查詢部分代碼:
?? /*** 這就是先查詢全部的數據。然后去分頁數據* 注意 這樣的方式處理海量數據的時候,easy內存溢出* @param query* @param pageIndex--第幾頁* @param pageSize--每頁顯示多少數據*/public void searchPage(String query,int pageIndex,int pageSize) {try {Directory dir = FileIndexUtils.getDirectory();IndexSearcher searcher = getSearcher(dir);QueryParser parser = new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));Query q = parser.parse(query);TopDocs tds = searcher.search(q, 500);//注意 此處把500條數據放在內存里。ScoreDoc[] sds = tds.scoreDocs;int start = (pageIndex-1)*pageSize;int end = pageIndex*pageSize;for(int i=start;i<end;i++) {Document doc = searcher.doc(sds[i].doc);System.out.println(sds[i].doc+":"+doc.get("path")+"-->"+doc.get("filename"));}searcher.close();} catch (org.apache.lucene.queryParser.ParseException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
? ?最后我們來看下使用SearcherAfter進行分頁的方式,代碼例如以下(lucene3.5之前 不支持該方法):
/*** 依據頁碼和分頁大小獲取上一次的最后一個scoredocs* @param pageIndex* @param pageSize* @param query* @param searcher* @return* @throws IOException*/private ScoreDoc getLastScoreDoc(int pageIndex,int pageSize,Query query,IndexSearcher searcher) throws IOException {if(pageIndex==1)return null;//假設是第一頁就返回空int num = pageSize*(pageIndex-1);//獲取上一頁的最后數量TopDocs tds = searcher.search(query, num);return tds.scoreDocs[num-1];}public void searchPageByAfter(String query,int pageIndex,int pageSize) {try {Directory dir = FileIndexUtils.getDirectory();IndexSearcher searcher = getSearcher(dir);QueryParser parser = new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));Query q = parser.parse(query);//獲取上一頁的最后一個元素ScoreDoc lastSd = getLastScoreDoc(pageIndex, pageSize, q, searcher);//通過最后一個元素去搜索下一頁的元素TopDocs tds = searcher.searchAfter(lastSd,q, pageSize);for(ScoreDoc sd:tds.scoreDocs) {Document doc = searcher.doc(sd.doc);System.out.println(sd.doc+":"+doc.get("path")+"-->"+doc.get("filename"));}searcher.close();} catch (org.apache.lucene.queryParser.ParseException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
總結
以上是生活随笔為你收集整理的lucene两个分页操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 几纳米间风云:手机摄影的制高点争夺战
- 下一篇: SHELL test [ 命令用法