lucene 기반 사례 개발: 실시 간 색인 관리 클래스 IndexManager
11550 단어 자바Lucene실시 간 인덱스실시 간 인덱스 구현
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.