2009-07-14 119 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