2015-08-19 95 views
1

我有一个MyISAM表中的所有PHP函数的列表的数据库,其列function_namedescription索引使用FULL TEXT索引。我发现了一些..怪异的行为与MATCH...AGAINST()查询,例如:MySQL匹配意外的行为

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' 

第二个查询仅返回一行,而第一个查询什么也没有返回。

我也注意到,这往往发生在description列“共同”的话(这应该是无关的),例如,搜索“而”而不是像当同样的事情发生“array_pop ”。但是,“count”确实会返回预期的行为。

此外,它得到意想不到的行是我新插入的行,大部分(几乎所有新插入的行都不起作用,但我不确定是否所有不工作的行都是新的插入)

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

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背后的数学问题......反对查询,但有人知道我可能会遇到这个问题的原因吗?

+0

我不知道MySql,但在Sql Server中,答案是1)你需要更新你的全文索引,或者2)你的全文索引排除了太多的“普通”或“垃圾”字,需要重新配置。 – RBarryYoung

回答

1

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