2016-07-30 3 views
2

lucene.net을 사용하여 PDF 파일을 인덱싱하고 있습니다. 약 15000 pdfs에 40 분, 색인 생성 시간이 내 폴더에서 pdf 파일 증가와 함께 증가합니다.Lucene.net 인덱싱 속도를 향상시킬 수있는 방법

  • 어떻게 lucene.net에서 색인 생성 속도를 향상시킬 수 있습니까?
  • 빠른 인덱싱 성능을 가진 다른 인덱싱 서비스가 있습니까?

최신 버전의 lucene.net 색인 생성 (Lucene.net 3.0.3)을 사용하고 있습니다.

다음은 색인 생성을위한 코드입니다.

public void refreshIndexes() 
     { 
      // Create Index Writer 
      string strIndexDir = @"E:\LuceneTest\index"; 
      IndexWriter writer = new IndexWriter(Lucene.Net.Store.FSDirectory.Open(new System.IO.DirectoryInfo(strIndexDir)), new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29), true, IndexWriter.MaxFieldLength.UNLIMITED); 

      // Find all files in root folder create index on them 
      List<string> lstFiles = searchFiles(@"E:\LuceneTest\PDFs"); 
      foreach (string strFile in lstFiles) 
      { 
       Document doc = new Document(); 
       string FileName = System.IO.Path.GetFileNameWithoutExtension(strFile); 
       string Text = ExtractTextFromPdf(strFile); 
       string Path = strFile; 
       string ModifiedDate = Convert.ToString(File.GetLastWriteTime(strFile)); 
       string DocumentType = string.Empty; 
       string Vault = string.Empty; 

       string headerText = Text.Substring(0, Text.Length < 150 ? Text.Length : 150); 
       foreach (var docs in ltDocumentTypes) 
       { 
        if (headerText.ToUpper().Contains(docs.searchText.ToUpper())) 
        { 
         DocumentType = docs.DocumentType; 
         Vault = docs.VaultName; ; 
        } 
       } 

       if (string.IsNullOrEmpty(DocumentType)) 
       { 
        DocumentType = "Default"; 
        Vault = "Default"; 
       } 

       doc.Add(new Field("filename", FileName, Field.Store.YES, Field.Index.ANALYZED)); 
       doc.Add(new Field("text", Text, Field.Store.YES, Field.Index.ANALYZED)); 
       doc.Add(new Field("path", Path, Field.Store.YES, Field.Index.NOT_ANALYZED)); 
       doc.Add(new Field("modifieddate", ModifiedDate, Field.Store.YES, Field.Index.ANALYZED)); 
       doc.Add(new Field("documenttype", DocumentType, Field.Store.YES, Field.Index.ANALYZED)); 
       doc.Add(new Field("vault", Vault, Field.Store.YES, Field.Index.ANALYZED)); 

       writer.AddDocument(doc); 
      } 
      writer.Optimize(); 
      writer.Dispose(); 
     } 
+0

정말'writer.Optimize()'를 호출해야합니까? 'writer.Commit()'충분하지 않겠습니까? – sisve

+0

@SimonSvensson 답장을 보내 주셔서 감사합니다. Optimize()가 필요하지 않습니다. commit()에 의해 시도되었지만 성능이 향상되지 않았습니다. – Munavvar

+1

@Munavvar, 변경 제안을하기 전에 관련 방법에 대한 벤치 마크를 추가 했습니까? 나는 특히 searchFiles와 ExtractTextFromPdf 메소드에 관심이있다. 난 당신의 코드가 괜찮아 보이는 (분석해서는 안되는 날짜를 제외하고) 후자의 문제라고 생각한다. 또한 PDF의 크기는 무엇입니까? 인덱스 및 분석을 관련 문자 수로 제한 할 수 있습니다. – AR1

답변

0

색인 생성 부분은 괜찮습니다. IndexWriter는 스레드 세이프이므로 Parallel.Foreach (MaxConcurrency를 코어 수로 설정하고이 값으로 재생)를 사용하면 멀티 코어 시스템을 사용하는 경우 도움이 될 것입니다.

하지만 당신은 GC를 문서 유형 감지 부분으로 미칠 수 있습니다. 모든 ToUpper()는 고통 스럽습니다.

  • lstFiles 루프 바깥 쪽. 그것이 일치 "휴식"을 발견하면 다른 문자열

    string headerTestUpper = headerText.ToUpper(); 
    
  • 을 만들 대문자의 문서 유형 루프의

    var upperDocTypes = ltDocumentTypes.Select(x=>x.searchText.ToUpper()).ToList(); 
    
  • 외부 ltDocumentTypes .searchText의 복사본을 생성합니다. 매치를 찾았 으면 루프를 빠져 나와 다음 반복을 모두 막습니다. (즉, 당신에게 차이를 만드는 경우) 당신은 마지막 경기 인 반면 물론 이것은

    string headerText = Text.Substring(0, Text.Length < 150 ? Text.Length : 150); 
    foreach (var searchText in upperDocTypes) 
    { 
        if (headerTextUpper.Contains(searchText)) 
        { 
         DocumentType = docs.DocumentType; 
         Vault = docs.VaultName; 
         break; 
        } 
    } 
    

이 ltDocumentTypes의 크기에 따라이 당신에게 많은 향상을 제공하지 않을 수 있습니다 첫 경기를 의미한다.

내가 가장 비싼 부분은 ExtractTextFromPdf 일 것입니다. 프로파일 러를 통해 이것을 실행하거나 StopWatches가있는 계측기를 사용하면 비용이 어느 곳에 있는지 알 수 있습니다.