mysql全文MATCH,AGAINST

时间:2011-04-06 06:24:34

标签: mysql

我正在尝试对字段进行全文搜索以匹配字符串的特定部分。考虑一个长字符串,保存数组值,如201 ::: 1 ### 193 ::: 5 ### 193 ::: 6 ### 202 ::: 6。 ###分隔一个数组元素和::: seperates key => val。现在我对匹配的理解是它可以在布尔模式下匹配字符串的部分。但是当我按照

的方式做点什么的时候
`SELECT 
a.settings 
, MATCH(a.settings) AGAINST('201:::1') as relevance 
, b.maxrelevance 
, (MATCH(a.settings) AGAINST('201:::1'))/b.maxrelevance*100 as relevanceperc 
FROM 
users_profile a 
, (SELECT MAX(MATCH(settings) AGAINST('201:::1')) as maxrelevance FROM users_profile LIMIT 1) b 
WHERE 
MATCH(a.settings) AGAINST('201:::1') 
ORDER BY 
relevance DESC;`  

表格示例

创建表users_profile
  id int(11)默认为NULL,
  profile文字,
  views int(11)默认为NULL,
  friends_list文字,
  settings文字,
  points int(11)默认为NULL,
  KEY idid),
  FULLTEXT KEY settingssettings
)ENGINE = MyISAM DEFAULT CHARSET = utf8;

我的结果为零。欢迎任何想法。

1 个答案:

答案 0 :(得分:1)

MySQL全文索引旨在存储自然语言单词。你的样本

201 ::: 1 ### 193 5 ::: ### 193 ::: 6 ### 202 6 :::。 ###

仅由数字作为重要部分组成,例如201,1,192 ...因为非常短的单词很少有用,ft_min_word_len通常设置为4,这意味着没有数字是偶数索引。

Fulltext不是解决此问题的方法。


如果您只想计算表中存在表达式的次数,请使用

(length(a.setting) - length(replace(a.setting,'201:::1',''))) / length('201:::1')