首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lucene.net -将文档添加到现有索引会导致查找失败

Lucene.net -将文档添加到现有索引会导致查找失败
EN

Stack Overflow用户
提问于 2019-06-17 07:08:18
回答 1查看 481关注 0票数 2

我们是一组学生,他们使用Lucene.net对100,000个音乐指纹进行索引,并将它们与分析歌曲中的给定指纹进行匹配,以查看它们是否与我们数据库中的任何内容匹配。

由于每天都有大量的新音乐发布,我们正在尝试用新的数据更新我们的索引,通常每周大约有5-8,000个指纹。当我们将几千个条目直接添加到现有索引中时,问题就会出现,因为这会导致我们的搜索严重恶化或根本找不到。(我们对Lucene索引完全陌生)

为了解决这个问题,我们必须重新创建索引,这是一个非常长的过程(长达18小时)。我的问题是,除了重新创建整个索引之外,是否还有其他选择?我们已经考虑过使用多个索引并使用MultiReader,但这似乎只是延迟了问题?

代码语言:javascript
复制
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 ();

非常感谢您的考虑!

EN

回答 1

Stack Overflow用户

发布于 2019-06-22 20:56:41

我也是lucene.net的新手,但我注意到的一件事是,如果不在每个文档之后刷新或提交,索引的速度会快得多()。因此,如果您要将数千个新文档添加到索引中,请让lucene管理何时刷新它的内存缓冲区,并仅在添加完所有文档后才在代码中调用commit。

这确实意味着在您调用commit (隐式地刷新到磁盘)之前,您不能确保将新文档刷新到磁盘,但是索引速度会快得多,因为lucene不需要在磁盘上为随后需要合并的每个文档创建新的索引段,而是可以在内存中为每个新文档执行初始合并,直到它需要将内存缓冲区刷新到磁盘,在这种情况下,如果您愿意的话,对于那些被“预合并”的文档,只有一个新段被写入磁盘。这种方法极大地减少了数千个添加的文档对磁盘的IO,从而提高了速度。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56623245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档