MySQL匹配意外行为

时间:2015-08-19 16:03:17

标签: mysql full-text-indexing

我有一个MyISAM表中所有PHP函数列表的数据库,其列function_namedescription使用FULL TEXT索引编制索引。我使用MATCH...AGAINST()查询获得了一些奇怪的行为,例如:

select * from functions where match(function_name) against('array_search');
select * from functions where function_name = 'array_search'

返回预期的行,每个查询返回一行,但随后:

select * from functions where match(function_name) against('each');
select * from functions where function_name = 'each'

第二个查询只返回一行,而第一个查询根本不返回任何内容。

我也注意到这往往会发生在#34;普通" description列中的单词(应该是不相关的),例如,搜索"同时发生的事情是"但不适用于" array_pop"。然而,"计数"确实会返回预期的行为。

此外,它获得意外行为的行是我新插入的行,大多数情况下(几乎所有新插入的行都不起作用,但我不确定所有不起作用的行是否都有效新插入的)

唯一新插入的行是有奇怪的函数名称,如:

select * from functions where match(function_name) AGAINST('asdadasdadasdadasdadasdad')

返回预期的行为。我尝试过执行类似的事情:

ALTER TABLE functions DROP INDEX description;
ALTER TABLE functions DROP INDEX function_name;
ALTER TABLE `functions` ADD FULLTEXT(`function_name`);
ALTER TABLE `functions` ADD FULLTEXT(`description`);
select * from functions where match(function_name) against('each');
select * from functions where function_name = 'each';

在最后一个查询中仍然只返回一行,而MATCH()... AGAINST查询没有任何行。我不确定MATCH ... AGAINST查询背后的数学是什么,但是有谁知道我可能遇到这个问题的原因?

1 个答案:

答案 0 :(得分:1)

您正在遇到stop words,即非常常见的单词被忽略。再向下滚动MyISAM,each就在那里。您可以编辑该列表或使用空文件忽略任何停止词语的