0

我的问题是关于 Lucene .NET 2.9.2

假设我使用 更新了索引IndexWriter,这导致调度程序开始在后台合并段。如果我Commit在合并完成之前打电话会发生什么?被调用的线程Commit会被阻塞并等待合并完成,还是两个线程是独立的?

答案对我的搜索实现非常重要,因为我依赖于FieldCache性能问题,如果不Commit等待合并完成,我可能会得到错误的 DocIds ...

更新:

我想要做的是 DocId 到 Appliciation Id 之间的映射 - 所以在使用IndexSearcherSearch 方法时我不需要获取我的应用程序 Id 的存储值。所以我试图在索引期间构建映射,将该映射保存到二进制文件中 - 并在我的搜索中 - 将该文件加载到数组中(内存中......)。所以文件版本必须与IndexReader(希望很清楚......)

例如:(索引过程代码)

IndexWriter writer = //initialize writer

//modify index using the writer add\delete\update doc methods...

//get updated reader to the index
IndexReader r1= wrtier.GetReader();

//read all values for all documents for specific field name.

long[] ids = FieldCache_Fields.DEFAULT.GetLongs(r1, "ID");

//serialize the array to a file (code not provided)

Dictionary<string,string> metaData = new Dictionary<string,string>();
metaData.Add("FileName", /*full path to the serialized file*/);
writer.Commit(metaData);

(搜索者进程代码)

IndexReader r2 = //IndexRead.Open...
Dictionary<string,string> metaData = r2.GetCommitUserData()

string fullPathToFile = metaData["FileName"];  //get the file name that was serialized

//load the array from the file (=deserialize file)
long[] ids = //load from file

//now I can convert internal DocId to my Application Id, and save time instead of fetching data from the stored field (which takes more time...)

基本上我的问题是:假设没有对索引进行其他修改,是否有可能两个读者 r1 和 r2 的 DocId 不适合?

4

1 回答 1

1

后台合并不会阻止您的提交。

但我不明白你的FieldCache问题:IndexReaders 是不可变的,fieldcache 实例永远不会变得无效..

于 2012-10-28T17:33:10.293 回答