设计非常大的数据库来搜索文本

时间:2012-02-13 11:07:31

标签: database database-design full-text-search

我们需要设计一个系统,允许用户在大文本中搜索不同的关键字,并在将来的一段时间内,在所有文章中创建一些关于该关键词频率的基本报告。

我们将:

  • 每天新增约200,000篇文章
  • 每篇文章大约2KB
  • 文章存放6个月

为此,我们提出了以下解决方案:

  • 创建一个SOLR存储库来存储文章
  • 使用MySQL数据库存储文章附加信息

系统将通过关键字搜索SOLR,然后在MySQL中查找结果以检索其他信息。

那么,这会是一个好方法吗?

如果大多数搜索仅针对上个月添加的文章,那么保留两个数据库是不是一个好主意,一个是上个月为大多数搜索添加的文章,另一个是所有文章?

如果您对如何改进这一点有任何提示/技巧,我们将不胜感激。

提前致谢!

4 个答案:

答案 0 :(得分:2)

我认为您的解决方案非常好。如果你想在常见查询上获得更快的响应,我会评估在SOLR之前放置一个memcache实例。

我不确定这两个数据库,你必须看到与第一个数据库到第二个数据库随着年龄增长而移动记录的负担相比,性能优势是什么。我怀疑有一个巨大的好处,但这只是直觉,不要接受我的话并进行实验。

另外,如果您的数据集变得非常大,您是否正在考虑可能需要一些水平可扩展的解决方案?

答案 1 :(得分:2)

您可能希望立即考虑尝试使用MySQL 5.6,而不是将数据存储在MySQL和Solr中。您应该能够使用一个存储引擎满足您的所有要求。

事实上,MySQL已经支持全文搜索多年,但仅限于过时的MyISAM表引擎。 MySQL 5.6支持InnoDB表的这一功能,这使得它与Ruby on Rails等框架更加相关。

MySQL全文搜索的文档位于:

http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html

查询语法可能与那些将其与Solr的功能进行比较的人特别感兴趣,它位于:

http://dev.mysql.com/doc/refman/5.6/en/fulltext-boolean.html

答案 2 :(得分:1)

事实上,我对使用Solr Search Platform一无所知,但在我看来,您可以使用Java Content Repository JCR,这样您就可以以树格式获取数据库中的数据。因此,搜索将比平时快得多。 您必须查看此链接以获取有关它的更多信息

http://onjava.com/onjava/2006/10/04/what-is-java-content-repository.html

希望有所帮助

答案 3 :(得分:0)

您希望每个列(Column1,Column2,Column3)都有一个索引查找,而不是在这么大的表上进行表扫描。

问题是一个查询将使用一个索引。

如果你将一个索引放在(Column1,Column2,Column3)上,它仍然会为每个搜索执行一次表扫描,因为当使用索引(即Column1)时,它仍然必须检查Column2和Column3中的搜索关键字同时,这些都没有订购。 - 仅为Column1订购索引; Column2和Column2是随机顺序

所以你有2个解决方案:要么改变表格布局,要么你没有Column1,Column2和Column3,只有1列有搜索关键字:cname,如果你需要知道它是否是Column1,2或3然后添加一个整数表示1,2或3的其他列。 在此cname列上放置一个索引,您的搜索将会很快。 但是,根据您拥有的其他列,这可能意味着您复制了一些数据。

这就是我要做的。如果那还不够,那么甚至拆分表,这样你只有一个表(id,cname)并使用id你可以从另一个表中查找你需要的其他列。如果表变得太长,你甚至可以拆分它,创建一个包含以A到M开头的单词的cnameAM和包含其余单词的cnameNZ。

如果无法更改表格布局: 而不是使用1个查询,使用多个查询

在每个列上放置索引并使用3个查询。 所以在(id,Column1)上创建索引,在(id,Column2)和(id,Column3)上建立索引 并做:

SELECT * FROM 'SearchTable' WHERE Column1='$SearchKeyword'
SELECT * FROM 'SearchTable' WHERE Column2='$SearchKeyword'
SELECT * FROM 'SearchTable' WHERE Column3='$SearchKeyword'

这三个选项将非常快,因为它们各自对其特定索引进行查找 然后加入3个结果集以进行进一步处理或使用您检索到的ID查找更多列