溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

lucene4.7分頁技術怎么使用

發(fā)布時間:2021-12-23 09:13:19 來源:億速云 閱讀:134 作者:iii 欄目:互聯(lián)網科技

本篇內容介紹了“l(fā)ucene4.7分頁技術怎么使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

在介紹分頁之前,我們先來看看上面的那個需求,不用分頁的解決辦法, 
其實在lucene里面,每一個索引都會對應一個不重復的docid,而這一點跟Oralce數(shù)據(jù)庫的偽列rownum一樣,恰恰正是由于這個docid的存在,所以讓lucene在海量數(shù)據(jù)檢索時從而擁有更好的性能,我們都知道Oracle數(shù)據(jù)庫在分頁時,使用的就是偽列進行分頁,那么我的lucene也是一樣,既然有一個docid的存在,那么上面的需求就很簡單了。
 

方法一:依次根據(jù)每個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的分頁,總的來說有兩種形式,總結如下圖表格。(如果存在不合適之處,歡迎指正?。?/strong>

編號方式優(yōu)點缺點
1在ScoresDocs里進行分頁無需再次查詢索引,速度很快在海量數(shù)據(jù)時,會內存溢出
2利用SearchAfter,再次查詢分頁適合大批量數(shù)據(jù)的分頁再次查詢,速度相對慢一點,但可以利用緩存彌補

從上圖我們可以分析出,ScoreDocs適合在數(shù)據(jù)量不是很大的場景下進行分頁,而SearchAfter則都適合,所以,我們要根據(jù)自己的業(yè)務需求,合理的選出適合自己的分頁方式。 

在我們了解這2中分頁技術的優(yōu)缺點之后,我們再來探討下上面那個讀2億數(shù)據(jù)存入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;//分頁的條數(shù)
         int total=30;//結束條數(shù)
         int z=0;
         while(z<=50){//總分頁數(shù)
         System.out.println("==============================");
         pageScoreDocs(offset,total,search, all.scoreDocs);//調用分頁打印
         offset=(z*pageSize+pageSize);//下一頁的位置增量
         z++;//分頁數(shù)+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){//當分頁的長度數(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)自動結束
             }
             page(search,paged);//分頁操作,此步是傳到方法里對數(shù)據(jù)做處理的
             
             pageStart+=paged.scoreDocs.length;//下一次分頁總在上一次分頁的基礎上
             lastBottom=paged.scoreDocs[paged.scoreDocs.length-1];//上一次的總量-1,成為下一次的lastBottom
         }
         reader.close();//關閉資源
         directory.close();//關閉連接
        
        }catch(Exception e){
            e.printStackTrace();
        }

“l(fā)ucene4.7分頁技術怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI