中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

lucene4.7分頁技術怎么使用

發布時間:2021-12-23 09:13:19 來源:億速云 閱讀:144 作者:iii 欄目:互聯網科技

本篇內容介紹了“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分頁技術怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

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

AI

甘谷县| 红安县| 长兴县| 洞口县| 贵阳市| 滕州市| 故城县| 西贡区| 兴山县| 文水县| 长沙县| 共和县| 衡山县| 武胜县| 体育| 塔河县| 永川市| 遵化市| 衡南县| 晴隆县| 兴仁县| 金昌市| 天津市| 额济纳旗| 松阳县| 当涂县| 逊克县| 玉环县| 河津市| 和田县| 区。| 南昌县| 定远县| 海淀区| 沙湾县| 隆安县| 宣城市| 疏勒县| 沁阳市| 孟连| 邵武市|