Lucene3.3.0ぼろぼろの筆頭

4446 ワード

プロジェクトでは全文検索が必要で、luceneを優先することは言うまでもない.現在のバージョンは3.3.0 libにlucene-core-3.3.0が追加されています.jar
分詞器はサードパーティのIKAnalyzerを採用する.バージョンはIKAnalyzer 3.2.8.jar
プロジェクトの同時実行量が大きくない可能性があるため、新しいレコードをデータに保存すると同時に、そのレコードにハードディスク(HDD)インデックスを追加します.変更と削除は同じです.
また.毎晩インデックスを再生成し、マージします.
データに対してインデックス保存を行う場合、idのみを保存し、検索するコンテンツcontent.
1.新規:

	/***************************************************************************
	 *  
	 */
	private void add(LuceneIndexVO luceneIndexVO) throws Exception {
		//  doc 
		Document doc = new Document();
		//  
		doc.add(new Field(LuceneUtil.KEY_ID, luceneIndexVO.getId() + "",Field.Store.YES, Field.Index.NOT_ANALYZED));
		doc.add(new Field(LuceneUtil.KEY_CONTENT, luceneIndexVO.getContent(),Field.Store.YES, Field.Index.ANALYZED));
		//  
		IndexWriter writer =null;
		try{
		writer=getWriter();
		writer.addDocument(doc);
		//writer.optimize();
		}catch(Exception e){e.printStackTrace();}finally{
			if(writer!=null){
				writer.close();
			}
		}
	}

2.修正:

	private void update(LuceneIndexVO luceneIndexVO) throws Exception {
		Document doc = new Document();
		//  
		doc.add(new Field(LuceneUtil.KEY_ID, luceneIndexVO.getId() + "",Field.Store.YES, Field.Index.NOT_ANALYZED));
		doc.add(new Field(LuceneUtil.KEY_CONTENT, luceneIndexVO.getContent(),Field.Store.YES, Field.Index.ANALYZED));
		//  
		Term term = new Term(LuceneUtil.KEY_ID, luceneIndexVO.getId() + "");
		//  
		IndexWriter writer =null;
		try{
		writer=getWriter();
		//  term  id, 
		writer.updateDocument(term, doc);
		writer.close();
	}catch(Exception e){e.printStackTrace();}finally{
		if(writer!=null){
			writer.close();
		}
	}
	}

3.削除:

	private void delete(LuceneIndexVO luceneIndexVO) throws Exception {
		//  id 
		Term term = new Term(LuceneUtil.KEY_ID, luceneIndexVO.getId()+ "");
		//  
		IndexWriter writer =null;
		try{
		writer=getWriter();
		//  , Doc
		writer.deleteDocuments(term);
		writer.close();
		}catch(Exception e){e.printStackTrace();}finally{
			if(writer!=null){
				writer.close();
			}
		}
	}

同時に、バックグラウンドのインデックスの追加変更削除にはスレッドがあります.

	/***
	 *  
	 */
	private void doWork(){
		try {
			
			//do the main job
			LuceneIndexVO luceneIndexVO=getLuceneIndexVO();
			if(luceneIndexVO==null){
				try {
					Thread.sleep(LuceneUtil.SLEEP_TIME);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				return;// 
			}
			// , 
			if (luceneIndexVO.getOpt().equals(LuceneUtil.OBJ_OPT_ADD)) {
				// 
				add(luceneIndexVO);
			} else if (luceneIndexVO.getOpt().equals(LuceneUtil.OBJ_OPT_UPDATE)) {
				// 
				update(luceneIndexVO);
			} else if (luceneIndexVO.getOpt().equals(LuceneUtil.OBJ_OPT_DELETE)) {
				// 
				delete(luceneIndexVO);
			}
			
		} catch (Exception e) {
			logger.error(getSubName()+"...main job occur error:"+e.getMessage()+",detail is:
"); e.printStackTrace(); try { Thread.sleep(LuceneUtil.SLEEP_TIME); } catch (InterruptedException e1) { } } }

初期化を含める

	public void run() {
		logger.info(getSubName()+" start to run!");
		long workFlag=System.currentTimeMillis();
		//1. .
		initIndex();
		//2. lock .
		checkWorkDirectory();
		while(isRunning){
			// .
			long interval=System.currentTimeMillis()-workFlag;
			long flag=interval-LuceneUtil.ONE_MINUTE_INTERVAL;
			
			if(flag>=0){
				logger.info(getSubName()+"...working......");
				workFlag=System.currentTimeMillis();
			}
			doWork();
		}
		logger.info(getSubName()+" end to run!");
	}

関連呼び出し図:
元のアクションはlucene関連のサービスを追加します.新規、修正、削除されたオブジェクトに対して、操作が完了すると、そのオブジェクトをキューに入れ、バックグラウンドにluceneスレッドがあり、ハードディスクインデックスを同期更新する.