使用InnoDB进行全文搜索


93

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

我本来打算对表使用MyISAM(用于内置的全文本搜索功能),但是由于单个写入操作而使整个表被锁定的想法使我陷入困境。行级锁具有更大的意义(更不用说InnoDB在处理大型表时的其他速度优势)。因此,基于这个原因,我决心使用InnoDB。

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

我应该使用第三方搜索系统吗?像Lucene(c ++) / Sphinx吗?你们中的任何数据库忍者有任何建议/指导吗?LinkedIn的zoie(基于Lucene)目前看来是最好的选择...是围绕实时功能构建的(这对我的应用程序而言非常关键。)我有点犹豫,但还没有深入的了解...

(仅供参考:将在具有高内存绑定的EC2上使用PHP服务前端)


Answers:


50

我可以保证MyISAM全文是一个不好的选择-甚至不考虑MyISAM表的各种问题,我已经看到了全文问题,并开始破坏自身并定期使MySQL崩溃。

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

Lucene和Sphinx和Xapian都是不错的选择,它既美观又轻巧。如果您走Lucene路线,即使您不想与Java搏斗,也不要以为Clucene会更好,尽管我没有资格讨论两者的优缺点。


7
Solr(基于Lucene)可以进行大规模扩展,并且功能强大且灵活。我们已经聘请了Solr(特别是LucidWorks for Solr版),我可以说这是一个巨大的胜利。Sphinx也有一些严肃的承诺,但最终,至少对于我们的应用程序而言,缺乏数据类型可能会令人不安。Sphinx速度非常快,如果适合您的需求也是一个不错的选择。
Cody Caughlan

谢谢你们两个;很好的回应。我一直在浏览Solr的文档,这似乎是一个很好的解决方案。我知道,它也可以为许多大型网站提供支持。我认为Solr是票。多谢你们。另外,了解MyISAM的头痛问题也很高兴,伊恩(Ian)...将来会记住这些问题。在其他项目上,我将远离尝试使用全文功能的地方。
brianreavis

11
想知道是什么让伊恩说“不要以为Clucene会更好”吗?作为一个clucene核心团队之一,我可能没有那么客观,但是对我来说,任何Java库的经过优化的C ++端口似乎都可以提高其性能。我建议任何人不要至少看一眼他们耻辱的产品就不要发表这样的评论。
synhershko

4
当您抨击MyISAM时,您确实需要更加具体。 “脱离轨道”非常模糊,可能是因为您正在使用的构建中的一个错误,可能是因为已修复。
bobobobo 2010年

6
但是,如果您没有选择在服务器上安装软件该怎么办?在这种情况下,还有哪些替代方法呢?
acme


11

您应该花费一个小时,并完成Sphinx和Lucene的安装和测试。查看有关数据更新的任何一项是否都满足您的需求。

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

我想指出您可以考虑的另一种解决方案: Google自定义搜索。如果可以在Web应用程序中应用一些SEO,则将索引和搜索功能外包给Google,然后将Google搜索文本字段嵌入到您的网站中。这可能是使网站可搜索的最经济和可扩展的方法。


谢谢,比尔。是的,Sphinx文档让我对它如何处理索引更新有些动摇。很高兴得到确认。我想,这种系统可能对我来说是一场噩梦。至于Google自定义搜索,这是一个选择。但是,我的主要问题只是非实时索引和缺乏自定义。确定结果的样式并提取其他数据对我来说至关重要。不过感谢您的配合---狮身人面像的信息当然很高兴知道!
brianreavis

3

也许您不应该这么快就解雇MySQL的FT。 Craigslist曾经使用过它

MySQL的速度和全文搜索使craigslist可以为他们的用户提供服务。.craigslist使用MySQL每月为大约5000万次搜索提供服务,而每秒最多可以进行60次搜索。”

编辑

如下所述,Craigslist似乎在2009年初的某个时候改用了Sphinx


我链接的文章没有提到Sphinx,Nik也没有引用任何消息说Craigslist完全使用Sphinx
bobobobo

案例研究PDF看起来像是从2004年开始,当时每月有5000万次搜索。Sphinx页面指出每天有 5000万次搜索,这很可能解释了为什么他们转向专用搜索解决方案的原因。
HalilÖzgür11年

1

正如您所指出的那样,Sphinx非常适合这些东西。所有工作都在配置文件中。确保您的表所在的字符串都具有唯一的整数id键,并且应该没问题。



0

您应该看看Sphinx。值得一试。它的索引超快速并且是分布式的。您应该看一下(http://www.percona.com/webinars/2012-08-22-full-text-search-throwdown)网络研讨会。它谈论搜索,并具有一些简洁的基准。您可能会发现它很有帮助。



0

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

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.