亚洲人成网站在线播放2019 _日韩国产欧美精品_久久夜色精品国产欧美乱_在线视频福利一区

當前位置:首頁 > 網站舊欄目 > 學習園地 > 設計軟件教程 > Lucene應用的一點體會

Lucene應用的一點體會
2010-01-13 23:07:22  作者:  來源:
Lucene應用(我用的是Lucene2.1.0,有些觀點有可能也不太正確)

1.多線程索引,共享同一個IndexWriter對象

這種方式效率很慢,主要原因是因為:

java 代碼
 
  1. public void addDocument(Document doc, Analyzer analyzer) throws IOException {  
  2. SegmentInfo newSegmentInfo = buildSingleDocSegment(doc, analyzer);  
  3. synchronized (this) {  
  4. ramSegmentInfos.addElement(newSegmentInfo);//這句很占用效率  
  5. maybeFlushRamSegments();  
  6. }  
  7. }  
ramSegmentInfos 是一個SegmentInfos 對象,這個對象extends Vector,Vector的addElement是同步的。這個可能是導致效率慢的主要原因吧.

2 多線程索引,  先寫到RAMDirectory,再一次性寫到FSDirectory

功能:首先向RAMDirectory里寫,當達到1000個Document後,再向FSDirectory里寫。

當多線程執行時,會大量報java.lang.NullPointerException

自己寫的多線程索引的類為(IndexWriterServer,該對象只在Server啟動時初始化一次):
 

代碼
  1. public class IndexWriterServer{  
  2. private static IndexWriter indexWriter = null;  
  3.       
  4.     //private String indexDir ;//索引目錄;  
  5.       
  6.     private static  CJKAnalyzer analyzer = null;  
  7.       
  8.     private static RAMDirectory ramDir = new RAMDirectory();  
  9.       
  10.     private static IndexWriter ramWriter = null;  
  11.       
  12.     private static int diskFactor = 0;//內存中現在有多少Document  
  13.       
  14.     private static long ramToDistTime = 0;//內存向硬盤寫需要多少時間  
  15.       
  16.     private int initValue = 1000;//內存中達到多少Document,才向硬盤寫  
  17.       
  18.     private static IndexItem []indexItems = null;  
  19.       
  20.     public IndexWriterServer(String indexDir){  
  21.         initIndexWriter(indexDir);  
  22.     }  
  23.     public void initIndexWriter(String indexDir){  
  24.         boolean create = false;//是否創建新的  
  25.           
  26.         analyzer = new CJKAnalyzer();  
  27.           
  28.         Directory directory = this.getDirectory(indexDir);  
  29.         //判斷是否為索引目錄  
  30.         if(!IndexReader.indexExists(indexDir)){  
  31.             create = true;  
  32.         }  
  33.           
  34.         indexWriter = getIndexWriter(directory,create);  
  35.           
  36.         try{  
  37.             ramWriter = new IndexWriter(ramDir, analyzer, true);  
  38.         }catch(Exception e){  
  39.             logger.info(e);  
  40.         }  
  41.           
  42.         indexItems = new IndexItem[initValue+2];  
  43.     }  
  44.   
  45. /** 
  46.      * 生成單個Item索引 
  47.      */  
  48.     public boolean generatorItemIndex(IndexItem item, Current __current) throws DatabaseError, RuntimeError{  
  49.         boolean isSuccess = true;//是否索引成功  
  50.           
  51.         try{  
  52.               
  53.             Document doc = getItemDocument(item);  
  54.               
  55.             ramWriter.addDocument(doc);//關鍵代碼,錯誤就是從這里報出來的  
  56.               
  57.             indexItems[diskFactor] = item;//為數據挖掘使用  
  58.             diskFactor ++;  
  59.             if((diskFactor % initValue) == 0){  
  60.                 ramToDisk(ramDir,ramWriter,indexWriter);  
  61.                 //ramWriter = new IndexWriter(ramDir, analyzer, true);  
  62.                 diskFactor = 0;  
  63.                   
  64.                 //數據挖掘  
  65.                 isSuccess = MiningData();  
  66.   
  67.                   
  68.             }  
  69.               
  70.             doc = null;  
  71.               
  72.   
  73.             logger.info("generator index item link:" + item.itemLink  +" success");  
  74.         }catch(Exception e){  
  75.             logger.info(e);  
  76.             e.printStackTrace();  
  77.       
  78.             logger.info("generator index item link:" + item.itemLink  +" faiture");  
  79.             isSuccess = false;  
  80.         }finally{  
  81.             item = null;  
  82.         }  
  83.           
  84.         return isSuccess;  
  85.     }  
  86.   
  87. public  void ramToDisk(RAMDirectory ramDir, IndexWriter ramWriter,IndexWriter writer){  
  88.         try{  
  89.             ramWriter.close();//關鍵代碼,把fileMap賦值為null了  
  90.             ramWriter = new IndexWriter(ramDir, analyzer, true);//重新構建一個ramWriter對象。因為它的fileMap為null了,但是好像并沒有太大作用  
  91.             Directory ramDirArray[] = new Directory[1];  
  92.             ramDirArray[0] = ramDir;  
  93.             mergeDirs(writer, ramDirArray);  
  94.         }catch(Exception e){  
  95.             logger.info(e);  
  96.         }  
  97.     }  
  98.     /** 
  99.      * 將內存里的索引信息寫到硬盤里 
  100.      * @param writer 
  101.      * @param ramDirArray 
  102.      */   
  103.     public  void mergeDirs(IndexWriter writer,Directory[] ramDirArray){  
  104.         try {  
  105.             writer.addIndexes(ramDirArray);  
  106.             //optimize();  
  107.         } catch (IOException e) {  
  108.             logger.info(e);  
  109.         }  
  110.     }  
  111.       
  112. }  

