2008-11-07 5 views
2

Lucene.NET에 문제가 있습니다. 인덱스 중에 '경로 세그먼트에 대한 액세스가 거부되었습니다'라는 오류 메시지가 나타납니다. 또는 '삭제할 수있는 경로에 대한 액세스가 거부되었습니다.' 나는 결국 'Everyone'에게 인덱스 디렉토리에 대한 완전한 보안 권한을 주었지만 여전히 문제가있었습니다.Lucene.NET -> 세그먼트에 대한 액세스가 거부되었습니다.

색인 실행 중에 lucene이 세그먼트 파일의 이름을 'segments.new'로 바꾸고 을 찾았다면이 오류가 발생합니다. 나는 이름이 바뀐 후에 일부 프로세스가 여전히 이전 세그먼트 파일에서 읽으려고 시도하는 것 같아? 나는 이것이 일어나는 이유에 대한 단서가 없으며,이를 어떻게 해결할 수 있을지 모른다. 이상하게도 내 공동 개발자는 문제없이 컴퓨터에서 색인을 실행할 수 있습니다.

Lucene.Net.Index.IndexModifier.AddDocument (Document)에서 오류가 발생합니다.

어떤 아이디어라도 높이 평가할 수 있습니다.

+0

예제 코드가 유용 할 것입니다. – Badaro

답변

1

귀하의 IndexModifier가 Searcher와 (과) 경쟁하고있는 것으로 의심됩니다.

Lucene.Net을 내 bug tracking 앱에 사용하는 방법은 다음과 같습니다. BugTracker.NET, 제대로 작동하는 것 같습니다.

앱 시작시 색인을 만듭니다.

검색자를 생성하고 색인을 각 검색과 함께 다시로드하지 않도록 보관합니다. 모든 스레드는 동일한 검색자를 공유합니다. 검색자는 검색 할 때 잠금을 잡고 검색 한 다음 잠금을 해제하여 다른 스레드가 검색 할 수 있도록합니다. Lucene.NET이 빠르며 버그 추적 시스템이 바쁘지 않기 때문에 내 응용 프로그램에서 단일 파일로 검색 할 수 있습니다.

한편 데이터 변경이있을 때 인덱스를 업데이트하는 IndexWriter가 있습니다. 조금만 바뀌어 작업이 빨라졌습니다. 실행해야 할 때 동일한 잠금을 잡고 검색자를 삭제하고 색인을 업데이트하며 검색자를 다시 만듭니다. 새로운 검색자는 색인의 다음 업데이트 때까지 주변에 머물러 있습니다. 검색자는 항상 최신 색인으로 작업하고 있습니다.

BugTracker.NET 소스를 가져 와서 my_lucene.cs 및 search_text.aspx 파일을 볼 수 있습니다. 이 두 파일에 모두 포함되어 있으며 많은 코드가 없습니다.

0

이 문제는 세그먼트 (.new) 파일을 잠그는 온라인 바이러스 검색 프로그램 때문에 발생합니다. 이 문제를 해결하기 위해 맞춤 Lucene 디렉토리 구현을 작성해야했습니다.

+0

이 솔루션은 어딘가에서 공유됩니까 ?? ... 그냥 궁금해서 :-) – schoetbi

0

나는 이것에 관해 읽었다. 그러나 바이러스 스캐너가 작동하지 않습니다. 또한 색인 디렉토리에 대한 Vista 검색 색인을 비활성화하고 작업 관리자에서 검색 색인 프로세스를 종료하여 다른 프로세스가 파일을 잠그지 않도록했습니다. 불행히도, 아무 소용이 없습니다. 더욱이, 문제가 더 많은 것 '세그먼트'파일에 액세스하려고 시도 (이후 lucene 그것을 segments.new로 이름을 바꾼)입니다. 나는 그들이 같은 문제인지 잘 모르겠다 ...

1

나는 해결책을 찾았다 .. 적어도 나를 위해 일한 것 같아 .. "segments.new"문제를 테스트하고 있었고 코드를 가지고 .. 루프에서 볼 수 있듯이 수천 개의 lucene 문서 (6000)를 만들었습니다 .. 약 1360 개의 문서에서 blablabla의 이름을 바꿀 수 없다는 오류가 나타납니다 .. 코드는 기본적으로 C#으로 작성되었습니다. 당신은 단지 try catch를 삽입해야한다. (루프 내에서) 에러가 발생하면 에러가 나올 것이다. int loop nunmber (y)를 하나 씩 (y = y - 1) 뺀다.

// ----------------- 문제 ------------------------ -------------

(int y = 0; y < 6000; y ++) { Document doc = new Document();

doc.Add(new Field("URL", "C:/Users/blabla/(convert-csharp)/IMssg", Field.Store.YES, Field.Index.TOKENIZED)); 

writer.AddDocument(doc); 

}

// -------------------- 솔루션 ------------- ---------------------------

IndexWriter writer = new IndexWriter ("C :/Users/blabla/(convert-csharp)/IMssg ", 새로운 StandardAnalyzer(), false); 위한

(INT Y = 0, Y < 6000; Y ++) { 시도 {

Document doc = new Document(); 

doc.Add(new Field("URL", "C:/Users/blabla/(convert-csharp)/IMssg", Field.Store.YES, Field.Index.TOKENIZED)); 

writer.AddDocument(doc); 

    } 
    catch (Exception t) 
    { 

    y = (y < 0) ? 0 : y - 1; 

    string gfff = t.Message.ToString(); 

    } 

}

writer.Close();

임 아닌 영어 사람에 의해 일부 단어 ... 에 오류가 지금 안부

1

내가 두 번째 임마의 솔루션을 immanouel 놈의 경우 너무 메신저 sory. 나는이 문제도 가지고 있었다.

int attemptNo = 0; 
while (attemptNo < 2) 
{ 
    try 
    { 
     writer.AddDocument(doc); 
     break; 
    } 
    catch (Exception e) 
    { 
     String ErrMsg = String.Format("{0} ({1}): While adding Document {2}/{3}, caught {4}", DateTime.Now, attemptNo, doc.GetField("kanji").StringValue(), doc.GetField("kana").StringValue(), e.Message); 
     attemptNo++; 
     System.Threading.Thread.Sleep(30); 
     Application.Current.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)delegate() 
     { 
      ViewModel.Log.Add(ErrMsg); 
     }); 
    } 

는 참조 : http://issues.apache.org/jira/browse/LUCENE-665 :

"문제의 요점은 다음과 같습니다 나를 위해 수정 IndexWriter.AddDocument (문서) 주변의 시도/캐치를 넣어했다 Windows에서, 당신은 가끔 간헐적 볼 세그먼트 이름을 세그먼트로 변경하거나 세그먼트를 deletable.new 등으로 바꿀 수 있습니다. Lucene은 일반적으로 파일을 먼저 에 X.new에 쓴 다음 X의 이름을 바꿉니다.

관련 문제