Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 实现大规模搜索应用程序_Sql_Sql Server_Search_Keyword - Fatal编程技术网

Sql 实现大规模搜索应用程序

Sql 实现大规模搜索应用程序,sql,sql-server,search,keyword,Sql,Sql Server,Search,Keyword,我们有一个电子邮件服务,拥有近10000个域,这样我们就可以将邮件的标题存储在SQL Server数据库中 我需要实现一个应用程序,将搜索关键字的消息体。消息作为文件存储在NAS存储系统上 作为概念证明,我已经实现了一个基于SQL server的搜索系统,我将解析消息并将所有单词与memberid和messageid一起存储在数据库表中。该数据库位于headers数据库的单独服务器上 该系统的问题是,在只处理一个域上的消息之后,我得到了一个有6亿行的表。显然,这不是一个非常可扩展的解决方案 由于

我们有一个电子邮件服务,拥有近10000个域,这样我们就可以将邮件的标题存储在SQL Server数据库中

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

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

该系统的问题是,在只处理一个域上的消息之后,我得到了一个有6亿行的表。显然,这不是一个非常可扩展的解决方案

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

对更好的架构有什么建议吗?除了使用SQL server,还有更好的选择吗?我们每天收到超过2000万条信息。 我们是一家小型公司,在服务器、维护等方面资源有限


谢谢

会给你很多帮助,但不管你怎么做,都会有很多工作要做

考虑不为此使用SQL。这没用


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

您还可以查看可能对您有用的javalucene资料。这两种方法都是分布式lucene索引,并且可以使用rsync进行索引同步。虽然我不认为非常优雅,但在开始实际开发之前,最好使用已经建成并已知的工作。如果不了解更多细节,就很难提出更具体的建议。

看看。它是一个完整的“map reduce”框架,用于处理受谷歌启发的巨大数据集。它认为(但我可能错了)Rackspace正在使用它为他们的客户进行电子邮件搜索。

我想知道BigTable()是否进行搜索。

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

三种解决方案:

  • 使用已经存在的文本搜索引擎(lucene是提到最多的,还有几个)
    • 将整个消息存储在SQL数据库中,并使用包含的全文搜索(现在大多数数据库都有)
    • 不要为每个单词的出现创建一个新的记录,只需向单词记录中的一个大字段添加一个新值即可。如果不对此表使用SQL,则最好使用键值存储,其中键是单词,值是出现的列表。查阅一些参考书目以获得灵感

  • 但老实说,我认为唯一合理的方法是#1

    如果你能分解你的6亿行,那就研究一下数据库切分。所有行中的任何查询都会很慢。至少你可以用语言分手。如果他们都是英国人,那么,在普通搜索的基础上找到一些有意义的方法来分割数据。我在这里只是猜测,但也许域可以按TLD(.com、.net、.org等)分组

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


    我希望这是为了让人们搜索自己的电子邮件,而不是其他人的电子邮件……lucene对缩放没有帮助,我认为这是中心问题,但它可能是标记化、词干和搜索的正确工具。不,但MapReduce任务会创建反向索引,他们可以从中进行搜索。”他们是唯一安装了BigTable的公司:-)每天有2000万条消息,猜测头的长度为100字节,也就是说一个月后每天有2G的数据,60 GB。对这么多数据进行平面文件搜索[字节1、字节2、字节3…]真的会更快更简单吗?是的。平面文件在物理上更小。I/O更少,速度更快。GREP模式匹配可以非常简单。