我正在尝试针对两列进行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
答案 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