3000万个不同的短语,而不是文档,从一个单词到10个单词的句子,我需要支持单词/短语搜索。基本上是什么包含(词组,“'书'或'堆栈溢出'”)提供。
我有一个SQL Server 2005实例(32位,4个proc,4gb)与几个全文目录相对应,并且对于具有高基数的单词搜索,性能很差。
我想加快速度,也许有人可以提供指导 -
1)升级到2008 iFTS,64位。 Sql Server 2005 FTS的Windows服务永远不会超过50mb。根据我收集的内容,它使用文件系统缓存来查找目录索引。我在磁盘上填充的目录只有大约300mb,所以为什么这些都不能在内存中呢?可能是iFTS的新内存架构,这是sqlserver进程帮助的一部分吗?
2)将目录横向扩展到多个服务器。对链接的FTS服务器的查询是否会并行运行?
3)因为我在这里搜索短语而不是文档,所以Sql Server的全文搜索可能不是答案。 Lucene.NET?将目录索引放在ram驱动器上?
答案 0 :(得分:2)
Lucene.Net可以为这种应用程序提供非常高的性能以及非常简单的API。版本2.3.2即将完成,与2.1版本相比,性能提升了。虽然将Lucene索引放在RAMDirectory(Lucene的基于内存的索引结构)中会提供更好的性能,但即使使用FSDirectory(基于磁盘的索引),我们也能看到很好的结果。
答案 1 :(得分:1)
我有点惊讶FTS在这种负载下吱吱作响。但是,如果证明是这种情况,那么经典方法(Gary Kildall开发它用于搜索CD!)将使用反转索引。我已经在一系列应用程序中使用了这种技术很长一段时间。它通常被称为“倒置”或“倒置”索引技术。 (见http://en.wikipedia.org/wiki/Search_engine_indexing#Inverted_indices)。该技术可以很好地扩展,我测试了它可以索引多达800万个文档。即使在搜索800万个文档时,如果索引正确,它也会在三秒内获得结果。通常它比这快得多。
我使用Inversion索引获取(通过TOP x的可承受数量)可能候选者的池,然后用正则表达式对这些进行强力搜索。它运作得很好。
答案 2 :(得分:0)
作为开箱即用的解决方案,我更倾向于使用“Microsoft Office SharePoint Server”在文档内容中进行索引和搜索。 如果您想编写自己的索引和搜索服务,可以选择Lucene.Net库。使用Lucene.Net编写自己的全文搜索服务将为您提供所需的所有灵活性(是的,如果您愿意,可以将索引存储在外部存储上)。
答案 3 :(得分:0)
看看Apache Solr。它是一个使用HTTP接口包装Lucene的搜索服务器。您的每个短语都将映射到Solr文档。 Solr的30M文档并不多,因为您的文档非常短。最终的性能还取决于您需要多少查询/秒。