FULLTEXT搜索不在第二列上工作

时间:2011-11-15 11:25:37

标签: mysql full-text-search

我正在尝试针对两列进行FULLTEXT搜索。第一列包含主题名称,第二列包含别名,例如:

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

架构详细信息:

这些列都是VARCHAR(100),我尝试了多种类型的FULLTEXT索引。我已经为两个列尝试了单独的索引,并且我尝试了一个覆盖两个列的索引。

搜索在根据名称列返回结果时工作正常,但是没有任何内容来自于all_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

2 个答案:

答案 0 :(得分: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时,您可能不得不求助于在all_match上使用LIKE。

其中一个全文搜索引擎也可以解决您的问题:

答案 1 :(得分:0)

您确定在BOOLEAN MODE中正确使用星号吗?

  

星号用作截断(或通配符)运算符。不像   其他运营商,应该附加到受影响的词。   如果单词以*运算符之前的单词开头,则匹配。

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