MySQL 匹配意外行为
MySQL Match unexpected behavior
我有一个数据库,其中包含 MyISAM table 中所有 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'
Returns 预期行,每个查询 returning 一行,但随后:
select * from functions where match(function_name) against('each');
select * from functions where function_name = 'each'
第二个查询只有 return 一行,而第一个查询 return 什么也没有。
我还注意到,description
列中的"common"个词往往会出现这种情况(这应该是无关紧要的),例如,搜索[=37时也会出现同样的情况=] 但不是像 "array_pop" 这样的东西。但是,"count" 确实 return 预期的行为。
此外,它得到意外行为的行是我新插入的行,大部分(几乎所有新插入的行都不起作用,但我不确定是否所有不起作用的行都是新插入)
唯一有效的新插入行是奇怪的函数名称,例如:
select * from functions where match(function_name) AGAINST('asdadasdadasdadasdadasdad')
Returns 预期的行为。我试过执行类似的东西:
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';
最后一个查询仍然 return 只有一行, MATCH() ...AGAINST 查询没有行。我不确定 MATCH...AGAINST 查询背后的数学是什么,但是有人知道我可能 运行 参与其中的原因吗?
您 运行 进入 stop words,即非常常见的单词,ignored.Scroll 进一步向下用于 MyISAM,each
进入 there.You 可以编辑列出或使用空文件忽略任何停用词。
我有一个数据库,其中包含 MyISAM table 中所有 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'
Returns 预期行,每个查询 returning 一行,但随后:
select * from functions where match(function_name) against('each');
select * from functions where function_name = 'each'
第二个查询只有 return 一行,而第一个查询 return 什么也没有。
我还注意到,description
列中的"common"个词往往会出现这种情况(这应该是无关紧要的),例如,搜索[=37时也会出现同样的情况=] 但不是像 "array_pop" 这样的东西。但是,"count" 确实 return 预期的行为。
此外,它得到意外行为的行是我新插入的行,大部分(几乎所有新插入的行都不起作用,但我不确定是否所有不起作用的行都是新插入)
唯一有效的新插入行是奇怪的函数名称,例如:
select * from functions where match(function_name) AGAINST('asdadasdadasdadasdadasdad')
Returns 预期的行为。我试过执行类似的东西:
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';
最后一个查询仍然 return 只有一行, MATCH() ...AGAINST 查询没有行。我不确定 MATCH...AGAINST 查询背后的数学是什么,但是有人知道我可能 运行 参与其中的原因吗?
您 运行 进入 stop words,即非常常见的单词,ignored.Scroll 进一步向下用于 MyISAM,each
进入 there.You 可以编辑列出或使用空文件忽略任何停用词。