Sql 使用InnoDB进行全文搜索

Sql 使用InnoDB进行全文搜索,sql,mysql,search,full-text-search,innodb,Sql,Mysql,Search,Full Text Search,Innodb,我正在开发一个大容量的web应用程序,其中一部分是讨论帖子的MySQL数据库,需要平稳地增长到2000多万行 我原本打算在表中使用MyISAM(用于内置),但一想到整个表由于一次写入操作而被锁定,我就感到很沮丧。行级锁更有意义(更不用说InnoDB在处理大型表时的其他速度优势)。因此,出于这个原因,我决定使用InnoDB 问题是。。。InnoDB没有内置的全文搜索功能 我应该使用第三方搜索系统吗?像/?你们这些数据库忍者有什么建议/指导吗?LinkedIn(基于Lucene)看起来是目前最好的选

我正在开发一个大容量的web应用程序,其中一部分是讨论帖子的MySQL数据库,需要平稳地增长到2000多万行

我原本打算在表中使用MyISAM(用于内置),但一想到整个表由于一次写入操作而被锁定,我就感到很沮丧。行级锁更有意义(更不用说InnoDB在处理大型表时的其他速度优势)。因此,出于这个原因,我决定使用InnoDB

问题是。。。InnoDB没有内置的全文搜索功能

我应该使用第三方搜索系统吗?像/?你们这些数据库忍者有什么建议/指导吗?LinkedIn(基于Lucene)看起来是目前最好的选择。。。由于是围绕实时功能(这对我的应用程序来说非常关键)构建的,我有点犹豫是否提交,但没有一些洞察力


(仅供参考:将在EC2上使用高内存设备,使用PHP为前端提供服务)

正如您所指出的,Sphinx非常适合这种东西。所有工作都在配置文件中。确保表中的字符串都有唯一的整数id键,这样就可以了

我可以保证MyISAM全文版是一个糟糕的选择——即使撇开MyISAM表的各种问题不谈,我也看到了全文版的东西出轨,开始自我腐蚀,并定期崩溃MySQL

一个专用的搜索引擎肯定是这里最灵活的选择——将帖子数据存储在MySQL/innodb中,然后将文本导出到搜索引擎中。您可以非常轻松地设置定期的完整索引构建/发布,如果您觉得需要并想花时间,还可以添加实时索引更新


Lucene和Sphinx都是不错的选择,因为它们既漂亮又轻便。如果你选择Lucene路线,不要认为Clucene会更好,即使你不想与Java搏斗,尽管我没有资格讨论这两者的利弊。

你应该花一个小时来完成Sphinx和Lucene的安装和试驾。查看其中一个是否满足您在数据更新方面的需要

Sphinx让我失望的一件事是它不能很好地支持增量插入。也就是说,在插入后重新编制索引非常昂贵,因此他们建议的解决方案是将数据拆分为旧的、不变的行和新的、不稳定的行。因此,应用程序的每次搜索都必须搜索两次:一次是在较大的索引上搜索旧行,另一次是在较小的索引上搜索最近的行。如果这不符合您的使用模式,那么这个Sphinx不是一个好的解决方案(至少在当前的实现中不是)


我想指出您可以考虑的另一种可能的解决方案:。如果你可以对你的web应用程序进行一些SEO,那么将索引和搜索功能外包给谷歌,并在你的网站中嵌入谷歌搜索文本字段。这可能是最经济和可扩展的方式,使您的网站搜索

也许你不应该这么快就放弃MySQL的FT

MySQL的速度和全文搜索使craigslist能够为用户服务。。craigslist使用MySQL每月提供大约5000万次搜索,每秒最多60次搜索。” 编辑 正如下面的评论,Craigslist似乎在2009年初有一些时间。

试试这个

ROUND((LENGTH(text) - LENGTH(REPLACE(text, 'serchtext', ''))) / LENGTH('serchtext'),0)!=0

随着MyISAM的全面淘汰

有很多有趣的细节


虽然其他引擎有很多不同的功能,但这一个是InnoDB,因此它是本机的(这意味着有一个升级路径),这使它成为一个值得选择的选项。

你应该看看Sphinx。它值得一试。它的索引速度非常快,而且是分布式的。你应该看看这个(http://www.percona.com/webinars/2012-08-22-full-text-search-throwdown)webminar。它谈论搜索,并有一些简洁的基准测试。你可能会发现它很有用。

如果其他一切都失败了,那么总是会有,不幸的是,对于那些停留在MySQL/MariaDB旧版本上的人(即CentOS用户)来说,这并不是一个真正快速准确的标准在InnoDB不支持全文搜索的地方,我使用InnoDB表时的解决方案是为我想要搜索的内容创建一个单独的MyISAM表

例如,我的InnoDB主表是
products
,具有各种键和引用完整性。然后,我创建了一个名为
product\u search
的简单MyISAM表,其中包含两个字段,
product\u id
product\u name
,后者被设置为
全文
索引。这两个字段实际上都是一个联合索引主
产品
表中内容的py

然后,我使用全文搜索MyISAM表,并对InnoDB表进行内部连接

MyISAM表的内容可以通过触发器或应用程序的模型保持最新


如果您有多个需要全文的表,我不建议这样做,但对于单个表来说,这似乎是一个足够的解决方法,直到您可以升级。

Solr(基于Lucene)可以进行巨大的扩展,并且它非常强大和灵活。我们使用了Solr(特别是LucidWorks for Solr edition)我可以说这是一个巨大的胜利。Sphinx也有一些重要的承诺,但最终它缺少数据类型可能会带来麻烦,至少对我们的应用程序来说是这样。Sphinx非常快,如果它适合您的需要,也是一个可靠的选择。谢谢你们两位;回复非常好。我一直在翻阅Solr的文档,这似乎是一个很好的解决方案接下来。我明白了,它也为很多大型网站提供了动力。我认为Solr就是其中之一。谢谢各位。还有,很高兴了解到你们MyISAM的头痛问题,Ian……这些问题在将来会很好地考虑。在其他项目上,我将不再尝试使用全文功能