有趣的全文搜索行为

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" 仅在一个列表中。