本篇內(nèi)容介紹了“l(fā)ucene4.7分頁技術(shù)怎么使用”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
四川網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,四川網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為四川千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營銷網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的四川做網(wǎng)站的公司定做!
在介紹分頁之前,我們先來看看上面的那個需求,不用分頁的解決辦法,
其實在lucene里面,每一個索引都會對應(yīng)一個不重復(fù)的docid,而這一點跟Oralce數(shù)據(jù)庫的偽列rownum一樣,恰恰正是由于這個docid的存在,所以讓lucene在海量數(shù)據(jù)檢索時從而擁有更好的性能,我們都知道Oracle數(shù)據(jù)庫在分頁時,使用的就是偽列進行分頁,那么我的lucene也是一樣,既然有一個docid的存在,那么上面的需求就很簡單了。
方法一:依次根據(jù)每個docid獲取文檔然后寫入txt中,這樣的以來,就避免了內(nèi)存不足的缺點,但是這樣單條讀取的話,速度上可能會慢一點,但能滿足需求無可厚非。偽代碼如下
try{ directory=FSDirectory.open(new File(indexReadPath));//打開索引文件夾 IndexReader reader=DirectoryReader.open(directory);//讀取目錄 IndexSearcher search=new IndexSearcher(reader);//初始化查詢組件 for(int i=0;iLucene的分頁,總的來說有兩種形式,總結(jié)如下圖表格。(如果存在不合適之處,歡迎指正?。?/strong>
編號 方式 優(yōu)點 缺點 1 在ScoresDocs里進行分頁 無需再次查詢索引,速度很快 在海量數(shù)據(jù)時,會內(nèi)存溢出 2 利用SearchAfter,再次查詢分頁 適合大批量數(shù)據(jù)的分頁 再次查詢,速度相對慢一點,但可以利用緩存彌補 從上圖我們可以分析出,ScoreDocs適合在數(shù)據(jù)量不是很大的場景下進行分頁,而SearchAfter則都適合,所以,我們要根據(jù)自己的業(yè)務(wù)需求,合理的選出適合自己的分頁方式。
在我們了解這2中分頁技術(shù)的優(yōu)缺點之后,我們再來探討下上面那個讀2億數(shù)據(jù)存入txt文本里,在這里,SocreDocs不適合這種場景,當然如果你內(nèi)存足夠大的話,可以嘗試下,通用分頁分批讀取的方式,可以提升我們的寫入效率,效果是比單條單條讀取的速度是要快很多的。雖然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;//分頁的條數(shù) int total=30;//結(jié)束條數(shù) int z=0; while(z<=50){//總分頁數(shù) System.out.println("=============================="); pageScoreDocs(offset,total,search, all.scoreDocs);//調(diào)用分頁打印 offset=(z*pageSize+pageSize);//下一頁的位置增量 z++;//分頁數(shù)+1; total=offset+pageSize;//下一次的結(jié)束分頁量 } reader.close();//關(guān)閉資源 directory.close();//關(guān)閉連接 }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"+doc.length); if(i>doc.length-1){//當分頁的長度數(shù)大于總數(shù)就停止 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的倍數(shù)加一才有可能翻頁操作 TopDocs paged=null; paged=search.searchAfter(lastBottom, new MatchAllDocsQuery(),null,30);//查詢首次的30條 if(paged.scoreDocs.length==0){ break;//如果下一頁的命中數(shù)為0的情況下,循環(huán)自動結(jié)束 } page(search,paged);//分頁操作,此步是傳到方法里對數(shù)據(jù)做處理的 pageStart+=paged.scoreDocs.length;//下一次分頁總在上一次分頁的基礎(chǔ)上 lastBottom=paged.scoreDocs[paged.scoreDocs.length-1];//上一次的總量-1,成為下一次的lastBottom } reader.close();//關(guān)閉資源 directory.close();//關(guān)閉連接 }catch(Exception e){ e.printStackTrace(); }“l(fā)ucene4.7分頁技術(shù)怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
標題名稱:lucene4.7分頁技術(shù)怎么使用
文章出自:http://weahome.cn/article/gdccde.html