【问题标题】:MySQL - Issue with FULLTEXT search with specific search value 'course'MySQL - 具有特定搜索值“课程”的 FULLTEXT 搜索问题
【发布时间】:2012-12-18 18:05:03
【问题描述】:

我已经创建了下表。

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);

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

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

【问题讨论】:

  • 重新检查插入的数据和拼写
  • @Joddy 这是可能的,但是当它对单词本身和单词匹配非常具体时,最不可能出现拼写错误:)

标签: mysql search full-text-search myisam match-against


【解决方案1】:

在您的 AGAINST 查询中添加“IN BOOLEAN MODE”
LIKE AGAINST(布尔模式下的“课程*”) 这将完全有效

【讨论】:

    【解决方案2】:

    使用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 好像满了stop words

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

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

    REPAIR TABLE tbl_name QUICK;"

    【讨论】:

    • RegexP 正在工作,但我必须使用 FULLTEXT 搜索。因为我需要搜索具有 2000 个字符的多列(VARCHAR)中的单词。我不明白为什么这个特定的词“课程”有问题。
    • Check this out。这不仅仅是course的问题......似乎。
    • 谢谢。问题的原因当然是 mysql 停用词。
    • 我要给你一个 +1 因为我确实遇到了这个问题但无法弄清楚:)
    猜你喜欢
    • 2010-11-22
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 2013-06-04
    • 1970-01-01
    相关资源
    最近更新 更多