我的问题是关于 Lucene .NET 2.9.2
假设我使用 更新了索引IndexWriter
,这导致调度程序开始在后台合并段。如果我Commit
在合并完成之前打电话会发生什么?被调用的线程Commit
会被阻塞并等待合并完成,还是两个线程是独立的?
答案对我的搜索实现非常重要,因为我依赖于FieldCache
性能问题,如果不Commit
等待合并完成,我可能会得到错误的 DocIds ...
更新:
我想要做的是 DocId 到 Appliciation Id 之间的映射 - 所以在使用IndexSearcher
Search 方法时我不需要获取我的应用程序 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 不适合?