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

时间:2017-08-14 07:14:23

标签: mysql full-text-search

如果您选择一个表并只是将存储引擎引擎从MyISAM更改为InnoDb,那么所有WHERE MATCH (col1,col2,col3...) AGAINST (expr)都会返回与MyISAM完全相同的结果吗?如果不是,有什么区别?

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

2 个答案:

答案 0 :(得分:5)

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

  • MyISAM自然语言搜索(但不是布尔模式)具有50%的阈值,而InnoDB没有,因此MyISAM结果中排除了非常(非常)常见的单词。 the manual中有一条关于它的评论:

      

    当您第一次尝试全文搜索以查看其工作原理时,50%的阈值会让您感到惊讶,并使InnoDB表更适合进行全文搜索的实验。如果您创建一个MyISAM表并仅向其中插入一行或两行文本,则文本中的每个单词都会出现在至少50%的行中。因此,在表包含更多行之前,搜索不会返回任何结果。

  • MyISAM stopword列表(未包含在全文索引中且因此无法找到的单词列表)明显长于InnoDB使用的(默认)列表,因此例如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”,这是两个禁用词列表。)

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

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

如果这些差异与您的情况相关,则取决于您的数据,搜索模式以及您是否考虑使用不同的顺序来获得不同的结果。搜索主要由短期或固定格式组成的数据,例如产品代码或公司名称,或者您主要想要查找特定单词的搜索,或者通常只产生少量可能结果的搜索,在两个引擎中的差异通常小于实际英文文本中的搜索相关性得分有更大的影响。

答案 1 :(得分:0)

不,无法保证InnoDB全文索引与同一数据上的MyISAM全文索引的工作方式完全相同。

上次我测试它(当InnoDB FT仍然是测试版时),肯定会有InnoDB FT没有返回MyISAM FT中匹配的行。它还返回了一些在MyISAM中匹配的行。