我正在开发一个高容量的Web应用程序,其中一部分是一个讨论帖子的MySQL数据库,需要平滑地增长到20M行 .
我原本打算在 table 上使用MyISAM(对于内置的fulltext search capabilities),但由于单次写入操作而导致整个表被锁定的想法让我快门 . 行级锁更有意义(更不用说InnoDB 's other speed advantages when dealing with huge tables). So, for this reason, I' m决定使用InnoDB .
问题是...... InnoDB没有内置的全文搜索功能 .
我应该使用第三方搜索系统吗?喜欢Lucene(c++) / Sphinx?你们这些数据库忍者有什么建议/指导吗? LinkedIn的zoie(基于Lucene)看起来是目前最好的选择...围绕实时功能构建(这对我的应用程序来说非常关键 . )我有点犹豫不决,没有一些洞察力......
(仅供参考:将使用高内存装备在EC2上,使用PHP来提供前端)
8 回答
我可以保证MyISAM全文是一个糟糕的选择 - 即使撇开MyISAM表的各种问题一般,我已经看到全文的东西走了轨道并开始破坏自己并定期崩溃MySQL .
专用搜索引擎肯定会成为最灵活的选项 - 将帖子数据存储在MySQL / innodb中,然后将文本导出到搜索引擎 . 您可以非常轻松地设置定期完整索引构建/发布,并在您认为需要并希望花时间时添加实时索引更新 .
Lucene和Sphinx都是不错的选择,Xapian也是很好的选择 . 如果你去Lucene路线,我宁愿不与Java搏斗,虽然我没有资格讨论两者的利弊 .
随着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,所以它是原生的(这意味着它有一个升级路径),这使它成为一个有 Value 的选择 .
你应该花一个小时来完成Sphinx和Lucene的安装和试驾 . 在数据更新方面,看看是否符合您的需求 .
令我对Sphinx感到失望的一件事是,它不能很好地支持增量插入 . 也就是说,在插入后重新索引是非常昂贵的,因此建议的解决方案是将数据拆分为较旧的,不变的行和较新的易失行 . 因此,您的应用所执行的每次搜索都必须搜索两次:一次针对旧行的较大索引,另一次针对最近行的较小索引 . 如果它没有与您的使用模式集成,那么这个Sphinx不是一个好的解决方案(至少在当前的实现中不是这样) .
我想指出另一种可以考虑的解决方案:Google Custom Search . 如果您可以将一些搜索引擎优化应用到您的网络应用程序,然后将索引和搜索功能外包给谷歌,并将谷歌搜索文本域嵌入您的网站 . 它可能是使您的网站可搜索的最经济和可扩展的方式 .
也许你不应该这么快就开始 . Craigslist used to use it .
编辑
正如下面评论的那样,Craigslist似乎在2009年初的某个时候有了switched to Sphinx .
正如你所指出的那样,狮身人面像非常适合这种东西 . 所有工作都在配置文件中 . 确保你的表是什么,字符串有一些唯一的整数id键,你应该没问题 .
试试这个
你应该看看狮身人面像 . 值得一试 . 它的索引速度非常快,而且是分布式的 . 你应该看看这个(http://www.percona.com/webinars/2012-08-22-full-text-search-throwdown)webminar . 它谈论搜索并有一些整洁的基准 . 你会发现它很有用 .
如果其他一切都失败了,那总是soundex_match,遗憾的是它不是很快就准确了