2014-05-12 4 views
0

Lucene.net을 사용하여 전체 텍스트 검색을 구현하는 ASP.Net MVC 5 응용 프로그램에서 작업하고 있습니다.다른 프로세스의 독자 만있는 전용 작성자 프로세스

  1. 이동 주기적으로 색인화되지 않은에 대한 데이터베이스를 확인하는 전용 프로세스 유일한 루씬 작가 : ASP.Net에서 호스팅 백그라운드 작업과 함께 potentional problems에, 나는 다음과 같은 시나리오가 가능한 지 여부를 숙고했다 인해

    행과 루씬 지수가 따라

  2. 업데이트는 ASP.NET 작업자 프로세스

내부의 독자를 유지 전혀 FSDirectory을 그 일을 사용겠습니까?

답변

0

내가 얻을 관리했습니다이 내가 프로젝트에 대한 쓴 작은 헬퍼 클래스의 도움으로 잘 작동합니다. 아래 팩토리 클래스는 임의의 수의 스레드로 단일 indexReader를 공유하고 GetCurrentReader()에서 반환 된 판독기가 인덱스 상태와 동기화되도록합니다.

class IndexReaderFactory : 
    IDisposable 
{ 
    public IndexReaderFactory(bool isReadonly) 
    { 
    this.isReadonly = isReadonly; 
    } 

    IndexReader reader; 
    readonly ReaderWriterLockSlim rwl = new ReaderWriterLockSlim(); 
    private readonly bool isReadonly; 

    /// <summary> 
    /// Returns a reader that isCurrent 
    /// </summary> 
    public IndexReader GetUpToDateReader() 
    { 
    rwl.EnterUpgradeableReadLock(); 

    try 
    { 
     if (reader == null) 
     { 
     rwl.EnterWriteLock(); 

     try 
     { 
      if (logger.IsInfoEnabled) 
      logger.Info("Creating IndexReader on directory {0}", AppSettingsBase.LucenePostIndexLocation); 

      reader = IndexReader.Open(FSDirectory.Open(AppSettingsBase.LucenePostIndexLocation), isReadonly); 
     } 

     finally 
     { 
      rwl.ExitWriteLock(); 
     } 
     } 

     else if(!reader.IsCurrent()) 
     { 
     rwl.EnterWriteLock(); 

     try 
     { 
      if (logger.IsInfoEnabled) 
      logger.Info("IndexReader is not current. Re-opening"); 

      reader = reader.Reopen(); 
     } 

     finally 
     { 
      rwl.ExitWriteLock(); 
     } 
     } 
    } 

    finally 
    { 
     rwl.ExitUpgradeableReadLock(); 
    } 

    return reader; 
    } 

    public void Dispose() 
    { 
    Dispose(true); 
    GC.SuppressFinalize(this); 
    } 

    public void Dispose(bool disposing) 
    { 
    if (disposing) 
    { 
     // get rid of managed resources 
    } 

    if(reader != null) 
     reader.Dispose(); 
    } 
} 
0

가능하다고 생각합니다. 동시에 여러 개의 IndexReader를 가질 수 있으며 잘되어야하며 다중 프로세스 잠금을위한 외부 잠금 기능 (파일 시스템 기반)도 있습니다.

IndexReader는 현재 "스냅 샷"을 만든 시간부터 검색하므로 인덱스가 변경되면 IndexReaders를 "덤프"할 수있는 방법을 찾아야합니다. 물론 모든 검색에 대해 IndexReader를 만들 수는 있지만 권장하지 않을 수 있으며 현재 인덱스에 쓰는 경우에는 실패합니다. 이러한 목적을 위해 ou는 현재 작가로부터 독자를 검색 할 수 있지만 다른 프로세스에 있기 때문에 옵션이 아닙니다.

당신은 재미뿐만 아니라이 문서를 찾을 수 있습니다 :

http://devlearnings.wordpress.com/2010/04/26/lucene-reuse-indexsearcher-rather-creating-new-everytime/

+0

색인이 현재 작성된 경우 독자를 여는 것이 실패한다고 생각하십니까? –

+0

@OliverWeichhold 글쎄, 아마도 실패하지는 않겠지 만 독자가 색인이 없거나 일관성이없는 상태가 될 수 있습니다. 나는 자물쇠가 독자들에게 어떻게 영향을 미치는지 실제로 기억하지 못한다. – jishi