对当前已在Lucene中合并的索引调用Commit
我的问题被认为是Lucene.NET2.9.2 假设我使用对当前已在Lucene中合并的索引调用Commit,lucene,Lucene,我的问题被认为是Lucene.NET2.9.2 假设我使用IndexWriter更新了一个索引,这导致调度程序开始在后台合并段。如果在合并完成之前调用Commit,会发生什么?调用Commit的线程将被阻止并等待合并完成,还是两个线程是独立的 答案对我的搜索实现非常重要,因为我依赖于字段缓存来解决性能问题,如果提交不会等待合并完成,我可能会得到错误的文档ID 更新: 我试图做的是DocId到Appliciation Id之间的映射,所以在使用indexsearch搜索方法时,我不需要获取应用程序
IndexWriter
更新了一个索引,这导致调度程序开始在后台合并段。如果在合并完成之前调用Commit
,会发生什么?调用Commit
的线程将被阻止并等待合并完成,还是两个线程是独立的
答案对我的搜索实现非常重要,因为我依赖于字段缓存
来解决性能问题,如果提交
不会等待合并完成,我可能会得到错误的文档ID
更新:
我试图做的是DocId到Appliciation Id之间的映射,所以在使用indexsearch
搜索方法时,我不需要获取应用程序Id的存储值。
因此,我尝试在索引期间构建映射,将该映射保存到一个二进制文件,并在搜索中将该文件加载到一个数组中(内存中…)。因此,文件版本必须与IndexReader
一致(希望清楚…)
例如:
(索引过程代码)
IndexWriter-writer=//初始化writer
//使用writer add\delete\update doc方法修改索引。。。
//获取索引的更新读取器
IndexReader r1=wrtier.GetReader();
//读取特定字段名的所有文档的所有值。
long[]ids=FieldCache_Fields.DEFAULT.GetLongs(r1,“ID”);
//将数组序列化为文件(未提供代码)
字典元数据=新字典();
添加(“文件名”,序列化文件的完整路径*/);
提交(元数据);
(搜索程序代码)
IndexReader r2=//IndexRead.Open。。。
字典元数据=r2.GetCommitUserData()
字符串fullPathToFile=元数据[“文件名”]//获取已序列化的文件名
//从文件加载数组(=反序列化文件)
long[]id=//从文件加载
//现在,我可以将内部DocId转换为我的应用程序Id,并节省时间,而不是从存储字段获取数据(这需要更多时间…)
基本上,我的问题是:假设没有对索引进行其他修改,那么两个阅读器r1和r2的docId是否有可能不合适?后台合并不会阻止您的提交
但是我不理解你的
FieldCache
问题:IndexReader
s是不可变的,FieldCache实例永远不会失效。你使用的是什么版本的Lucene?谢谢你的回复。你说得对,我对这个问题还不够清楚。我用我的目标更新了我的帖子,希望它更清晰一点。我不明白你为什么不直接使用字段缓存生成字段缓存非常耗时-对于包含5M文档的索引,大约12秒。你是否尝试过使用每个段的字段缓存?看起来您真正需要的是DocValues(在Lucene Java 4.0中提供),不知道Lucene.NET的状态是什么。
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...)