2011-11-15 27 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