您好,登錄后才能下訂單哦!
本篇內容介紹了“lucene4.7分頁技術怎么使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
在介紹分頁之前,我們先來看看上面的那個需求,不用分頁的解決辦法,
其實在lucene里面,每一個索引都會對應一個不重復的docid,而這一點跟Oralce數據庫的偽列rownum一樣,恰恰正是由于這個docid的存在,所以讓lucene在海量數據檢索時從而擁有更好的性能,我們都知道Oracle數據庫在分頁時,使用的就是偽列進行分頁,那么我的lucene也是一樣,既然有一個docid的存在,那么上面的需求就很簡單了。
方法一:依次根據每個docid獲取文檔然后寫入txt中,這樣的以來,就避免了內存不足的缺點,但是這樣單條讀取的話,速度上可能會慢一點,但能滿足需求無可厚非。偽代碼如下
try{ directory=FSDirectory.open(new File(indexReadPath));//打開索引文件夾 IndexReader reader=DirectoryReader.open(directory);//讀取目錄 IndexSearcher search=new IndexSearcher(reader);//初始化查詢組件 for(int i=0;i<reader.numDocs();i++){//numDocs可能很大 Document doc=search.doc(i);//依次獲取每個docid對應的Document //可以在此部,做個批量操作,加快寫入速度 } reader.close();//關閉資源 directory.close();//關閉連接 }catch(Exception e){ e.printStackTrace(); }
Lucene的分頁,總的來說有兩種形式,總結如下圖表格。(如果存在不合適之處,歡迎指正!)
編號 | 方式 | 優點 | 缺點 |
1 | 在ScoresDocs里進行分頁 | 無需再次查詢索引,速度很快 | 在海量數據時,會內存溢出 |
2 | 利用SearchAfter,再次查詢分頁 | 適合大批量數據的分頁 | 再次查詢,速度相對慢一點,但可以利用緩存彌補 |
從上圖我們可以分析出,ScoreDocs適合在數據量不是很大的場景下進行分頁,而SearchAfter則都適合,所以,我們要根據自己的業務需求,合理的選出適合自己的分頁方式。
在我們了解這2中分頁技術的優缺點之后,我們再來探討下上面那個讀2億數據存入txt文本里,在這里,SocreDocs不適合這種場景,當然如果你內存足夠大的話,可以嘗試下,通用分頁分批讀取的方式,可以提升我們的寫入效率,效果是比單條單條讀取的速度是要快很多的。雖然ScoresDocs的分頁方式在本需求上不適合,但是作為示例,下面散仙給出使用ScoreDocs進行分頁的代碼:
try{ directory=FSDirectory.open(new File(indexReadPath));//打開索引文件夾 IndexReader reader=DirectoryReader.open(directory);//讀取目錄 IndexSearcher search=new IndexSearcher(reader);//初始化查詢組件 TopDocs all=search.search(new MatchAllDocsQuery(), 50000); int offset=0;//起始位置 int pageSize=30;//分頁的條數 int total=30;//結束條數 int z=0; while(z<=50){//總分頁數 System.out.println("=============================="); pageScoreDocs(offset,total,search, all.scoreDocs);//調用分頁打印 offset=(z*pageSize+pageSize);//下一頁的位置增量 z++;//分頁數+1; total=offset+pageSize;//下一次的結束分頁量 } reader.close();//關閉資源 directory.close();//關閉連接 }catch(Exception e){ e.printStackTrace(); }
public void pageScoreDocs(int offset,int total,IndexSearcher searcher,ScoreDoc[] doc) throws Exception{ //System.out.println("offset:"+offset+"===>"+total); for(int i=offset;i<total;i++){ //System.out.println("i"+i+"==>"+doc.length); if(i>doc.length-1){//當分頁的長度數大于總數就停止 break; }else{ Document dosc=searcher.doc(doc[i].doc); System.out.println(dosc.get("name")); } }
最后我們來看下使用SearcherAfter進行分頁的方式,代碼如下:
try{ directory=FSDirectory.open(new File(indexReadPath));//打開索引文件夾 IndexReader reader=DirectoryReader.open(directory);//讀取目錄 IndexSearcher search=new IndexSearcher(reader);//初始化查詢組件 int pageStart=0; ScoreDoc lastBottom=null;//相當于pageSize while(pageStart<10){//這個只有是paged.scoreDocs.length的倍數加一才有可能翻頁操作 TopDocs paged=null; paged=search.searchAfter(lastBottom, new MatchAllDocsQuery(),null,30);//查詢首次的30條 if(paged.scoreDocs.length==0){ break;//如果下一頁的命中數為0的情況下,循環自動結束 } page(search,paged);//分頁操作,此步是傳到方法里對數據做處理的 pageStart+=paged.scoreDocs.length;//下一次分頁總在上一次分頁的基礎上 lastBottom=paged.scoreDocs[paged.scoreDocs.length-1];//上一次的總量-1,成為下一次的lastBottom } reader.close();//關閉資源 directory.close();//關閉連接 }catch(Exception e){ e.printStackTrace(); }
“lucene4.7分頁技術怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。