2012-02-27 4 views
2

Lucene .Net 2.9.2を使用してインデックスを作成しています。多くのインデックス作成の後、インデックスには多くのセグメントと削除されたドキュメントがあるため、IndexWriterでOptimize(numSegmets)を呼び出しています。Lucene .Net最適化プロセス

インデックスのセグメント数は実際にnumSegmetsの値に縮小されますが、それでも削除されています...削除したドキュメントもすべて最適化する必要がありますか?

私の質問は

編集...これはLuceneの作品または多分私はいくつかのバグを持っているかである場合ので、私は知っている可能性が非常に重要である:ここ は私のコードスニペットです:

IndexWriter writer = new IndexWriter(/*open writer from index directroy*/); 
writer.Optimize(5); 
writer.Commit(); 

bool hasDeletions = writer.HasDeletions(); 

hasDeletionsあなたがの最大数としてを提供しない限り、私はそれが偽だろう期待していた一方でが、本当です...

+0

コミットも実行しますか?あなたのコードを投稿してください。 – jishi

答えて

5

欠失は残ることができますセグメント。

しかし、これについて心配するべきではありません。それは恐ろしく非効率的で、非常にまれに正当化されるようIndexWriter#optimize in Lucene 3.5

のドキュメントを引用するには、この方法では、廃止されました。 Luceneのマルチセグメント検索のパフォーマンスは時間とともに改善され、デフォルトのTieredMergePolicyは削除されたセグメントを対象とするようになりました。

+0

しかし、古いバージョンでも同じですか?私が知っている限り、最後の.NETバージョンは2.9.4です –

+0

おそらくLucene(Java)3ほど真実ではありません。5、それはLucene.netがその方向にも向かうことを意味します。すべての削除を削除したい場合は、引き続き 'writer.optimize(1)'を呼び出すことができます – jpountz

2

最適化ではセグメントがマージされ、セグメントマージでは、それぞれにリストされている削除が削除されます。完全な最適化を行わないと、セグメントがマージ/リビルドされないため、削除が残る可能性があります。

これは、削除を削除するために完全な最適化を行う必要はありません。

IndexWriter writer = GetIndexWriter(); 
// delete some stuff 
writer.ExpungeDeletes(); 

完全に最適化することなく、削除したドキュメントをインデックスから削除します。一般に、最適化よりも時間がかかりませんが、MergePolicyに依存しますが、それでもすべてのセグメントを結合する可能性があります(デフォルトではではありません。はこれを行います)。

1

インデックス全体を削除しているようですか?

私はLucene.NETを初めて使っています - しかし、私はそれを配線して、すべてが素晴らしいようです! テストデータを追加し、アイテムを削除してから、上記のように(1)とExpungeDeletes()を最適化しようとしました...

私はこれにどのようにアプローチしても、 - インデックス全体を削除するだけですか?私はなぜこれがインデックス全体を削除します見当がつかない

public void Optimize() 
{ 
    analyzer = new StandardAnalyzer(Version.LUCENE_30); 
    using (var writer = new IndexWriter(_directory, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED)) 
    { 
     analyzer.Close(); 
     //writer.Optimize(1); 
     writer.ExpungeDeletes(); 
     writer.Dispose(); 
    } 
} 

私のコードは、この(オンラインサンプルからそれを得た)のように見えますか?