2011-04-06 4 views
0

J'essaie de faire une recherche plein texte sur un champ pour faire correspondre des parties spécifiques d'une chaîne. Considérons une longue chaîne contenant des valeurs de tableau comme 201 ::: 1 ### 193 ::: 5 ### 193 ::: 6 ### 202 ::: 6. ### sépare un élément de tableau et ::: sépare la clé => val. Maintenant, ma compréhension de la correspondance est qu'il peut correspondre à des parties d'une chaîne en mode booléen. mais quand je fais quelque chose dans les lignes demysql fulltext MATCH, CONTRE

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

Tableau exemple

CREATE TABLE users_profile (
id int (11) NULL par défaut,
texte profile,
views int (11) NULL par défaut ,
friends_list text,
settings text,
points int (11) NULL par défaut,
KEY id (id),
FULLTEXT KEY settings (settings)
) MOTEUR = MyISAM DEFAULT CHARSET = UTF-8;

Je reçois zéro résultat. Toutes les idées sont les bienvenues.

+0

Afficher un exemple de table et les champs marque que vous whant à sélectionner, s'il vous plaît. –

+0

J'ai mis à jour avec la structure de la table. Seuls les paramètres de champ doivent être recherchés – mbouclas

+0

Je pense que ":" est réservé à la recherche booléenne. Jetez un oeil à: http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_ft_boolean_syntax et essayez de modifier ce paramètre. Cela pourrait aider. Regardez également tous les autres paramètres commençant par "ft_" sur cette page. – eisberg

Répondre

1

Les index MySQL fulltext sont conçus pour stocker des mots en langage naturel. Votre échantillon

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

Est composé de seulement des nombres comme les parties significatives, telles que 201,1,192 ... Parce que les mots très courts sont rarement utiles, ft_min_word_len est habituellement placé à 4, ce qui signifie qu'aucun des nombres sont même dans l'index.

Fulltext n'est pas la solution à ce problème.


Si tout ce que vous vouliez est de comte combien de fois une expression existe dans la colonne, il suffit d'utiliser

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

penses-tu que regex fonctionnerait à la place? – mbouclas

+0

Oui, REGEX ou LIKE, puisqu'il n'y a qu'un seul terme. Même si ce sera lent. – RichardTheKiwi

+0

problème est regex aussi loin que je teste, ne peut pas me donner un nombre de match par ligne, et c'est ce qui est le plus important ici – mbouclas