MySQL FULLTEXT无法正常工作

时间:2009-07-14 14:16:59

标签: mysql full-text-search myisam

我正在尝试使用MySQL的FULLTEXT索引为我的PHP Web应用添加搜索支持。

我创建了一个测试表(使用MyISAM类型,带有单个文本字段a)并输入了一些示例数据。现在如果我是对的,下面的查询应该返回这两行:

SELECT * FROM test WHERE MATCH(a) AGAINST('databases')

然而它没有返回。我做了一些研究,据我所知,我正在做的一切 - 表是一个MyISAM表,设置了FULLTEXT索引。我试过从提示符和phpMyAdmin运行查询,没有运气。我错过了一些至关重要的东西吗?


更新:好的,虽然Cody的解决方案在我的测试用例中起作用,但它似乎不适用于我的实际表格:

CREATE TABLE IF NOT EXISTS `uploads` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` text NOT NULL,
  `size` int(11) NOT NULL,
  `type` text NOT NULL,
  `alias` text NOT NULL,
  `md5sum` text NOT NULL,
  `uploaded` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

我正在使用的数据:

INSERT INTO `uploads` (`id`, `name`, `size`, `type`, `alias`, `md5sum`, `uploaded`) VALUES
(1, '04 Sickman.mp3', 5261182, 'audio/mp3', '1', 'df2eb6a360fbfa8e0c9893aadc2289de', '2009-07-14 16:08:02'),
(2, '07 Dirt.mp3', 5056435, 'audio/mp3', '2', 'edcb873a75c94b5d0368681e4bd9ca41', '2009-07-14 16:08:08'),
(3, 'header_bg2.png', 16765, 'image/png', '3', '5bc5cb5c45c7fa329dc881a8476a2af6', '2009-07-14 16:08:30'),
(4, 'page_top_right2.png', 5299, 'image/png', '4', '53ea39f826b7c7aeba11060c0d8f4e81', '2009-07-14 16:08:37'),
(5, 'todo.txt', 392, 'text/plain', '5', '7ee46db77d1b98b145c9a95444d8dc67', '2009-07-14 16:08:46');

我现在正在运行的查询是:

SELECT * FROM `uploads` WHERE MATCH(name) AGAINST ('header' IN BOOLEAN MODE)

哪个应该返回第3行,header_bg2.png。相反,我得到另一个空结果集。我的布尔搜索选项如下:

mysql> show variables like 'ft_%';
+--------------------------+----------------+
| Variable_name            | Value          |
+--------------------------+----------------+
| ft_boolean_syntax        | + -><()~*:""&| |
| ft_max_word_len          | 84             |
| ft_min_word_len          | 4              |
| ft_query_expansion_limit | 20             |
| ft_stopword_file         | (built-in)     |
+--------------------------+----------------+
5 rows in set (0.02 sec)

“标题”在单词长度限制范围内,我怀疑它是一个停用词(我不知道如何获取列表)。有什么想法吗?

2 个答案:

答案 0 :(得分:49)

添加更多数据。默认情况下,MySQL将忽略表中50%或更多行中的任何单词,因为它认为它是一个“噪声”单词。

如果表中的行数非常少,通常会经常达到这个50%的限制(即如果你有两行,那么每个单词至少占行数的50%!)。

答案 1 :(得分:24)

MySQL全文搜索有两种模式:自然语言模式和布尔模式。自然语言模式的限制是“...... 50%或更多行中存在的单词被认为是常见且不匹配。如果没有给出修饰符,则全文搜索是自然语言搜索。”自然语言是默认模式。这在全文文档中有记录:

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

如果您将查询切换为使用布尔模式:

SELECT * FROM test WHERE MATCH(a) AGAINST('databases' IN BOOLEAN MODE)

然后返回两行。

布尔模式有自己的限制,一个常见的限制是它不按相关性顺序返回其行。总的来说,它确实提供了比自然语言模式更多的功能和灵活性,因此您可能最终会使用它。

如果您的应用程序将严重依赖全文搜索,您可能需要考虑更多功能齐全的软件包,例如Lucene/SolrSphinx