【发布时间】:2015-08-19 16:03:16
【问题描述】:
我有一个 MyISAM 表中所有 PHP 函数列表的数据库,其列 function_name 和 description 使用 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'
第二个查询只返回一行,而第一个查询什么也不返回。
我还注意到,description 列中的“常用”词往往会发生这种情况(这应该是无关紧要的),例如,在搜索“while”时会发生同样的事情,但不会像“数组弹出”。但是,“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...AGAINST 查询背后的数学原理是什么,但有谁知道我可能会遇到这种情况的原因吗?
【问题讨论】:
-
我不知道 MySql,但在 Sql Server 中,答案可能是 1)您需要更新全文索引,或 2)您的全文索引排除了太多“常见”或“垃圾”词,需要重新配置。