有趣的全文搜索行为

时间:2016-10-27 21:17:35

标签: mysql sql full-text-search

Crating 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           |

是的,这是正常的,但如果我搜索“反对”

SELECT * FROM Footable 
    WHERE MATCH 
        (foo_colmn)
    AGAINST
        ('against' IN BOOLEAN MODE);

---------------
id |foo_colmn |
---|----------|

什么都不返回。我无法理解发生了什么。 (Sory关于我可怜的英语)

1 个答案:

答案 0 :(得分:0)

您需要了解停用词(和简短词)。

停用单词是常见的或被认为无效的单词,因此它们将从索引中删除。 MySQL包含一个标准列表。 "反对"将是一个典型的停用词("是",""," a","然而"等等。)

您可以阅读here

解决方案是重建全文索引,没有停用词(或使用自定义列表)。

编辑。

我应该注意到,对于一些(现在怀疑是辉煌的)原因,InnoDB停止词与MyISAM停止词不同。所以,我可以猜测你正在使用MyISAM,因为"反对"只列在一个列表中。