我有一个MyISAM表中的所有PHP函数的列表的数据库,其列function_name
和description
索引使用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背后的数学问题......反对查询,但有人知道我可能会遇到这个问题的原因吗?
我不知道MySql,但在Sql Server中,答案是1)你需要更新你的全文索引,或者2)你的全文索引排除了太多的“普通”或“垃圾”字,需要重新配置。 – RBarryYoung