2011-11-15 63 views
0

我想對兩列進行FULLTEXT搜索。第一個字段持有對象名稱,第二列的別名,如:FULLTEXT搜索不能在第二列上工作

|   name   |  also_match  | 
----------------------------------------------------- 
| Information Technology | IT I.T.   | 
| Mathematics    |      | 
| English     |      | 
| Religious Studies  | RS R.S. RE R.E. | 

架構細節:

這些柱子都是VARCHAR(100),我曾嘗試多種類型的FULLTEXT索引。我已經嘗試了兩個列的單獨索引,並且我嘗試了一個包含兩個列的索引。

在返回基於名稱列的結果時,搜索可以正常工作,但沒有任何關於also_match列的內容。

示例查詢,返回1個結果:

SELECT * 
FROM subjects 
WHERE MATCH(s.name, s.also_match) AGAINST ('*Information*' IN BOOLEAN MODE) 
LIMIT 20 

示例查詢,返回0的結果:

SELECT * 
FROM subjects 
WHERE MATCH(s.name, s.also_match) AGAINST ('*IT*' IN BOOLEAN MODE) 
LIMIT 20 
+0

請張貼表的完整的模式和不工作的一些樣本查詢。 – nikhil500

回答

0

我認爲你的問題是MySQL確實比較短沒有索引的話一定的長度。該長度在ft_min_word_len變量中指定。

例如,假設你的表是這樣的:

+------------------------+------------+----+ 
| name     | also_match | id | 
+------------------------+------------+----+ 
| Information Technology | IT I.T. | 1 | 
| Mathematics   |   | 2 | 
| Religious Studies  | RS   | 3 | 
| Computer Studies  | C.S. CSSS | 4 | 
+------------------------+------------+----+ 

然後下面的查詢工作:

SELECT * FROM `fulltext` f 
WHERE MATCH (also_match) AGAINST ('CS*' IN BOOLEAN MODE); 

+------------------+------------+----+ 
| name    | also_match | id | 
+------------------+------------+----+ 
| Computer Studies | C.S. CSSS | 4 | 
+------------------+------------+----+ 

如果您ft_min_word_len短,那麼很不幸影響到整個服務器和可能會使FULLTEXT指數大得多。

當您檢測到真正簡短的關鍵字或build your own fulltext search時,您可能不得不求助於在also_match上使用LIKE。

其中一個全文搜索引擎也可能能夠解決您的問題:

+0

對不起,添加了額外的信息。 – BadHorsie

+0

我已經更新了我的答案。 –

+0

謝謝,我認爲這是答案。 – BadHorsie

0

你確定你正在使用在布爾模式中正確星號?

星號用作截斷(或通配符)運算符。不像 其他運營商,它應該被附加到受影響的單詞。 如果它們以*運算符前面的單詞開頭,則單詞匹配。

http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html

+0

我試圖修改它只是附加了一個通配符。沒有區別。 – BadHorsie