使用 InnoDB 进行全文搜索

Posted

技术标签:

【中文标题】使用 InnoDB 进行全文搜索【英文标题】:Fulltext Search with InnoDB 【发布时间】:2010-11-25 18:07:36 【问题描述】:

我正在开发一个大容量 Web 应用程序,其中一部分是一个 mysql 数据库,其中包含讨论帖子,需要顺利增长到 20M+ 行。

我最初计划对表使用 MyISAM(用于内置的 fulltext search capabilities),但想到 整个表 由于单个写入操作而被锁定,这让我感到沮丧。行级锁更有意义(更不用说 InnoDB 在处理大型表时的其他速度优势)。因此,出于这个原因,我非常坚定地使用 InnoDB。

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

我应该使用第三方搜索系统吗?喜欢Lucene(c++) / Sphinx?你们中的任何一个数据库忍者有什么建议/指导吗? LinkedIn 的 zoie(基于 Lucene)看起来是目前最好的选择...围绕实时功能构建(这对我的应用程序非常重要。)我有点犹豫在没有一些洞察力的情况下提交......

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

【问题讨论】:

InnoDB now supports full text search as of 5.6 【参考方案1】:

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

【讨论】:

【参考方案2】:

我可以保证 MyISAM 全文是一个糟糕的选择——即使撇开 MyISAM 表的各种问题不谈,我也看到全文内容脱轨并开始自我损坏并定期使 MySQL 崩溃。

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

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

【讨论】:

Solr(基于 Lucene)可以大规模扩展,并且非常强大和灵活。我们使用了 Solr(特别是 LucidWorks for Solr 版本),我可以说这是一个巨大的胜利。 Sphinx 也有一些严肃的承诺,但最终它缺乏数据类型可能会令人不安,至少对于我们的应用程序而言。 Sphinx 速度非常快,如果它符合您的需求,也是一个不错的选择。 谢谢你们两个;很好的回应。我一直在翻阅 Solr 的文档,这似乎是一个很好的解决方案。我知道,它也为不少大型网站提供支持。我认为 Solr 是门票。多谢你们。另外,很高兴了解您的 MyISAM 头痛,伊恩……将来记住这些会很好。在其他项目中,我将不再尝试使用全文功能。 想知道是什么让 Ian 说“不要假设 Clucene 会更好”?作为 clucene 核心团队的一员,我可能不是那么客观,但对我来说,任何 Java 库的优化 C++ 端口似乎都会提高它的性能。我建议任何人都不要发布这样的 cmets,而至少要看看他们不尊重的产品。 当你抨击 MyISAM 时,你真的需要更具体。 “Off the rails” 非常含糊,可能是因为您正在使用的构建中的一个错误,可能已经修复。 但是如果您没有在服务器上安装软件的选项怎么办?在这种情况下还有哪些替代方案?【参考方案3】:

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

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

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

【讨论】:

谢谢,比尔。是的,Sphinx 文档让我对它如何处理索引更新有点犹豫。很高兴得到它的确认。我想,那种系统对我来说可能会变成一场噩梦。至于谷歌自定义搜索,这是一个选项。但是,我的主要问题只是非实时索引和缺乏自定义。对结果进行样式化和提取额外数据对我来说非常重要。不过感谢您的加入——Sphinx 信息当然很高兴知道!【参考方案4】:

也许您不应该这么快就放弃 MySQL 的 FT。 Craigslist used to use it.

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

编辑

如下所述,Craigslist 似乎在 2009 年初的某个时间有switched to Sphinx。

【讨论】:

我链接的文章没有提到 Sphinx,Nik 也没有引用任何消息来源说 Craigslist 根本使用 Sphinx 案例研究 PDF 看起来像是从 2004 年开始的,当时每月有 5000 万次搜索。 Sphinx 页面显示每天 有 5000 万次搜索,这可能解释了他们转向专用搜索解决方案的原因。【参考方案5】:

试试这个

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

【讨论】:

【参考方案6】:

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

https://dev.mysql.com/doc/refman/5.6/en/innodb-fulltext-index.html 上的许多有趣的细节。

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

【讨论】:

文章链接被403禁止【参考方案7】:

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

【讨论】:

【参考方案8】:

如果其他一切都失败了,总会有soundex_match,遗憾的是,这并不是真正的快速准确

【讨论】:

【参考方案9】:

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

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

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

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

如果您有多个需要全文的表格,我不建议您这样做,但对于单个表格,在您可以升级之前,这似乎是一个足够的工作。

【讨论】:

以上是关于使用 InnoDB 进行全文搜索的主要内容,如果未能解决你的问题,请参考以下文章

MySql5.7InnoDB全文索引(针对中文搜索)

Mysql Search - 用于全文搜索的 InnoDB 和事务与 MyISAM

InnoDB 错误中的 MySQL 全文搜索

MySql学习之全文检索

MySQL 5.7 innodb全文索引

mysql 文本搜索