簡體   English   中英

MySQL的FULLTEXT搜索是否為MyISAM和InnoDb返回相同的結果?

[英]Does MySQL's FULLTEXT search return the same results for MyISAM and InnoDb?

如果您拿一張桌子,簡單地將存儲引擎從MyISAM更改為InnoDb,所有WHERE MATCH (col1,col2,col3...) AGAINST (expr)再次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“ as以及兩個停用詞列表中的“ a”)。

  • 由於您使用的是自然語言模式,因此布爾搜索中的差異可能與您無關,但至少要列出一個:這兩個引擎在搜索查詢中的停止(或短)詞處理方式方面有所不同。 如果match against ('+about +Mary' in boolean mode)使用match against ('+about +Mary' in boolean mode) (兩個引擎中的“ about”都是停用詞),則InnoDB會嘗試在索引中找到該詞,盡管該詞不能在那里,因此不返回任何結果,而MyISAM將忽略該單詞,並可以返回可能不包含“ about”(僅“ Mary”)的結果。

此外,最小字長的默認值(MyISAM的ft_min_word_len (默認值為4)和InnoDB的innodb_ft_min_token_size (默認值為3)是不同的,因此,如果不進行調整,InnoDB索引將包含(並找到)更多的單詞。 您可能還想使停用詞列表相互匹配。

如果這些差異與您相關,則取決於您的數據,搜索方式以及您認為不同的順序是不同的結果。 在主要由短期或固定格式(例如產品代碼或公司名稱)組成的數據中進行搜索,或者對您根本只想查找特定單詞感興趣的搜索,或者通常僅產生少量可能結果的搜索,通常變化較小與在實際英文文本中進行搜索相比,在這兩個引擎中的搜索結果要高得多。

不可以,不能保證InnoDB全文索引與MyISAM全文索引在相同數據上的工作方式完全相同。

上次我測試它(當時InnoDB FT仍為Beta)時,肯定有情況下InnoDB FT沒有返回與MyISAM FT匹配的某些行。 它還返回了MyISAM中匹配的一些行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM