2009-03-04 72 views
4

什么是限制或陷阱或反模式或陷阱?Mysql全文索引限制?

它看起来非常有吸引力,显然你可以创建几乎没有工作的搜索引擎。但它不能没有它的问题...

你有什么经验?

回答

4

在我看来,最大的缺点是MySQL全文索引仅限于MyISAM表。与InnoDB表格相反,这些表格缺少很多重要的功能,例如交易。

+4

您可以通过创建一个从属机器来解决此问题。从机上的表格类型不必与主机匹配,这意味着您的innodb主机可以拥有一个全文搜索的myisam从机。 http://dev.mysql.com/doc/refman/5.1/en/replication-solutions-diffengines.html – txyoji 2009-09-17 23:00:28

4

对于大型表格,您需要在MySQL配置文件中增加缓冲区大小和缓存限制。

此外,您在搜索中使用的MATCH()列需要与索引中的列相同。

14

它不可能是没有问题...

这当然不是!

任何纯粹由被阻止的单词组成的搜索词都会默默地失败。由于最小/最大长度限制和/或停用词文件,可能会阻止单词。

我发现默认的停用词文件过于激进,它阻止了许多有效的搜索。此外,默认的最小长度为4的游戏经常会出现人们可能想要搜索的缩略词。我将ft_min_word_len减少到3并完全删除了停止列表(ft_stopword_file ='')。 Doc:http://dev.mysql.com/doc/refman/5.1/en/fulltext-fine-tuning.html

您也可以检查搜索查询以查看它是否仅包含< 4个字母的单词,并且在这种情况下回退到LIKE搜索。没有这样简单的方法来在应用程序级别避开停止列表。

'单词字符'的选择可能无法满足您的需求,而且更改很棘手。例如,搜索“Terry”不符合“Terry's”。一般来说,不支持任何形式的词干,所以“饼干”也不会与“饼干”相匹配。

最后,正如cg提到的,InnoDB不支持。在这个时代,你不希望把所有的数据放在MyISAM表中。

如果您有足够的存储空间,您可以将主要规范版本的数据放在InnoDB表中,然后创建一个单独的MyISAM表,其中包含纯文本内容的副本,纯粹用于作为searchbait。您必须更新这两个表上的更改,但是如果MyISAM表失去完整性,那么至少您只能失去搜索相关行的能力,而不是暴露实际的实时数据并获取应用程序错误。

然后,如果您有空闲的周期,可以在searchbait上实现自己的文本处理并查询单词以解决上述某些限制。例如,您可以转义想要成为单词字符的字符,删除不想成为单词字符的字符,并执行简单的手动英语词干。