2009-07-14 118 views
24

我正在尝试使用MySQL的FULLTEXT索引为我的PHP web应用程序添加搜索支持。MySQL FULLTEXT不能正常工作

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

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

但它返回无。我已经做了一些研究,并且尽我所知地做了一切正确的事情 - 表是MyISAM表,FULLTEXT索引已设置。我试着从提示符和phpMyAdmin中运行查询,但没有运气。我错过了关键的东西吗?


UPDATE:好,而科迪的解决方案在我的测试情况下的工作似乎并没有对我的实际工作表中:

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) 

“头”字长度的限制之内,我怀疑这是一个停用词(我不知道如何获取列表)。有任何想法吗?

+0

你可以在这里看到停用词列表https://dev.mysql.com/doc/refman/5。5/en/fulltext-stopwords.html,用于innodb http://dev.mysql.com/doc/refman/5.7/en/innodb-ft-default-stopword-table.html或运行SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD; – 2017-01-18 10:53:53

回答

46

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

由于表格中的行数很少,通常经常触及这个50%的限制(即如果有两行,每个字至少占行的50%!)。

23

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

+0

谢谢,我没有意识到关于50%的规则:) – Ross 2009-07-14 14:37:13

+1

如果你问我,这是一个更好的答案。 – TheCarver 2012-07-07 16:23:33