0

我无法理解 Lucene 的复杂性。任何帮助,将不胜感激。

我们使用 Windows Azure blob 来存储我们的 Lucene 索引,其中包含 Lucene.Net 和 AzureDirectory。WorkerRole 包含唯一的 IndexWriter,它每天添加 20,000 条或更多条记录,并更改少量(少于 100 条)现有文档。另一个盒子上的 WebRole 设置为获取索引的两个快照(到另一个 AzureDirectory),在两者之间交替,并告诉 WebService 在哪个目录可用时使用它。

WebService 有两个 IndexSearcher 交替,在下一个快照准备好时重新加载——一个 IndexSearcher 应该一次处理所有客户端请求(直到新的快照准备好)。IndexSearcher 有时需要很长时间(几分钟)才能实例化,而有时它非常快(几秒钟)。由于目录已经在磁盘上物理上(在这个阶段不使用 blob),我们预计它是一个快速操作,所以这是一个令人困惑的点。

我们目前有大约 800 万条记录。Lucene 搜索曾经非常快(很棒),但现在非常慢。为了改善这一点,我们开始了IndexWriter。我们备份后每天优化一次索引——网上一些资源表明经常变化的索引不需要优化,但其他资源表明需要优化,所以我们不确定。

最大的问题是,每当我们的网站流量超过单个用户时,Lucene 搜索就会超时。我们试图找出 IndexSearcher 对象是否存在瓶颈。它应该是线程安全的,但似乎有东西阻塞了请求,因此一次只执行一次搜索。该框是一个 Azure VM,设置为中等大小,因此它有大量可用资源。

感谢您提供的任何见解。显然,如果您还有其他问题,我可以提供更多详细信息,但我认为这是一个好的开始。

4

1 回答 1

0

我有更大的索引并且没有遇到这些问题(约 1 亿条记录)。

  • 如果可以的话,将索引放入内存(800 万条记录听起来应该适合内存,具体取决于分析字段的数量等)。您可以使用 RamDirectory 作为缓存目录
  • IndexSearcher 是线程安全的,应该可以重复使用,但我不确定这是否是现实。在 Lucene 3.5(Java 版本)中,它们有一个 SearcherManager 类,可以为您管理多个线程。 http://java.dzone.com/news/lucenes-searchermanager

  • 还有一篇非 Lucene 帖子,如果您使用的是超大型虚拟机,请确保您正在利用所有内核。特别是如果你有一个 Web API/ASP.NET 前端,这些调用都应该是异步的。

于 2013-08-18T15:15:52.947 回答