我在列上使用 FULLTEXT 索引,当我在布尔模式下对长度小于 4 个字符的任何搜索词使用 MATCH....AGAINST 时,它不会返回任何记录。当我使用 LIKE 时,它确实返回记录。可能是什么问题呢?是因为 MySQL 的一些限制,比如它不索引长度小于 4 个字符的单词,还是因为 FULLTEXT 索引的某些限制?
谢谢
我在列上使用 FULLTEXT 索引,当我在布尔模式下对长度小于 4 个字符的任何搜索词使用 MATCH....AGAINST 时,它不会返回任何记录。当我使用 LIKE 时,它确实返回记录。可能是什么问题呢?是因为 MySQL 的一些限制,比如它不索引长度小于 4 个字符的单词,还是因为 FULLTEXT 索引的某些限制?
谢谢
检查您的ft_min_word_len
系统变量。这定义了要索引的单词的最小长度。
更新:好的,我做了一些测试ft_min_word_len=3
首先是一个测试表
CREATE TABLE `test`.`table1` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` TEXT NULL ,
PRIMARY KEY (`id`) ,
FULLTEXT INDEX `Name` (`name` ASC) )
ENGINE = MyISAM;
接下来是一些测试数据:
INSERT INTO `test`.`table1` (`id`, `name`) VALUES ('1', 'This has led in it');
INSERT INTO `test`.`table1` (`id`, `name`) VALUES ('2', 'Led is nice');
INSERT INTO `test`.`table1` (`id`, `name`) VALUES ('3', 'Leds are nicer');
INSERT INTO `test`.`table1` (`id`, `name`) VALUES ('4', 'Nothin here');
INSERT INTO `test`.`table1` (`id`, `name`) VALUES ('5', 'some word which does not exists: abcleddef');
运行这个:
SELECT * FROM `test`.`table1` t1 WHERE match(`t1`.`name`) against ('led' in boolean mode)
返回这个:
1 This has led in it
2 Led is nice
运行这个:
SELECT * FROM `test`.`table1` t1 WHERE match(`t1`.`name`) against ('led*' in boolean mode)
返回这个:
1 This has led in it
2 Led is nice
3 Leds are nicer
所以 FT 搜索按预期工作。您试图找到的单词是否有可能实际上类似于leds
而不是单个单词led
?