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

时间:2014-04-08 18:25:47

标签: php mongodb yii solr nosql

我正在使用PHP Yii进行应用程序的体系结构设计,该应用程序具有大量记录(将来大约有一百万个)。 DB结构如下:

enter image description here

要求:

  1. 快速关键字搜索个人资料,文章,论坛。关键字可以是列的组合 - 例如。 BizName + City,City + Specialty,ServiceName + City,Article Title等。
  2. 对用户的关键字建议
  3. 在标签中显示搜索结果。示例:个人档案,文章。论坛等。
  4. 方法1:

    1. 使用OR和模式匹配在多个列上创建关系DB.Write SQL。
    2. 缺点:

      表现不佳

      Aprroach 2:

      1. 创建关键字表。创建可搜索的列组合并将其保存在KeywrodTab中。
      2. 创建-keyword-Profile.Keyword-Article,Keyword-Forum等的映射表。
      3. 查询自动建议的关键字表。一旦用户点击搜索按钮查询映射表并提取articleId,ProfileId,ForumId等
      4. 缺点:

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

        方法3:

        1. 在可搜索列上有一个带有FULLTEXT索引的关系数据库。
        2. 问题:

          1. 不确定搜索框的自动建议是否有效?
          2. 与其他方法相比,本案例的表现如何?
          3. 方法4:

            将MongoDB / Solr / Lucene等NoSQL DB与RelationalDB.Use noSQL结合使用,以查找articleId,ProfileId,ForumId等。用于显示结果的关系数据库。

            缺点:

            1. 在每次更新时创建/更新noSQL。
            2. 还有其他方法吗?哪种方法具有可扩展性并能提供良好的性能?

2 个答案:

答案 0 :(得分:1)

如果你这样说,方法4是最具扩展性的,并且具有最佳性能。

但是,由于不清楚内容实际是什么以及数据集的大小 - 大约一百万行'几乎不是一个迹象,因为它没有说明行包含什么,如果这些行是否在一个表中 - 它实际上不可能给出准确的建议。无论如何,方法4可能是最快的,但它是最有效的吗?一个表中有一百万行,大约有4列,每行包含大约250个字节的数据(这里只是一个猜测,你的里程可能会有所不同),实际上并不是那么多。很好地选择索引并优化查询,您可能只需要RDBMS。

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

答案 1 :(得分:1)

如果要快速搜索SQL数据库中多个表中的多个列,则需要在几乎所有内容上放置索引。这是将关系数据库的写入性能提升到记录低点的好方法。

出于这个原因,我建议你使用一个独立的系统进行搜索。从你提到的技术我宁愿推荐专用搜索服务器Apache Solr(它是Lucene项目的一部分,而不是一个单独的技术),因为MongoDB是一个有趣的数据库技术,有很多很棒的功能,但它的文本搜索是不是核心功能,而是标记为。

但技术选择总是主观的,因此评估所有选项,看看它们如何与您的特定要求对齐并做出自己的决定。