使用InnoDB进行全文搜索

时间:2009-09-04 19:42:45

标签: sql mysql search full-text-search innodb

我正在开发一个高容量的Web应用程序,其中一部分是一个讨论帖子的MySQL数据库,需要平滑地增长到20M +行。

我原本计划在表格中使用MyISAM(对于内置的fulltext search capabilities),但由于单次写入操作而导致整个表被锁定的想法使我快门。行级锁更有意义(更不用说InnoDB在处理大型表时的其他速度优势)。所以,出于这个原因,我非常决定使用InnoDB。

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

我应该使用第三方搜索系统吗?和Lucene(c++) / Sphinx一样?你们这些数据库忍者有什么建议/指导吗? LinkedIn的zoie(基于Lucene)看起来像是目前最好的选择 ...围绕实时功能构建(这对我的应用来说非常关键。)我有点儿在没有一些洞察力的情况下犹豫不决...

(仅供参考:将使用高内存装备在EC2上,使用PHP来提供前端)

9 个答案:

答案 0 :(得分:55)

随着MyISAM的逐步淘汰,InnoDB full-text search (FTS) is finally available in MySQL 5.6.4 release.

来自http://dev.mysql.com/doc/refman/5.6/en/innodb-table-and-index.html#innodb-fulltext-index

  

这些索引在物理上表示为整个InnoDB表,它们由SQL关键字操作,例如CREATE INDEX语句的FULLTEXT子句,SELECT语句中的MATCH()... AGAINST语法,以及OPTIMIZE TABLE语句

虽然其他引擎有很多不同的功能,但这个是InnoDB,所以它是原生的(这意味着它有一个升级路径),这使它成为一个有价值的选择。

答案 1 :(得分:50)

我可以保证MyISAM全文是一个糟糕的选择 - 即使不考虑MyISAM表的各种问题一般,我已经看到全文的东西走了轨道并开始破坏自己并定期崩溃MySQL。

专用搜索引擎肯定会成为最灵活的选项 - 将帖子数据存储在MySQL / innodb中,然后将文本导出到搜索引擎。您可以非常轻松地设置定期完整索引构建/发布,并在您认为需要时添加实时索引更新并希望花时间。

Lucene和Sphinx是很好的选择,Xapian也是很好的选择。如果你去Lucene路线,不要认为Clucene会更好,即使你不想与Java搏斗,尽管我没有资格讨论任何一方的利弊。

答案 2 :(得分:11)

你应该花一个小时来完成Sphinx和Lucene的安装和试驾。在数据更新方面,看看是否符合您的需求。

让我对Sphinx感到失望的一件事是,它不能很好地支持增量插入。也就是说,在插入后重新索引是非常昂贵的,因此建议的解决方案是将数据拆分为较旧的,不变的行和较新的易失行。因此,您的应用所执行的每次搜索都必须搜索两次:一次针对旧行的较大索引,另一次针对最近行的较小索引。如果它没有与您的使用模式集成,那么这个Sphinx不是一个好的解决方案(至少在当前的实现中不是这样)。

我想指出您可以考虑的另一种可能的解决方案:Google Custom Search。如果您可以将一些搜索引擎优化应用到您的网络应用程序,然后将索引和搜索功能外包给谷歌,并将谷歌搜索文本域嵌入您的网站。它可能是使您的网站可搜索的最经济和可扩展的方式。

答案 3 :(得分:3)

也许你不应该这么快就解雇MySQL的FT。 Craigslist used to use it

MySQL的速度和全文搜索功能使craigslist能够为用户提供服务.craigslist使用MySQL每月提供大约5000万次搜索,每秒搜索速度高达60次。“

修改

如下所述,Craigslist似乎在2009年初有switched to Sphinx次。

答案 4 :(得分:1)

正如你所指出的那样,狮身人面像非常适合这种东西。所有工作都在配置文件中。确保你的表是什么,字符串有一些唯一的整数id键,你应该没问题。

答案 5 :(得分:0)

试试这个

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

如果其他一切都失败了,总会有soundex_match,遗憾的是它不是很快就准确

答案 8 :(得分:0)

对于那些坚持使用InnoDB不支持全文本搜索的旧版MySQL / MariaDB(即CentOS用户)的人,我使用InnoDB表时的解决方案是为要搜索的对象创建一个单独的MyISAM表。 / p>

例如,我的主要InnoDB表是products,具有各种键和引用完整性。然后,我创建了一个名为product_search的简单MyISAM表,其中包含两个字段product_idproduct_name,其中后者设置为FULLTEXT索引。这两个字段实际上都是主product表中内容的副本。

然后我使用全文本搜索MyISAM表,并进行内部联接回到InnoDB表。

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

如果您有需要全文本的多个表,我不建议这样做,但是对于单个表,在可以升级之前,似乎可以解决此问题。