【问题标题】:How to implement Lucene .Net search on Azure webrole如何在 Azure webrole 上实现 Lucene .Net 搜索
【发布时间】:2012-11-20 23:27:21
【问题描述】:
我正在使用 AzureDirectory 和 Lucene .NET 2.9.4,但我有两个问题:
- 搜索器似乎没那么快。我正在使用这些设置进行索引:
indexWriter.SetUseCompoundFile(false);
indexWriter.SetMergeFactor(1000);
索引大约是 3.5gb,它有 12.126.436 个文档。
即使索引已经在本地磁盘上,创建 indexSearcher 也需要大约 5 分钟或更长时间。索引是否太大?我尝试在两个字段上使用 MultiFieldQueryParser 执行单个术语搜索。字段上的 TermVector 已关闭
- 建议 Everywhere 只创建一个 indexSearcher 实例并在查询之间共享它(实际上创建速度很慢)但我不知道如何共享 Searcher 单例(它是执行搜索的类)在各种网络请求之间。如果我在 webrole 类上创建单例,那么如何使用该实例来执行搜索?此时,每个网络请求都会重新创建单例。
非常感谢
【问题讨论】:
标签:
azure
full-text-search
lucene.net
azure-web-roles
【解决方案1】:
我实际上已经在 AzureDirectory 中使用了 Lucene.NET 的确切版本,但效果并不好。我认为 AzureDirectory 不是为生产规模而编写的。
如果您查看 AzureDirectory 的源代码,它正在使用:
- 以旧版 Lucene 作为基础 (2.3x)
- 到处都会抛出异常(很难在生产环境中调试/捕获正确的异常)
- 它使用旧的存储 API(SDK 的 1.8 之前版本)
我最终创建了自己的专用虚拟机并使用 .net 3.0.3 Lucene.Net 库。在那个环境中像冠军一样工作,因为我不需要实现 AzureDirectory。
您应该只有一个易于使用存储队列实现的 IndexWriter。如果要限制它们写入 IndexReader 池(如 SQL 连接池),则可以拥有多个 IndexReader。我有多个运行良好,没有例外,就像使用 AzureDirectory 一样。
我的环境有点不同,有很多较小的索引....不是一个庞大的索引。
【解决方案2】:
也许this 是人们正在谈论的 AzureDirectory,也许不是——我对此进行了调整以获得更好的性能。虽然我不会声称它是生产级且坚如磐石,但它可能会帮助您超越您当前使用的 AzureDirectory。
希望对你有帮助,