在MySQL中匹配搜索少于4个字符的字符串时不显示记录
我在列上使用全文索引,当我在布尔模式下对长度小于4个字符的任何搜索项使用MATCH…,则它不会返回任何记录。当我使用LIKE时,它会返回记录。 有什么问题吗?这是因为MySQL有一些限制,比如它不索引长度小于4个字符的单词,还是有一些特定于全文索引的限制在MySQL中匹配搜索少于4个字符的字符串时不显示记录,mysql,match,full-text-search,against,Mysql,Match,Full Text Search,Against,我在列上使用全文索引,当我在布尔模式下对长度小于4个字符的任何搜索项使用MATCH…,则它不会返回任何记录。当我使用LIKE时,它会返回记录。 有什么问题吗?这是因为MySQL有一些限制,比如它不索引长度小于4个字符的单词,还是有一些特定于全文索引的限制 谢谢检查您的ft\u min\u word\u len系统变量。它定义要索引的单词的最小长度 更新:好的,我用ft\u min\u word\u len=3做了一些测试 首先是一个测试表 CREATE TABLE `test`.`table1
谢谢检查您的
ft\u min\u word\u len
系统变量。它定义要索引的单词的最小长度
更新:好的,我用ft\u min\u word\u 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)
SELECT * FROM `test`.`table1` t1 WHERE match(`t1`.`name`) against ('led*' in boolean mode)
返回以下内容:
1 This has led in it
2 Led is nice
1 This has led in it
2 Led is nice
3 Leds are nicer
运行此:
SELECT * FROM `test`.`table1` t1 WHERE match(`t1`.`name`) against ('led' in boolean mode)
SELECT * FROM `test`.`table1` t1 WHERE match(`t1`.`name`) against ('led*' in boolean mode)
返回以下内容:
1 This has led in it
2 Led is nice
1 This has led in it
2 Led is nice
3 Leds are nicer
因此,《金融时报》的搜索工作如期进行。您试图查找的单词可能实际上类似于
led
,而不是单个单词led
?尝试使用查询扩展运行,像这样对('database'进行查询扩展)代码>我使用了“WITH QUERY EXPANSION”,但仍然不走运。假设ft_main_word_len设置为4,那么为什么我使用LIKE操作符运行相同的查询时会产生结果,但不匹配?是不是因为LIKE不使用全文索引LIKE MATCH?据我所知,LIKE只使用普通索引(如果有)并返回到表扫描。好的,我将“ft_main_word_len”值更改为3,然后重新启动MySQL,然后在两个表中删除全文索引,然后重新创建全文索引,然后再次运行该查询,但仍然没有成功。虽然当我使用类似“%key%”的命令运行同一个查询时,它仍然有效。您能提供一些示例数据吗?该查询类似于:SELECT*FROM table1 t1,table2 t2,其中t1.id=t2.recordid,并对('led'在布尔模式下)匹配('t1.title'),对('led'在布尔模式下匹配('t2.name'))
但如果我使用此查询,则会产生结果:从表1 t1、表2 t2中选择*,其中t1.id=t2.recordid和t1.title类似于“%led%”和t2.name类似于“%led%”
以下查询也会产生结果:从表1 t1、表2 t2中选择*,其中t1.id=t2.recordid和匹配('t1.title')('led*'在布尔模式下)并将('t2.name')与('led*'在布尔模式下)匹配。