lucene 기반 사례 개발: 실시 간 색인 관리 클래스 IndexManager

전재 출처 를 밝 혀 주 십시오:http://blog.csdn.net/xiaojimanman/article/details/44015983
http://www.llwjy.com/blogdetail/5757ce8c007754704b563dd6a47ca1ca.html
개인 블 로그 사이트 도 성공 적 으로 구축 되 었 습 니 다. 사이트 주소: www. llwjy. com, 여러분 의 홈 페이지 에 오신 것 을 환영 합 니 다 ~
      이전 블 로그 에 서 는 실시 간 색인 실현 원리 에 대해 간단 한 소 개 를 했다. 루 셀 을 어떻게 이용 하여 색인 관 리 를 실현 하 는 지 소개 한다.
하나하나 격파 하 다
      Lucene 4.3.1 에서 실시 간 색인 을 실현 할 때 IndexWrite 와 관련 된 작업 을 Tracking IndexWriter 에 의뢰 하여 처리 해 야 합 니 다. 구체 적 인 코드 는 다음 과 같 습 니 다.
ps: 색인 을 만 드 는 방법 에 대해 서 는 더 이상 소개 하지 않 습 니 다. 이전 블 로그 나 이 블 로그 뒤의 전체 코드 를 참조 할 수 있 습 니 다.
this.trackingIndexWriter = new TrackingIndexWriter(this.indexWriter);

      색인 관리 대상 을 초기 화 합 니 다. 코드 는 다음 과 같 습 니 다.
this.nrtManager = new NRTManager(this.trackingIndexWriter, new SearcherFactory());	

      여기에 두 개의 데 몬 스 레 드 를 열 어야 합 니 다. 메모리 색인 재 읽 기 스 레 드 와 메모리 데이터 commt 스 레 드 입 니 다.메모리 색인 재 읽 기 스 레 드 가 실행 되 는 빈 도 는 실시 간 색인 시차 입 니 다. 메모리 에 있 는 데이터 가 많 지 않 기 때문에 이 지연 시간 은 보통 10 밀리초 정도 입 니 다.메모리 데이터 commt 스 레 드 는 메모리 에 있 는 데 이 터 를 디스크 에 기록 하 는 것 입 니 다. 데 이 터 를 잃 어 버 리 지 않 습 니 다. Lucene 소스 코드 를 연구 한 어린이 신발 은 commt 작업 을 하지 않 아 도 메모리 에 있 는 데 이 터 를 어느 정도 기록 할 수 있 습 니 다. 일부 데 이 터 를 디스크 에 기록 할 수 있 습 니 다. 서 비 스 를 다시 시작 하 는 것 만으로 도 데 이 터 를 잃 어 버 리 는 동시에 일련의 문 제 를 일 으 킬 수 있 습 니 다. http://bbs.csdn.net/topics/390677902 이 주소 아래 는 commt 스 레 드 가 죽은 후에 발생 하 는 일련의 문제 입 니 다. 관심 있 는 동 화 는 알 수 있 습 니 다.
      메모리 리 셋 스 레 드 는 매개 변수 시작 만 설정 하면 됩 니 다. 코드 는 다음 과 같 습 니 다.
this.nrtManagerReopenThread = new NRTManagerReopenThread(this.nrtManager, indexReopenMaxStaleSec, indexReopenMinStaleSec);
this.nrtManagerReopenThread.setName("NRTManager Reopen Thread");
this.nrtManagerReopenThread.setPriority(Math.min(Thread.currentThread().getPriority()+2, Thread.MAX_PRIORITY));
this.nrtManagerReopenThread.setDaemon(true);
this.nrtManagerReopenThread.start();

      메모리 데이터 commt 스 레 드 는 스스로 코드 를 써 서 이 스 레 드 를 시작 하면 됩 니 다. 코드 는 다음 과 같 습 니 다.
private class IndexCommitThread extends Thread{
	private boolean flag;
	public IndexCommitThread(String name){
		super(name);
	}
	
	@SuppressWarnings("deprecation")
	public void run(){
		flag = true;
		while(flag) {
			try {
				indexWriter.commit();
				if (bprint) {
					System.out.println(new Date().toLocaleString() + "\t" + IndexManagerName + "\tcommit");
				}
				TimeUnit.SECONDS.sleep(indexCommitSeconds);
			} catch (IOException e) {
				e.printStackTrace();
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}
		}
	}
}
this.indexCommitThread = new IndexCommitThread(IndexManagerName + "Index Commit Thread");
this.indexCommitThread.setDaemon(true);
this.indexCommitThread.start();

      그러면 어떻게 일반적인 색인 처럼 Indexsearcher 를 사용 합 니까?물론 NrtManager 클래스 도 관련 방법 을 제공 합 니 다. 최신 사용 가능 한 Indexsearcher 를 얻 을 수 있 습 니 다. 코드 는 다음 과 같 습 니 다.
