为什么MYSQL FullText搜索匹配AGAINST不能正常工作?

时间:2014-01-22 10:59:22

标签: mysql sql

我有一个非常简单的表,有两行:

 create table T1(text varchar(50), FULLTEXT KEY `text` (`text`)
               ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
 insert into T1 (text) values ('local unit shipping fee 12');
 insert into T1 (text) values ('local unit insernational fee 21');

好的,现在我跑了:

1- Select * from T1 where MATCH(text) AGAINST ('local');没有结果

2- Select * from T1 where MATCH(text) AGAINST ('fee');没有结果

3- Select * from T1 where MATCH(text) AGAINST ('+fee' In Boolean mode);没有结果

4- Select * from T1 where MATCH(text) AGAINST ('+shipping' In Boolean mode); 1行出来

5- Select * from T1 where MATCH(text) AGAINST ('+unit' In Boolean mode); 2行出来。

你可以在这里看到sqlfiddle http://sqlfiddle.com/#!2/9a0866/13

请清楚地向我解释一下MYSQL全文搜索是如何工作的,为什么它没有显示这么简单的逻辑查询?

我很困惑!

1 个答案:

答案 0 :(得分:4)

你的语料库很小,在自然语言模式下,“本地”和“费用”字被视为停用词并被忽略 - 它们在任何地方都匹配。

这是因为作为默认启发式,您不希望查询返回100GB数据集的每一行或每隔一行。

默认匹配阈值为0.5,要在特定示例中消除它,您需要添加更多行:

create table T1(text varchar(50), FULLTEXT KEY `text` (`text`)
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

insert into T1 (text) values ('local unit shipping fee 12');
insert into T1 (text) values ('a row');
insert into T1 (text) values ('another row');
insert into T1 (text) values ('and another row');
insert into T1 (text) values ('local unit international fee 21');

select * from T1 where MATCH(text) AGAINST ('local');

Output:
TEXT
local unit shipping fee 12
local unit international fee 21

当您添加更多没有“本地”一词的行时,查询将得分低于阈值,您将看到返回的相关行。另请注意,“费用”一词对于自然语言查询而言太短。它的长度至少需要4个字符。

布尔全文搜索没有阈值。