【问题标题】:MySQL Match unexpected behaviorMySQL 匹配意外行为
【发布时间】:2015-08-19 16:03:16
【问题描述】:

我有一个 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'

第二个查询只返回一行,而第一个查询什么也不返回。

我还注意到,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)您的全文索引排除了太多“常见”或“垃圾”词,需要重新配置。

标签: mysql full-text-indexing


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-23
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多