实施大规模搜索应用程序

时间:2009-08-14 19:11:30

标签: sql sql-server search keyword

我们有一个托管近10000个域的电子邮件服务,以便将邮件标题存储在SQL Server数据库中。

我需要实现一个应用程序来搜索邮件正文中的关键字。消息作为文件存储在NAS存储系统上。

作为一个概念证明,我已经实现了一个基于SQL服务器的搜索系统,我将解析消息并将所有单词与memberid和messageid一起存储在数据库表中。该数据库位于与头数据库不同的服务器上。

该系统的问题在于,我在一个域上处理消息后最终得到了一个包含6亿行的表。显然,这不是一个可扩展的解决方案。

由于标头存储在SQL Server表中,因此我需要将搜索应用程序中的messageID连接到标头表,以显示包含搜索关键字的消息。

有关更好的架构的任何建议吗?使用SQL服务器的更好的替代方案?我们每天收到超过2000万封邮件。 我们是一家在服务器,维护等方面资源有限的小公司。

由于

8 个答案:

答案 0 :(得分:4)

看看Hadoop。它是完整的“map-reduce”框架,用于处理受Google启发的大型数据集。它认为(但我可能错了)Rackspace正在使用它来搜索客户的电子邮件。

答案 1 :(得分:3)

lucene.net会对你有所帮助,但无论你如何处理这个问题,都会有很多工作要做。

答案 2 :(得分:2)

考虑不使用SQL。它没有帮助。

GREP和其他用于搜索标题文本的平面文件技术更快,更简单。

答案 3 :(得分:1)

您还可以查看可能对您有用的java lucene内容。作为分布式lucene索引的Katta和可以使用rsync进行索引同步的Solr都可能有用。虽然我不认为要么非常优雅,但在开始实际开发之前,通常最好使用已经构建并已知的工作。如果不了解更多细节,很难提出更具体的建议。

答案 4 :(得分:1)

如果您可以分解您的6亿行,请查看数据库分片。所有行的任何查询都会很慢。至少你可以通过语言分手。如果他们都是英语,那么,找到一些方法来分割基于常见搜索有意义的数据。我只是在这里猜测,但也许域名可以通过TLD(.com,.net,.org等)进行分组。

对于全文搜索,比较SQL Server与Lucene.NET vs cLucene vs MySQL vs PostgreSQL。注意如果您不需要对结果进行排名,全文搜索会更快。如果数据库仍然很慢,请查看性能调优,如果失败,请查看基于Linux的数据库。

http://incubator.apache.org/lucene.net/

http://sourceforge.net/projects/clucene/

答案 5 :(得分:0)

我想知道BigTable(http://en.wikipedia.org/wiki/BigTable)是否会搜索。

答案 6 :(得分:0)

查看SQL Server全文搜索服务/功能。我自己没有使用它,但我曾经读过Stack Overflow使用它。

答案 7 :(得分:0)

三种解决方案:

  1. 使用已经存在的文本搜索引擎(lucene是最多提到的,还有几个)
    • 将整个邮件存储在SQL数据库中,并使用包含的全文搜索(目前大多数数据库都有它)。
    • 不要为每个单词出现创建新记录,只需将新值添加到单词记录中的大字段即可。如果不对此表使用SQL,则更好的方法是使用键值存储,其中键是单词,值是出现的列表。查看一些Inverted Index参考书目的灵感
  2. 但说实话,我认为唯一合理的方法是#1