mysql - MySQL 的 FULLTEXT 搜索是否为 MyISAM 和 InnoDb 返回相同的结果?

标签 mysql full-text-search

如果你拿一张表,简单地将存储引擎引擎从 MyISAM 更改为 InnoDb,所有 WHERE MATCH (col1,col2,col3...) AGAINST (expr) 都会返回完全相同的结果在 MyISAM 下?如果不是,有什么区别?

我的意思是只是在全文搜索方面的差异,没有别的。这两个存储引擎显然还有其他巨大差异。

最佳答案

MyISAM 和 InnoDB 全文搜索的实现实际上有一些显着差异:

  • MyISAM 自然语言搜索(但不是 bool 模式)有 50% 的阈值,而 InnoDB 没有,所以非常(非常)常用的词被排除在 MyISAM 结果中。 the manual里面有备注关于它:

    The 50% threshold can surprise you when you first try full-text searching to see how it works, and makes InnoDB tables more suited to experimentation with full-text searches. If you create a MyISAM table and insert only one or two rows of text into it, every word in the text occurs in at least 50% of the rows. As a result, no search returns any results until the table contains more rows.

  • MyISAM stopword列表(未包含在全文索引中因此无法找到的单词列表)明显长于 InnoDB 使用的(默认)列表,例如“everybody”或“unfortunately”可以用 InnoDB 找到,但不能用 MyISAM 找到。 match against ('Mary Had a Little Lamb') 通常会包含更多结果,因为“had”在 MyISAM 中是停用词,但在 InnoDB 中不是。

  • MyISAM 和 InnoDB 使用不同的权重算法。 MyISAM 考虑例如匹配词与连续不匹配词的比率,因此包含一个词的长句与包含该词的短句的相关性较低。虽然这只会改变其他相同结果集中的顺序,但这通常会对用户体验产生重大影响,如果用户认为两个结果“相同”,这就是您要问的.这也可能特别相关,因为搜索通常包括一个限制,例如order by score desc limit 10,因此会产生完全不同的结果。

  • InnoDB 支持 "" 匹配精确短语(给定顺序的单词),而 MyISAM(至少在自然语言模式下)不支持。因此,如果您使用 match against ('"Mary Had a Little Lamb"'),InnoDB 将只返回包含这个确切句子的行,而 MyISAM 将找到包含任何这些单词的每一行(除了上面提到的“had”和两个停用词列表中的“a”)。

  • 由于您使用的是自然语言模式, bool 搜索中的偏差可能与您无关,但至少列出一个:两个引擎在处理停用词(或短词)的方式上有所不同搜索查询。如果你使用 match against ('+about +Mary' in boolean mode)(“about”在两个引擎中都是停用词),InnoDB 将尝试在索引中找到该词,尽管它不能在那里,因此不返回任何结果,而 MyISAM 将忽略该词并可以返回可能不包含“about”而仅包含“Mary”的结果。

此外,最小字长的默认值, ft_min_word_len对于 MyISAM(默认 4)和 innodb_ft_min_token_size对于 InnoDB(默认 3)是不同的,所以如果你不调整它们,InnoDB 索引将包含(并找到)更多的词。您可能还想使停用词列表相互匹配。

这些差异是否与您的情况相关将取决于您的数据、您的搜索模式以及您是否认为不同的顺序会产生不同的结果。搜索主要由短期或固定格式组成的数据,例如产品代码或公司名称,或者您主要对查找特定单词感兴趣的搜索,或者通常只产生少数可能结果的搜索,与实际英文文本中的搜索相比,两种引擎中的差异通常较小,其中不同的相关性分数有更大的影响。

关于mysql - MySQL 的 FULLTEXT 搜索是否为 MyISAM 和 InnoDb 返回相同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45669229/

相关文章:

MYSQL 查询,SELECT 中的 where 语句(有多行/where 语句)

elasticsearch - 根据Elasticsearch中的最佳字段匹配进行搜索

php - 如何解析 Postgresql 查询的用户搜索字符串?

php - 如何使用MySQL全文搜索短语而不是使用LIKE

MySQL MATCH AGAINST - 处理单引号

mysql - 全文干扰词——背后的逻辑

php - 无法访问 php 数组进行 m​​ysql 查询

php - 如何存储单击的表格单元格的变量并将其传输到另一个表格?

mysql - 对于 MySQL,为什么这个日期查询显示不正确的结果?

php - 邮政编码半径搜索