MySQL FULLTEXT无法正常工作
我试图使用MySQL的FULLTEXT索引为我的PHP Web应用程序添加搜索支持。
我创建了一个测试表(使用MyISAM类型,带有单个文本字段a
)并输入了一些示例数据。 现在,如果我是正确的,下面的查询应该返回这两行:
SELECT * FROM test WHERE MATCH(a) AGAINST('databases')
但它不返回。 我已经做了一些研究,并且尽我所知地做了一切正确的事情 - 表是MyISAM表,FULLTEXT索引已设置。 我试着从提示符和phpMyAdmin中运行查询,但没有运气。 我错过了关键的东西吗?
更新:好的,虽然科迪的解决方案在我的测试案例中工作,但它似乎不适用于我的实际表格:
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)
“标题”是在字长限制内,我怀疑这是一个停止词(我不知道如何获得列表)。 有任何想法吗?
添加更多数据。 默认情况下,MySQL会忽略表中50%或更多行中的任何单词,因为它认为这将是一个“噪音”字。
如果表格中的行数很少,那么经常会遇到这种50%的限制(例如,如果您有两行,每个单词至少占行数的50%!)。
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 / Solr或Sphinx
链接地址: http://www.djcxy.com/p/75341.html