Php 最好的设计方法是什么?更快的搜索?

Php 最好的设计方法是什么?更快的搜索?,php,mongodb,yii,solr,nosql,Php,Mongodb,Yii,Solr,Nosql,我正在使用PHPYII进行一个应用程序的架构设计,它有大量的记录(未来大约有一百万条记录)。 数据库结构如下所示: 要求: 快速关键字搜索个人资料,文章,论坛。关键字可以是列的组合,例如BizName+城市、城市+专业、ServiceName+城市、文章标题等 用户关键字建议 在选项卡中显示搜索结果。例如:简介、文章、论坛等 方法1: 拥有关系数据库。使用OR和模式匹配在多个列上编写SQL 缺点: 表现不佳 第2条: 创建关键字表。创建可搜索的列的组合,并将它们保存在KeywrodTab中 创

我正在使用PHPYII进行一个应用程序的架构设计,它有大量的记录(未来大约有一百万条记录)。 数据库结构如下所示:

要求:

  • 快速关键字搜索个人资料,文章,论坛。关键字可以是列的组合,例如BizName+城市、城市+专业、ServiceName+城市、文章标题等
  • 用户关键字建议
  • 在选项卡中显示搜索结果。例如:简介、文章、论坛等
  • 方法1:

  • 拥有关系数据库。使用OR和模式匹配在多个列上编写SQL
  • 缺点:

    表现不佳

    第2条:

  • 创建关键字表。创建可搜索的列的组合,并将它们保存在KeywrodTab中
  • 创建关键字配置文件、关键字文章、关键字论坛等的映射表
  • 自动建议的查询关键字表。一旦用户点击搜索按钮,查询映射表并提取articleId、ProfileId、ForumId等
  • 缺点:

    在每次更新时创建/更新关键字和映射

    方法3:

  • 在可搜索列上具有全文索引的关系数据库
  • 问题:

  • 不确定自动建议搜索框是否有效
  • 与其他方法相比,这种情况下的性能如何
  • 方法4:

    将NoSQL数据库如MongoDB/Solr/Lucene与RelationalDB结合使用。使用NoSQL查找articleId、ProfileId、ForumId等,使用relational数据库显示结果

    缺点:

  • 在每次更新时创建/更新noSQL

  • 还有别的办法吗?哪种方法是可扩展的,并且可以提供良好的性能?

    如果您这样说,那么方法4是最可扩展的,并且具有最好的性能

    然而,由于不清楚实际内容是什么以及数据集有多大——“大约一百万行”很难表示,因为它没有说明行包含什么以及这些行是否在一个表中——实际上不可能给出准确的建议。方法4可能是最快的,但它是最有效的吗?在一个表中,有大约4列的一百万行,每个列包含大约250字节的数据(这里只是猜测,您的里程可能有所不同),实际上并没有那么多。选择好索引并优化查询,RDBMS可能就是您所需要的全部


    我的建议是:建立一个数据集进行测试,并尝试各种方法。

    当您想在SQL数据库中通过多个表中的多个列快速搜索时,您几乎需要在所有内容上放置索引。这是将关系数据库的写入性能降至记录低点的好方法

    因此,我建议您使用独立的系统进行搜索。从您提到的技术来看,我更愿意推荐专用搜索服务器ApacheSolr(它是Lucene项目的一部分,不是一种单独的技术)而不是MongoDB,因为MongoDB是一种有趣的数据库技术,有很多很好的功能,但它的文本搜索不是一个核心功能,而是一种附加功能


    但是技术选择总是主观的,所以请评估所有选项,看看它们如何符合您的具体要求,然后做出您自己的决定。

    我会选择方法4,然后制作一个智能脚本来增量更新您的索引,每两天完全引用它们一次(就像谷歌使用其机器人所做的那样)方法4。Solr可以进行增量更新,您可以让复制服务器在一台服务器上进行写入/更新,在其他服务器上进行读取,并持续运行复制。嗨,Plenka,我还想从托管角度了解安装Solr的可行性。我们将有一个PHP托管环境。我相信,对于ApacheSolr,我们也需要J2EE环境,它将是从PHP到J2EE服务器的n/w调用。您可以将它们安装在与PHP托管环境相同的服务器上,但建议使用单独的服务器。默认情况下,通过HTTP在80以外的另一个端口(Tomcat上的默认端口是8080)上查询Solr。如果您使用Linux发行版作为服务器操作系统,那么这些应用程序很可能在存储库中随时可用,使安装变得轻而易举。感谢您的回复。对不起,我还有一个问题。我可以在搜索框中使用Solr的自动建议功能吗?