有趣的全文搜索行为
Interesting full-text-search Behaviour
装箱table
CREATE TABLE `Footable` (
`id` int NOT NULL AUTO_INCREMENT,
`foo_colmn` varchar(255) NOT NULL,
FULLTEXT (foo_colmn),
PRIMARY KEY (`id`)) ENGINE=MyISAM;
插入一些行
INSERT INTO Footable (`foo_colmn`) VALUES ("against1111 , against");
INSERT INTO Footable (`foo_colmn`) VALUES ("against1111");
INSERT INTO Footable (`foo_colmn`) VALUES ("against");
并使用 BOOLEAN MODE 进行搜索
SELECT * FROM Footable WHERE MATCH
(foo_colmn)
AGAINST
('against1111' IN BOOLEAN MODE);
-------------------------
id |foo_colmn |
---|--------------------|
1 |against1111 , against |
2 |against1111 |
是的,这很正常,但如果我搜索 "against"
SELECT * FROM Footable
WHERE MATCH
(foo_colmn)
AGAINST
('against' IN BOOLEAN MODE);
---------------
id |foo_colmn |
---|----------|
Return 没什么。我不明白这是怎么回事。 (抱歉我的英语不好)
您需要了解停用词(和短词)。
停用词是常见的或被认为无用的词,因此它们已从索引中删除。 MySQL 中包含一个标准列表。 "Against" 将是一个典型的停用词(以及 "is"、"the"、"a"、"nevertheless" 等)。
您可以阅读它们 here。
解决方案是重建没有停用词(或使用自定义列表)的全文索引。
编辑。
我应该注意到,出于某些(现在怀疑是绝妙的)原因,InnoDB 停用词与 MyISAM 停用词不同。因此,我可以猜测您正在使用 MyISAM,因为 "against" 仅在一个列表中。
装箱table
CREATE TABLE `Footable` (
`id` int NOT NULL AUTO_INCREMENT,
`foo_colmn` varchar(255) NOT NULL,
FULLTEXT (foo_colmn),
PRIMARY KEY (`id`)) ENGINE=MyISAM;
插入一些行
INSERT INTO Footable (`foo_colmn`) VALUES ("against1111 , against");
INSERT INTO Footable (`foo_colmn`) VALUES ("against1111");
INSERT INTO Footable (`foo_colmn`) VALUES ("against");
并使用 BOOLEAN MODE 进行搜索
SELECT * FROM Footable WHERE MATCH
(foo_colmn)
AGAINST
('against1111' IN BOOLEAN MODE);
-------------------------
id |foo_colmn |
---|--------------------|
1 |against1111 , against |
2 |against1111 |
是的,这很正常,但如果我搜索 "against"
SELECT * FROM Footable
WHERE MATCH
(foo_colmn)
AGAINST
('against' IN BOOLEAN MODE);
---------------
id |foo_colmn |
---|----------|
Return 没什么。我不明白这是怎么回事。 (抱歉我的英语不好)
您需要了解停用词(和短词)。
停用词是常见的或被认为无用的词,因此它们已从索引中删除。 MySQL 中包含一个标准列表。 "Against" 将是一个典型的停用词(以及 "is"、"the"、"a"、"nevertheless" 等)。
您可以阅读它们 here。
解决方案是重建没有停用词(或使用自定义列表)的全文索引。
编辑。
我应该注意到,出于某些(现在怀疑是绝妙的)原因,InnoDB 停用词与 MyISAM 停用词不同。因此,我可以猜测您正在使用 MyISAM,因为 "against" 仅在一个列表中。