3

我创建了下表。

CREATE TABLE `test` (
`name` VARCHAR(50) NOT NULL,
`id` INT(10) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`),
FULLTEXT INDEX `name` (`name`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM;

有以下数据

insert into test (name) values('apple');
insert into test (name) values('course');

我正在搜索以下查询。

select * from test  where MATCH (name) AGAINST ('apple' IN BOOLEAN MODE);
select * from test  where MATCH (name) AGAINST ('course' IN BOOLEAN MODE);

现在的问题是第一个选择查询返回了正确的行。但是第二个查询没有返回任何行。我用其他词进行了测试,它们工作正常。但是,如果数据中包含“课程”一词,并且当我们搜索“课程”时,它不会返回任何行。

有人可以帮我解决这个奇怪的问题吗?

4

2 回答 2

1

使用运算符不是最好的like吗?

select * from test  where name LIKE 'course';

甚至REGEXP

select * from test  where name RegexP 'course';

你可以试试:

select * from test  where MATCH (name) AGAINST ('course*' IN BOOLEAN MODE);

不过,它通常在部分单词搜索中最失败......所以请向我们展示您表中的一些示例数据。

Bingo:似乎 MYSQL 充满了停用词

所以这就是所说的和你需要做的:)

“从 MySQL 5.5.6 开始,如果 character_set_server 是 ucs2、utf16 或 utf32,则使用 latin1 加载和搜索停用词文件。如果在服务器字符集为 ucs2、utf16 或 utf32 时使用 FULLTEXT 索引创建任何表,它应该使用此语句进行修复..

REPAIR TABLE tbl_name QUICK;"

于 2013-01-04T10:09:26.243 回答
0

在您的 AGAINST 查询中添加“IN BOOLEAN MODE”
LIKE AGAINST ('course*' IN BOOLEAN MODE) 这将非常有效

于 2013-08-22T05:44:03.733 回答