通过AzureDirectory进行Lucene搜索很慢

时间:2013-07-19 13:30:25

标签: lucene.net azure-storage-blobs azure-web-roles lucene

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

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

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

我们目前的记录大约有800万条。 Lucene搜索曾经如此之快(很棒),但现在它很慢。为了尝试改进这一点,我们已经开始使用IndexWriter.Optimize索引每天一次备​​份 - 一些在线资源表明经常更改索引不需要Optimize,但其他资源表明需要优化,所以我们不确定。

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

感谢您提供的任何见解。显然,如果您有任何进一步的问题,我可以提供更多细节,但我认为这是一个良好的开端。

1 个答案:

答案 0 :(得分:0)

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

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

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