2011-12-22 3 views
0

私はLucene.Netバージョン2.9.4.1を使用しています。
はここに私の検索サービスです:Lucene.Net - .csfファイルを削除するには?

public class FooSearchServiceLucene : IFooSearchService 
{ 
    private readonly Directory dir; 
    private readonly IndexWriter indexWriter; 
    private readonly IPersonRepository personRepository; 

    public PersonSearchServiceLucene(string luceneIndexDir, IFooRepository fooRepository) 
    { 
     this.fooRepository = fooRepository; 

     dir = FSDirectory.Open(new System.IO.DirectoryInfo(luceneIndexDir)); 
     indexWriter = new IndexWriter(dir, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29), 
             IndexWriter.MaxFieldLength.UNLIMITED); 
    } 
    ... 
    public void RebuildSearchIndex() 
    { 
     // delete all documents 
     indexWriter.DeleteAll(); 
     indexWriter.Commit(); 

     // create a new index 
     var items = fooRepository.GetAll(); 
     foreach (var item in items) 
     { 
      AddDocument(person); 
     } 

     indexWriter.Commit(); 
    } 
} 

私は一度に一つだけIndexWriterを持つことができますので、このFooSearchServiceLuceneは、シングルトンである、と私はNear real time search機能を使用しています。 RebuildSearchIndexメソッドを呼び出すと、すべて.delファイルが削除され、古い検索セグメントはファイルシステム上に存在し、新しい検索セグメントが作成されますか?

私のディスク容量は急速に拡大しています。 IISを再起動せずに古い.cfsファイルを削除するにはどうすればよいですか?

ご協力いただければ幸いです!

+0

はあなたにもタイトルとタグに 'IIS'を追加する必要があります。.. – Matthias

+0

しかし、私はIIS /アプリケーションプールと相互に作用することなく、これを処理したい –

+0

はい、それにもかかわらず、それがいや、それはLuceneの'に近い関連IIS – Matthias

答えて

0

すべてのドキュメントを1つのセグメントにまとめたい場合は、IndexWriter.Optimize()を呼び出す必要があります。この呼び出しには時間がかかり、多くのリソースが消費されるため、ウェブサイトのトラフィックが少ないときにのみ呼び出すようにしてください。

また、Optimize/Commitを呼び出すときにインデックスファイルにIndexSeacherを開いた場合、Luceneはこれらのファイルを削除できません。 RebuildSearchIndexメソッドでOptimize/Commitを実行する前に、Searcherを閉じる必要があります。

+0

' IndexWriter.Optimize() 'は.cfsと.cfxファイルを作成しますが、古いセグメント(.cfs)はI close 'indexWriter'。 –

+0

デフォルトのマージポリシーを使用した場合、Optimizeはすべてのセグメントを1つにマージします。その後もインデックスディレクトリに他の複合ファイルが残っていると、これらのファイルはまだどこかで使用されており、 –

+0

私はすべての検索者と読者を閉じました... .CFSファイルが削除されない理由(誰が参照を保持しているかなど)を 'Commit'メソッドで何とかデバッグできますか? –

関連する問題