我们是一组学生,他们使用Lucene.net对100,000个音乐指纹进行索引,并将它们与分析歌曲中的给定指纹进行匹配,以查看它们是否与我们数据库中的任何内容匹配。
由于每天都有大量的新音乐发布,我们正在尝试用新的数据更新我们的索引,通常每周大约有5-8,000个指纹。当我们将几千个条目直接添加到现有索引中时,问题就会出现,因为这会导致我们的搜索严重恶化或根本找不到。(我们对Lucene索引完全陌生)
为了解决这个问题,我们必须重新创建索引,这是一个非常长的过程(长达18小时)。我的问题是,除了重新创建整个索引之外,是否还有其他选择?我们已经考虑过使用多个索引并使用MultiReader,但这似乎只是延迟了问题?
Lucene.Net.Store.Directory directory = FSDirectory.Open (new System.IO.DirectoryInfo (luceneIndexPath));
IndexWriter iw = null;
int fingerCount = 0;
try {
iw = new IndexWriter (directory, new StandardAnalyzer (Lucene.Net.Util.Version.LUCENE_30), false, IndexWriter.MaxFieldLength.UNLIMITED);
iw.UseCompoundFile = false;
iw.SetSimilarity (new CDR.Indexer.DefaultSimilarityExtended ());
iw.MergeFactor = 10; // default = 10
iw.SetRAMBufferSizeMB (512 * 3);
Document doc = new Document ();
doc.Add (new Field ("FINGERID", "", Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.Add (new Field ("SUBFINGER", "", Field.Store.NO, Field.Index.ANALYZED));
}
iw.AddDocument (doc);
iw.commit ();
iw.dispose ();非常感谢您的考虑!
发布于 2019-06-22 20:56:41
我也是lucene.net的新手,但我注意到的一件事是,如果不在每个文档之后刷新或提交,索引的速度会快得多()。因此,如果您要将数千个新文档添加到索引中,请让lucene管理何时刷新它的内存缓冲区,并仅在添加完所有文档后才在代码中调用commit。
这确实意味着在您调用commit (隐式地刷新到磁盘)之前,您不能确保将新文档刷新到磁盘,但是索引速度会快得多,因为lucene不需要在磁盘上为随后需要合并的每个文档创建新的索引段,而是可以在内存中为每个新文档执行初始合并,直到它需要将内存缓冲区刷新到磁盘,在这种情况下,如果您愿意的话,对于那些被“预合并”的文档,只有一个新段被写入磁盘。这种方法极大地减少了数千个添加的文档对磁盘的IO,从而提高了速度。
https://stackoverflow.com/questions/56623245
复制相似问题