我有一个非常简单的表,有两行:
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全文搜索是如何工作的,为什么它没有显示这么简单的逻辑查询?
我很困惑!
答案 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个字符。
布尔全文搜索没有阈值。