在巨大的表格中搜索

时间:2011-05-01 13:37:47

标签: sql lucene

我有超过一百万行的表。 此表表示用户信息,例如userName,email,gender,marrial status等。

当应用某些条件时,我将对此表中的所有行进行搜索。

在简单的情况下,当搜索仅在userName上执行时,查找结果需要4-7秒。

select from u where u.name ilike " ... "

是的,我得到了一些文件的索引。我检查了它们是否使用了explain analyze命令。

如何提升搜索效果?

我对Lucene很感兴趣,能帮忙吗?

我想知道Facebook搜索是如何工作的,他们有数十亿用户,他们的搜索工作要快得多。

4 个答案:

答案 0 :(得分:1)

看一看 Hibernate搜索 这是使用Lucene但更容易实现。

Google或Facebook正在使用不同的方法。他们有分布式系统。 Googles BigTable是一个很好的关键词,或者“Map and Reduce”概念(Apache Hadoop)是进行更多研究的一个很好的起点。

答案 1 :(得分:1)

尝试使用表分区。 在大型表格场景中,可以帮助分区表格。 对于PostgreSQL,请尝试PostgreSQL Partitioning。 对于高度可扩展的快速性能搜索,有时可能对采用NoSQL数据库很有用(就像Facebook一样)。

答案 2 :(得分:1)

这三个查询之间存在很大差异:

a) SELECT * FROM u WHERE u.name LIKE "George%"

b) SELECT * FROM u WHERE u.name LIKE "%George"

c) SELECT * FROM u WHERE u.name LIKE "%George%"

a)第一个将使用u.name上的索引(如果有的话)并且速度非常快。


b)第二个将无法在u.name上使用任何索引,但有很多方法可以轻易地绕过它。

例如,您可以在存储nameReversed的表格中添加另一个字段REVERSE(name)。使用该字段的索引,查询将被重写为(并且将与第一个一样快):

b2) SELECT * FROM u WHERE u.nameReversed LIKE REVERSE("%George") 

c)第三个查询带来了最大的困难,因为前两个索引都没有任何帮助,查询将扫描整个表。替代方案是:

使用专用于此类问题的解决方案(搜索“全文搜索”),如Sphinx。有关更多详细信息,请参阅此问题:which-is-best-search-technique-to-search-records

如果您的字段只有名称(或另一组有限的单词,比如几百个不同的单词),您可以使用这些名称(单词)创建另一个辅助表,并仅在表u中存储外键

如果情况并非如此,并且您有数万或数百万个不同的单词或该字段包含整个短语,那么要解决许多辅助表的问题,就像为自己创建一个全文搜索工具。这是一个很好的练习,除了RDBMS之外你不必使用Sphinx(或其他),但这不是一件容易的事。

答案 3 :(得分:1)

  

我对Lucene很感兴趣,能帮忙吗?

是的,它可以。我敢肯定,你一定会喜欢它!

我遇到了同样的问题:一张包含大约120万条消息的表。通过搜索这些消息,它需要几秒钟。 “消息”列上的全文搜索大约需要10秒钟。

在同一服务器硬件上,lucene返回大约200-400ms的结果。

那很快。

缓存结果大约在5-10毫秒内返回。

Lucene能够连接到您的SQL数据库(例如mysql) - 扫描您的数据库,构建一个可搜索的索引。

要搜索此索引,取决于应用程序的类型。 我的情况是,我的PHP Webaplication使用solr在lucene中搜索。 http://lucene.apache.org/solr/