MySQL MATCH ... AGAINST有时会找到答案,有时却找不到答案

时间:2010-11-01 17:30:44

标签: sql mysql full-text-search

当我查询我的数据库时,以下两个查询返回相同的(预期)结果:

SELECT * FROM articles 
 WHERE content LIKE '%Euskaldunak%'

SELECT * FROM articles 
 WHERE MATCH (content) AGAINST ('+"Euskaldunak"' IN BOOLEAN MODE)

它正在搜索的内容字段中的文字如下:“......这些Euskaldunak,或新人......”

但是,对同一个表的以下查询将返回预期的单个结果:

SELECT * FROM articles 
 WHERE content LIKE '%PCC%'

以下查询返回空结果:

SELECT * FROM articles 
 WHERE MATCH (content) AGAINST ('+"PCC"' IN BOOLEAN MODE)

与此结果相匹配的内容字段中的文字如下所示:“...波特兰社区学院(PCC)是最大的......”

我无法弄清楚为什么搜索“Euskaldunak”与MATCH ... AGAINST语法一起工作但“PCC”没有。有没有人看到我没有看到的东西?

(另外:“PCC”不是此字段中的常用短语 - 没有其他行包含该单词,因此自然语言搜索不应排除它。)

2 个答案:

答案 0 :(得分:3)

我可以立即想到两件事。第一个是你的ft_min_word_len值设置为超过3个字符。任何小于ft_min_word_len长度的“单词”都不会被索引。

第二个是超过50%的记录包含'PCC'字符串。与超过50%的记录匹配的全文搜索被认为是无关紧要的,并且不返回任何内容。

全文索引与常规字符串索引具有不同的规则。例如,有一个停用词列表,所以某些常见的词,如,,和,不会被索引。

答案 1 :(得分:3)

您的全文最小字长可能设置得太高。我认为默认值是4,这可以解释你所看到的。如果您希望所有单词都被索引而不管长度如何,请将其设置为1.

运行此查询:

show variables like 'ft_min_word_len';

如果值大于3并且您希望对短于此的单词进行匹配,请编辑/etc/my.cnf并使用适合您的应用程序的值在[mysqld]部分中添加或更新此行:

ft_min_word_len = 1

然后重启MySQL并重建全文索引,你应该全部设置。