tex*_*ate 0 mysql full-text-search
如果您拿着一张桌子,简单地将存储引擎引擎从MyISAM更改为InnoDb,是否都将WHERE MATCH (col1,col2,col3...) AGAINST (expr)返回与MyISAM下完全相同的结果?如果没有,有什么区别?
我的意思是在全文搜索方面仅存在差异,仅此而已。这两个存储引擎显然还有其他巨大差异。
MyISAM和InnoDB全文搜索的实现实际上实际上存在一些显着差异:
MyISAM自然语言搜索(但不是布尔模式)具有50%的阈值,而InnoDB则没有,因此MyISAM结果中排除了非常非常常见的单词。手册中有关于此的说明:
当您首次尝试全文搜索以了解其工作原理时,50%的阈值会让您感到惊讶,并使InnoDB表更适合进行全文搜索的实验。如果创建MyISAM表并仅在其中插入一两行文本,则文本中的每个单词至少出现在50%的行中。结果,在表包含更多行之前,没有搜索返回任何结果。
MyISAM 停用词列表(全文索引中未包含的单词列表,因此无法找到)比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会忽略该词并可能返回可能不包含“关于”,仅包含“玛丽”。
此外,最小字长的默认值(MyISAM的ft_min_word_len(默认值为4)和InnoDB的innodb_ft_min_token_size(默认值为 3)是不同的,因此,如果不进行调整,InnoDB索引将包含(并找到)更多的单词。您可能还想使停用词列表相互匹配。
如果这些差异与您相关,则取决于您的数据,搜索方式以及您认为不同的顺序是不同的结果。在主要由短期或固定格式(例如产品代码或公司名称)组成的数据中进行搜索,或者对您根本只希望查找特定单词感兴趣的搜索,或者通常仅产生少量可能结果的搜索,通常变化较小与在实际英文文本中进行搜索相比,在这两个引擎中的搜索结果要高得多。