2012-01-31 17 views
1

、私は応答なしとLuceneのインデックスAPIに関するいくつかの質問で自分自身を発見した: 最初の1が次のスニペットに関連している:LuceneのIndexWriterの明確化

IndexWriter writer = //open an index for writings. 
// ... do some heavy updates (inserts and deletes) to the index using 'writer' 

IndexReader reader = writer.GetReader(); 
long[] idsArray = Field_Cache_Fields.DEFAULT.GetLongs(reader, "ID_Field"); 
//under the assumption that ALL indexed documents contain field with the name "ID_Field". 

がそれです私が得た読者は、LuceneのAPIによって約束されていますが、コミットされていないインデックスを更新しても常に更新されますか?ちょうど私の答えは明確であることを確認しますWONTリーダーと追加されたすべてのドキュメントで見られるすべての削除されたドキュメントは次のようになります。..

2番目の質問は、次のスニペットに関連している:

IndexWriter writer = //open an index for writing, but dont change a thing - just commit meta data. 
writer.Commit["Hello"] = "World"; 
writer.Commit(); 

が、それは約束されてのメタデータはインデックスにコミットされますが、実際にインデックスを変更することなくメタデータを開いたのですか?質問の両方で

私はAPIによって意味されたかを知ることが幸せになります、また、いくつかのいずれかの問題について知っている場合(バグ?)2.9.2

おかげでみんなのLucene .NETとの具体的な!

+0

私は最初の質問はこの質問に答えていると思います:http://stackoverflow.com/questions/5420566/lucene-net-writing-reading-synchronization。 Reopen()を呼び出さない限り、基本的にインデックスの変更は表示されません。 – goalie7960

+0

はい私は間違った質問を読んだと思う。 GetReader()を呼び出した後に索引を変更すると、索引の最新バージョンは取得されません。 – goalie7960

答えて

1

最初の質問:はい

ドキュメントから:

エキスパート:インデックスへのすべてのコミットだけでなく、非コミットの変更をカバーし、読み取り専用リーダーを返します。これにより、「ほぼリアルタイム」の検索が可能になります。そのため、IndexWriterセッション中に行われた変更を、ライターを閉じずに#commitを呼び出すことなく、迅速に検索できるようになります。 これは機能的には{#commit}を呼び出すことと同じで、次にIndexReader#openを使用して新しいリーダーを開くことに注意してください。しかし、潜在的に高価な#コミットを避けるため、この方法の時間はより短くなければなりません。