public IndexSearcher getIndexSearcher(){
	try {
		return this.nrtManager.acquire();
	} catch (IOException e) {
		e.printStackTrace();
		return null;
	}
}

      물론 사용 한 후에 석방 하 는 것 을 잊 지 마 세 요. 코드 는 다음 과 같 습 니 다.
public void release(IndexSearcher searcher){
	try {
		nrtManager.release(searcher);
	} catch (IOException e) {
		// TODO Auto-generated catch block  
		e.printStackTrace();
	}
}

별 종 단 례 모드
      이전 블 로그 에서 저 는 색인 을 불 러 오 는 것 은 자원 을 상당히 소모 하 는 일이 라 고 여러 번 언급 했 습 니 다. 그래서 우 리 는 색인 작업 마다 색인 을 불 러 올 수 없 기 때문에 우 리 는 하나의 예 모드 로 Index Manager 류 를 실현 해 야 합 니 다.이곳 의 단일 사례 모델 은 우리 가 흔히 볼 수 있 는 단일 사례 모델 과 차이 가 있 습 니 다. 일반적인 단일 사례 모델 은 한 개의 대상 만 있 습 니 다. 이곳 의 단일 사례 모델 은 여러 개의 대상 이 있 습 니 다. 다음은 이곳 의 다른 사례 모델 을 간단하게 소개 하 겠 습 니 다.
      이전 블 로 그 를 통 해 마지막 으로 시스템 에서 색인 에 대한 설정 정 보 는 HashSet 대상 에 존재 한 다 는 것 을 알 수 있 습 니 다. 즉, 여기 서 IndexManager 류 는 몇 번 을 예화 하 느 냐 에 따라 HashSet 대상 에 달 려 있 습 니 다. 즉, 설정 파일 이 몇 번 을 예화 하 느 냐 에 따라 몇 번 을 예화 하 느 냐 에 달 려 있 습 니 다.기왕 이렇게 된 바 에 야 어떻게 단일 모드 라 고 할 수 있 겠 는가?이 곳 의 단일 예 는 색인 의 단일 예 입 니 다. 즉, 하나의 색인 은 하나의 IndexManager 대상 만 있 고 두 개의 IndexManager 대상 이 같은 색인 을 조작 하 는 상황 은 존재 하지 않 습 니 다.구체 적 인 코드 는 다음 과 같다.
/**
 * Initialization on Demand Holder    IndexManager
 */
private static class LazyLoadIndexManager {
	private static final HashMap<String, IndexManager> indexManager = new HashMap<String, IndexManager>();
	
	static {
		for (ConfigBean configBean : IndexConfig.getConfigBean()) {
			indexManager.put(configBean.getIndexName(), new IndexManager(configBean));
		}
	}
}

/**  
 *@Description: IndexManager      
 *@Author: lulei  
 *@Version: 1.1.0  
 */
private IndexManager(ConfigBean configBean){
	//...
}
public static IndexManager getIndexManager(String indexName){
	return LazyLoadIndexManager.indexManager.get(indexName);
}

      이렇게 하면 우 리 는 색인 이름 을 통 해 이 색인 의 IndexManager 대상 을 얻 을 수 있다.
여산 의 진면목
      이렇게 많이 말 했 으 니 Index Manager 의 소스 코드 를 마지막 에 붙 여 보 겠 습 니 다. 관심 있 는 동 화 는 해 보 세 요. (안에 다른 방법 이 있 습 니 다. 소개 하지 않 아 도 볼 수 있 을 거 라 고 믿 습 니 다)
 /**  
 *@Description:         
 */ 
package com.lulei.lucene.index.manager;  

import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.NRTManager;
import org.apache.lucene.search.NRTManager.TrackingIndexWriter;
import org.apache.lucene.search.NRTManagerReopenThread;
import org.apache.lucene.search.SearcherFactory;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.NIOFSDirectory;
import org.apache.lucene.util.Version;

import com.lulei.lucene.index.model.ConfigBean;
import com.lulei.lucene.index.model.IndexConfig;

public class IndexManager {

	private IndexWriter indexWriter;
	//       IndexWriter
	private TrackingIndexWriter trackingIndexWriter;
	//          
	private Analyzer analyzer;
	//      
	private NRTManager nrtManager;
	//      
	private NRTManagerReopenThread nrtManagerReopenThread;
	//        
	private IndexCommitThread indexCommitThread;
	
	//    
	private String indexPath;
	//      、      
	private double indexReopenMaxStaleSec;
	private double indexReopenMinStaleSec;
	//  commit  
	private int indexCommitSeconds;
	//   
	private String IndexManagerName;
	//commit         
	private boolean bprint = true;
	
	/**
	 * Initialization on Demand Holder    IndexManager
	 */
	private static class LazyLoadIndexManager {
		private static final HashMap<String, IndexManager> indexManager = new HashMap<String, IndexManager>();
		
		static {
			for (ConfigBean configBean : IndexConfig.getConfigBean()) {
				indexManager.put(configBean.getIndexName(), new IndexManager(configBean));
			}
		}
	}
	
