为什么MYSQL全文搜索匹配不能正常工作?

为什么MYSQL全文搜索匹配不能正常工作?,mysql,sql,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 insernat

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

 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-从T1中选择*将文本与“本地”匹配;没有结果

2-从T1中选择*,其中匹配文本与“费用”;没有结果

3-从T1中选择*,其中在布尔模式下将文本与“+费用”匹配;没有结果

4-从T1中选择*,其中在布尔模式下将文本与“+装运”匹配;一排出来

5-从T1中选择*,其中在布尔模式下将文本与“+单位”匹配;两排出来

你可以在这里看到sqlfiddle

请向我解释清楚MYSQL全文搜索是如何工作的,为什么对于这样一个非常简单的逻辑查询它什么都没有显示


我糊涂了

您的语料库非常小,以至于在自然语言模式下,“本地”和“费用”词被视为停止词而被忽略-它们在任何地方都匹配

发生这种情况的原因是,作为默认的启发式方法,您不希望查询返回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
当您添加更多不带单词“local”的行时,查询的分数将低于阈值,您将看到返回的相关行。还要注意,“费用”一词对于自然语言查询来说太短了。它的长度必须至少为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
当您添加更多不带单词“local”的行时,查询的分数将低于阈值,您将看到返回的相关行。还要注意,“费用”一词对于自然语言查询来说太短了。它的长度必须至少为4个字符


布尔全文搜索没有阈值

真的,我的真实DB有200000行&“本地单位运费12”是其中一行吗?为什么这么小?这也没有任何意义,因为查询应该以任何大小工作,不管它应该显示正确结果的表有多小。我又添加了2行,但仍然没有结果@Tum两行=阈值0.5 2行匹配,2行不匹配,您将不会得到结果。正如我提到的,再添加三行以超过阈值。在这里,我添加了很多行,但实际上仍然不起作用,我真正的DB有200000行&“本地单位运费12”就是其中之一?为什么这么小?这也没有任何意义,因为查询应该以任何大小工作,不管它应该显示正确结果的表有多小。我又添加了2行,但仍然没有结果@Tum两行=阈值0.5 2行匹配,2行不匹配,您将不会得到结果。正如我提到的,再添加三行以超过阈值