2011-04-06 60 views
0

我想在字段上进行全文搜索以匹配字符串的特定部分。考虑一个长字符串保存数组值如201 ::: 1 ### 193 ::: 5 ### 193 ::: 6 ### 202 ::: 6。 ###分隔数组元素和:::分开键=> val。现在我对匹配的理解是,它可以匹配布尔模式中的字符串部分。但是当我做mysql全文MATCH,反对

`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;` 

表例如

CREATE TABLE users_profile
id INT(11)默认为NULL线的东西,
profile文本,
views INT(11)默认为NULL ,
friends_list text,
settings text,
points INT(11)默认NULL,
KEY idid),
全文键settingssettings
)ENGINE = MyISAM的默认字符集= UTF8;

我得到零结果。任何想法都欢迎。

+0

显示表例子,并标出你whant被选定的字段,请。 – 2011-04-06 06:30:17

+0

我已更新表结构。只有字段设置将被搜索 – mbouclas 2011-04-06 06:44:14

+0

我认为“:”是为布尔搜索保留的。看看:http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_ft_boolean_syntax并尝试修改此设置。这可能有帮助。也可以看看本页面中以“ft_”开头的所有其他设置。 – eisberg 2011-04-06 06:47:09

回答

1

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

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

仅由数字组成,如201,1,192 ......因为很短的单词很少有用,所以ft_min_word_len通常设置为4,这意味着没有数字是偶数该指数。

全文不是解决这个问题的方法。


如果你想一切都是为了计数表达式列多少次存在,只是用

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

你认为正则表达式会起作用吗? – mbouclas 2011-04-07 07:30:22

+0

是的,REGEX或LIKE,因为有一个单词。尽管它会很慢。 – RichardTheKiwi 2011-04-07 07:32:20

+0

问题是正则表达式,据我测试,不能给我一个匹配每行,这是什么是最重要的位在这里 – mbouclas 2011-04-07 07:41:56