我在列上使用FULLTEXT索引,当我使用MATCH .... AGAINST在布尔模式中为小于4个字符的任何搜索项长度然后它不返回任何记录。当我使用LIKE时,它确实会返回记录。 可能是什么问题?是否是因为某些MySQL限制,比如它没有索引长度小于4个字符的字或FULLTEXT索引特有的某些限制?MATCH AGAINST在MySQL中没有显示记录时,搜索字符串少于4个字符
感谢
我在列上使用FULLTEXT索引,当我使用MATCH .... AGAINST在布尔模式中为小于4个字符的任何搜索项长度然后它不返回任何记录。当我使用LIKE时,它确实会返回记录。 可能是什么问题?是否是因为某些MySQL限制,比如它没有索引长度小于4个字符的字或FULLTEXT索引特有的某些限制?MATCH AGAINST在MySQL中没有显示记录时,搜索字符串少于4个字符
感谢
检查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');
运行此:
返回此:
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
?
假设这个ft_main_word_len被设置为4,那么为什么当我使用LIKE运算符运行相同的查询时会带来结果而不是MATCH AGAINST?是否因为LIKE不使用像MATCH AGAINST这样的FULLTEXT索引? – Ali 2011-03-21 06:33:11
据我所知'LIKE'只使用普通索引(如果有的话)并回退到表扫描。 – ChrisWue 2011-03-21 07:00:52
好吧,我将“ft_main_word_len”值更改为3,然后重新启动MySQL,然后在两个表中删除FULLTEXT索引,然后重新创建FULLTEXT索引,然后再次运行该查询,但仍然没有运气。虽然当我用LIKE'%key%'运行相同的查询时,它就可以工作。 – Ali 2011-03-21 11:43:59
尝试像'AGAINST('database'WITH QUERY EXPANSION)一样运行'WITH QUERY EXPANSION';' – Pentium10 2011-03-21 06:21:38
我使用了“WITH QUERY EXPANSION”,但仍然没有运气。 – Ali 2011-03-21 06:35:48