2011-03-21 98 views
1

我在列上使用FULLTEXT索引,当我使用MATCH .... AGAINST在布尔模式中为小于4个字符的任何搜索项长度然后它不返回任何记录。当我使用LIKE时,它确实会返回记录。 可能是什么问题?是否是因为某些MySQL限制,比如它没有索引长度小于4个字符的字或FULLTEXT索引特有的某些限制?MATCH AGAINST在MySQL中没有显示记录时,搜索字符串少于4个字符

感谢

+0

尝试像'AGAINST('database'WITH QUERY EXPANSION)一样运行'WITH QUERY EXPANSION';' – Pentium10 2011-03-21 06:21:38

+0

我使用了“WITH QUERY EXPANSION”,但仍然没有运气。 – Ali 2011-03-21 06:35:48

回答

2

检查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

+0

假设这个ft_main_word_len被设置为4,那么为什么当我使用LIKE运算符运行相同的查询时会带来结果而不是MATCH AGAINST?是否因为LIKE不使用像MATCH AGAINST这样的FULLTEXT索引? – Ali 2011-03-21 06:33:11

+0

据我所知'LIKE'只使用普通索引(如果有的话)并回退到表扫描。 – ChrisWue 2011-03-21 07:00:52

+0

好吧,我将“ft_main_word_len”值更改为3,然后重新启动MySQL,然后在两个表中删除FULLTEXT索引,然后重新创建FULLTEXT索引,然后再次运行该查询,但仍然没有运气。虽然当我用LIKE'%key%'运行相同的查询时,它就可以工作。 – Ali 2011-03-21 11:43:59