主要原因大概是因為:在調用ramWriter.close();時,Lucene2.1里RAMDirectory 的close()方法
 

代碼
  1. public final void close() {  
  2.    fileMap = null;  
  3.  }  

把fileMap 給置null了,當多線程執行ramWriter.addDocument(doc);時,最終執行RAMDirectory 的方法:
代碼
  1. public IndexOutput createOutput(String name) {  
  2.     RAMFile file = new RAMFile(this);  
  3.     synchronized (this) {  
  4.     RAMFile existing = (RAMFile)fileMap.get(name);//fileMap為null,所以報:NullPointerException,  
  5.       if (existing!=null) {  
  6.         sizeInBytes -= existing.sizeInBytes;  
  7.         existing.directory = null;  
  8.       }  
  9.       fileMap.put(name, file);  
  10.     }  
  11.     return new RAMOutputStream(file);  
  12.   }  

提示:在網上搜索了一下,好像這個是lucene的一個bug(http://www.opensubscriber.com/message/java-user@lucene.apache.org/6227647.html),但是好像并沒有給出解決方案。


 

3.多線程索引,每個線程一個IndexWriter對象,每個IndexWriter 綁定一個FSDirectory對象。每個FSDirectory綁定一個本地的磁盤目錄(唯一的)。單獨開辟一個線程出來監控這些索引線程(監控線程),也就是說負責索引的線程索引完了以后,給這個監控線程的queue里發送一個對象:queue.add(directory);,這個監控現成的queue對象是個全局的。當這個queue的size() > 20 時,監控線程 把這20個索引目錄合并(merge):indexWriter.addIndexes(dirs);//合并索引,合并到真正的索引目錄里。,合并完了以后,然后刪除掉這些已經合并了的目錄。

但是這樣也有幾個bug:

a. 合并線程的速度 小于 索引線程的速度。導致 目錄越來越多

b.經常會報一個類似這樣的錯誤:
 

2007-06-08 10:49:18 INFO [Thread-2] (IndexWriter.java:1070) - java.io.FileNotFoundException: /home/spider/luceneserver/merge/item_d28686afe01f365c5669e1f19a2492c8/_1.cfs (No such file or directory)
 


 

4.單線程索引,調幾個參數後,效率也非常快(索引一條信息大概在6-30 ms之間)。感覺一般的需求單線程就夠用了。這些參數如下:

   private int mergeFactor = 100;//磁盤里達到多少後會自動合并
    private int maxMergeDocs = 1000;//內存中達到多少會向磁盤寫入
    private int minMergeDocs = 1000;//lucene2.0已經取消了
    private int maxFieldLength = 2000;//索引的最大文章長度
    private int maxBufferedDocs = 10000;//這個參數不能要,要不然不會自動合并了


得出的結論是:Lucene的多線程索引會有些問題,如果沒有特殊需求,單線程的效率幾乎就能滿足需求.


 

如果單線程的速度滿足不了你的需求,你可以多開幾個應用。每個應用都綁定一個FSDirectory,然后通過search時通過RMI去這些索引目錄進行搜索。

RMI Server端,關鍵性代碼:


 

 

java 代碼
  1. private void initRMI(){  
  2.         //第一安全配置  
  3.         if (System.getSecurityManager() == null) {  
  4.             System.setSecurityManager( new RMISecurityManager() );  
  5.         }  
  6.         //注冊  
  7.         startRMIRegistry(serverUrl);  
  8.           
  9.         SearcherWork searcherWork = new SearcherWork("//" + serverUrl + "/" + bindName, directory);  
  10.           
  11.         searcherWork.run();  
  12.           
  13.     }  
  14.   
  15. public class SearcherWork  {  
  16. //   Logger  
  17.     private static Logger logger = Logger.getLogger(SearcherWork.class);  
  18.     private String serverUrl =null;  
  19.     private Directory directory =null;  
  20.   
  21.     public SearcherWork(){  
  22.           
  23.     }  
  24.       
  25.     public SearcherWork(String serverUrl, Directory directory){  
  26.         this.serverUrl = serverUrl;  
  27.         this.directory = directory;  
  28.     }  
  29.       
  30.     public void run(){  
  31.         try{  
  32.              Searchable searcher = new IndexSearcher(directory);  
  33.              SearchService service = new SearchService(searcher);  
  34.              Naming.rebind(serverUrl, service);  
  35.              logger.info("RMI Server bind " + serverUrl + " success");  
  36.               
  37.         }catch(Exception e){  
  38.             logger.info(e);  
  39.             System.out.println(e);  
  40.         }  
  41.     }  
  42.       
  43.   
  44. }  
  45.   
  46. public class SearchService extends RemoteSearchable implements Searchable {  
  47.       
  48.     public SearchService (Searchable local) throws RemoteException {  
  49.         super(local);  
  50.     }  
  51. }  

客戶端關鍵性代碼:

 

java 代碼
 
  1. RemoteLuceneConnector rlc= new RemoteLuceneConnector();  
  2. RemoteSearchable[] rs= rlc.getRemoteSearchers();  
  3. MultiSearcher multi = new MultiSearcher(rs);  
  4. Hits hits = multi.search(new TermQuery(new Term("content","中國")));  

 


安徽新華電腦學校專業職業規劃師為你提供更多幫助【在線咨詢
亚洲人成网站在线播放2019 _日韩国产欧美精品_久久夜色精品国产欧美乱_在线视频福利一区
久久免费视频2| 国产精品无码人妻一区二区在线| 中文字幕一区二区中文字幕| 国产成人午夜视频网址| 国产精品中文字幕在线| 加勒比海盗1在线观看免费国语版 加勒比在线一区二区三区观看 | 国产精品精品软件视频| 国产爆乳无码一区二区麻豆| 韩国精品一区二区三区六区色诱| 日本一区二区三区四区五区六区 | 国产女同一区二区| 黄色片网址在线观看| 青青在线视频观看| 色噜噜狠狠色综合网| 亚洲精品日韩激情在线电影| 中文字幕日韩精品一区二区| 国产精品久久久久久久美男 | 久久久久久久久久码影片| 久久久久狠狠高潮亚洲精品| 国产精品91免费在线| 久久久亚洲天堂| 国产无套内射久久久国产| 毛片一区二区三区四区| 免费国产成人av| 国产真实乱子伦| 国产精选久久久久久| 国产欧美久久久久久| 国产精品一香蕉国产线看观看| 国产精品一区二区三| 91精品国产91久久久久久吃药| 9191国产视频| 久章草在线视频| 日韩在线欧美在线| 国产精品久久国产| 国产999视频| 日韩一区二区三区高清| 亚洲人成人77777线观看| 欧美激情亚洲激情| 亚洲精品一区二区三| 日本欧美一级片| 欧美福利精品| 精品日本一区二区三区| 国产日韩在线一区二区三区| 国产在线久久久| 国产女主播自拍| 99色这里只有精品| 久久亚洲综合网| 国产成人精品一区二区三区福利 | 国产精品久久久久久久久电影网| 久久99国产精品自在自在app| 国产精品久久久久久av福利| 欧美激情乱人伦一区| 丁香六月激情网| 欧美激情www| 国产精品小说在线| 久草综合在线观看| 久久精品91久久香蕉加勒比| 久久亚洲私人国产精品va| 亚洲一区美女视频在线观看免费| 亚洲巨乳在线观看| 青青草成人在线| 国产免费一区二区三区视频 | 日韩av免费电影| 黄色特一级视频| 91精品久久久久久久久中文字幕 | 欧美激情视频一区二区三区| 激情深爱综合网| youjizz.com亚洲| 久久精品夜夜夜夜夜久久 | 久久精品中文字幕一区二区三区| 久久精品中文字幕| 亚洲一区二区三区在线视频| 狠狠干视频网站| 久久久无码中文字幕久...| 欧美精品久久久久a| 国产尤物91| 国产精品高清网站| 精品999在线观看| 久久精品视频免费播放| 日韩欧美一区二| 久久精品国产第一区二区三区最新章节 | 久久99亚洲热视| 精品无码久久久久久久动漫| 国产精品爽爽爽爽爽爽在线观看| 日韩欧美视频第二区| 91精品国产高清自在线| 中文字幕色一区二区| 高清av免费一区中文字幕| 一区二区视频在线播放| 国产精品揄拍500视频| 精品久久久久久无码国产| 精品视频高清无人区区二区三区| 国产精品日韩欧美| 免费观看精品视频| 国产精品初高中精品久久| 国产在线精品二区| 在线视频亚洲自拍| 97精品视频在线| 亚洲v欧美v另类v综合v日韩v| 久久综合毛片| 欧美一区二区三区综合 | 久久久人成影片一区二区三区| 色婷婷综合久久久久中文字幕| 国产成人一区二区三区小说| 欧美综合在线观看视频| 国产精品视频网| 国产日韩精品视频| 亚洲欧洲精品一区二区| 国产传媒久久久| 欧美少妇一区| 欧美日韩高清在线观看| 久久久亚洲天堂| 男人亚洲天堂网| 一本久道中文无码字幕av| 69av在线播放| 欧美国产视频在线观看| 伊人久久大香线蕉午夜av| 久久男人av资源网站| 欧美日韩一区二区三区在线视频| 精品久久久久久一区| 91精品国产高清久久久久久久久| 日韩欧美精品一区二区| 国产精品成人观看视频国产奇米 | 亚洲一区二区三区777| 久久超碰亚洲| 国产一区二区自拍| 亚洲综合在线小说| 色老头一区二区三区在线观看| 黄色一级视频播放| 一区精品在线| 日韩亚洲精品电影| 国产精品专区在线| 日韩久久一级片| 久99九色视频在线观看| 久久av综合网| 国产日韩欧美成人| 日本精品免费一区二区三区| 精品久久久久久无码中文野结衣| 久久资源亚洲| 国产在线一区二区三区欧美| 亚洲日本无吗高清不卡| 国产精品日韩在线一区| 国产日韩第一页| 天天综合五月天| 精品久久sese| 久久www免费人成精品| 国产精品一区免费观看| 青青青国产在线观看| 一区二区视频在线免费| 国产精品日韩欧美| 国产成人精品999| 国产精品一区在线观看| 激情视频小说图片| 日av中文字幕| 污污污污污污www网站免费| 国产精品久久久久久久app| 国产高清免费在线| 隔壁老王国产在线精品| 精品一区久久| 欧美精品123| 秋霞久久久久久一区二区| 亚洲天堂av免费在线观看| 欧美精品性视频| www.久久撸.com| 久久国产乱子伦免费精品| 91精品在线国产| 国产精品自产拍在线观看中文| 黄页网站在线观看视频| 欧美一区三区二区在线观看| 日本欧美精品久久久| 天天综合狠狠精品| 欧美激情精品久久久久久蜜臀| 国产精品久久久久久久9999| 久久久精品欧美| 色妞欧美日韩在线| 久久久久久久久国产精品| 久久久av水蜜桃| 国产精品69久久| 97免费视频在线播放| 高清不卡日本v二区在线| 国产精品伊人日日| 成人黄色av网站| 97久久天天综合色天天综合色hd| 成人毛片网站| av网址在线观看免费| 97精品在线视频| 91精品视频大全| 91好吊色国产欧美日韩在线| 99久久精品免费看国产一区二区三区 | 日韩福利一区二区三区| 亚洲a在线观看| 大地资源第二页在线观看高清版| 亚洲精品视频一区二区三区 | 亚洲蜜桃av| 无码aⅴ精品一区二区三区浪潮| 亚洲乱码中文字幕久久孕妇黑人| 亚洲精品国产一区| 午夜精品久久久久久久无码| 日韩a在线播放| 欧美视频第一区|