	/**  
	 *@Description: IndexManager      
	 *@Author: lulei  
	 *@Version: 1.1.0  
	 */
	private IndexManager(ConfigBean configBean){
		//      
		analyzer = configBean.getAnalyzer();
		indexPath = configBean.getIndexPath();
		IndexManagerName = configBean.getIndexName();
		indexReopenMaxStaleSec = configBean.getIndexReopenMaxStaleSec();
		indexReopenMinStaleSec = configBean.getIndexReopenMinStaleSec();
		indexCommitSeconds = configBean.getIndexCommitSeconds();
		bprint = configBean.isBprint();
		String indexFile = indexPath + IndexManagerName + "/";
		//       
		IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_43, analyzer);
		indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
		Directory directory = null;
		try {
			directory = NIOFSDirectory.open(new File(indexFile));
			if (IndexWriter.isLocked(directory)){
				IndexWriter.unlock(directory);
			}
			this.indexWriter = new IndexWriter(directory, indexWriterConfig);
			this.trackingIndexWriter = new TrackingIndexWriter(this.indexWriter);
			this.nrtManager = new NRTManager(this.trackingIndexWriter, new SearcherFactory());
		} catch(IOException e){
			e.printStackTrace();
		}
		//      
		this.setThread();
	}
	/**
	 * @Author: lulei  
	 * @Description:         
	 */
	private void setThread(){
		this.nrtManagerReopenThread = new NRTManagerReopenThread(this.nrtManager, indexReopenMaxStaleSec, indexReopenMinStaleSec);
		this.nrtManagerReopenThread.setName("NRTManager Reopen Thread");
		this.nrtManagerReopenThread.setPriority(Math.min(Thread.currentThread().getPriority()+2, Thread.MAX_PRIORITY));
		this.nrtManagerReopenThread.setDaemon(true);
		this.nrtManagerReopenThread.start();
		
		this.indexCommitThread = new IndexCommitThread(IndexManagerName + "Index Commit Thread");
		this.indexCommitThread.setDaemon(true);
		this.indexCommitThread.start();
	}
	
	/**
	 * @return
	 * @Author:lulei  
	 * @Description:     commit  
	 */
	public String setCommitThread() {
		try {
			if (this.indexCommitThread.isAlive()){
				return "is alive";
			}
			this.indexCommitThread = new IndexCommitThread(IndexManagerName + "Index Commit Thread");
			this.indexCommitThread.setDaemon(true);
			this.indexCommitThread.start();
		} catch (Exception e) {
			e.printStackTrace();
			return "failed";
		}
		return "reload";
	}
	
	/**
	 *@Description:   commit   
	 *@Author: lulei  
	 *@Version: 1.1.0
	 */
	private class IndexCommitThread extends Thread{
		private boolean flag;
		public IndexCommitThread(String name){
			super(name);
		}
		
		@SuppressWarnings("deprecation")
		public void run(){
			flag = true;
			while(flag) {
				try {
					indexWriter.commit();
					if (bprint) {
						System.out.println(new Date().toLocaleString() + "\t" + IndexManagerName + "\tcommit");
					}
					TimeUnit.SECONDS.sleep(indexCommitSeconds);
				} catch (IOException e) {
					e.printStackTrace();
				} catch (InterruptedException e1) {
					e1.printStackTrace();
				}
			}
		}
	}
	
	
	/**
	 * @return IndexManager
	 * @Author: lulei  
	 * @Description:        
	 */
	public static IndexManager getIndexManager(String indexName){
		return LazyLoadIndexManager.indexManager.get(indexName);
	}
	
	/**
	 * @@Description:  IndexSearcher  
	 * @param searcher
	 */
	public void release(IndexSearcher searcher){
		try {
			nrtManager.release(searcher);
		} catch (IOException e) {
			// TODO Auto-generated catch block  
			e.printStackTrace();
		}
	}
	
	/**
	 * @return IndexSearcher
	 * @Author: lulei  
	 * @Description:   IndexSearcher  ,     ,  release      
	 */
	public IndexSearcher getIndexSearcher(){
		try {
			return this.nrtManager.acquire();
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	public NRTManager getNRTManager(){
		return this.nrtManager;
	}
	
	public IndexWriter getIndexWriter(){
		return this.indexWriter;
	}
	
	public TrackingIndexWriter getTrackingIndexWriter(){
		return this.trackingIndexWriter;
	}
	
	public Analyzer getAnalyzer(){
		return analyzer;
	}
	
	/**
	 * @return
	 * @Author: lulei  
	 * @Description:           
	 */
	public int getIndexNum(){
		return indexWriter.numDocs();
	}
}

ps: 최근 에 다른 사이트 가 블 로그 에 전 재 될 수 있 는 것 을 발 견 했 습 니 다. 위 에 소스 링크 가 없습니다. lucene 기반 사례 개발 에 대해 더 많은 것 을 보 려 면 여 기 를 클릭 하 십시오.인터넷 주소http://blog.csdn.net/xiaojimanman/article/category/2841877 혹시  www.llwjy.com

좋은 웹페이지 즐겨찾기