2009-04-10 8 views
0

J'ai une table où j'insère, par exemple, des images et les noms des couleurs trouvées dans lesdites images. La chaîne de couleur ressemble à quelque chose comme "blanc, jaune, orange, noir".Contournement pour le seuil MySQL 50% pour la recherche naturelle

Depuis que j'en ai beaucoup, le seuil de 50% commence à baisser certaines couleurs, car elles apparaissent sur la plupart des lignes.

Tout le point de la table est de pouvoir effectuer une recherche par couleur. Est-ce que quelqu'un a une solution de contournement, ou devrais-je juste abandonner et aller pour Sphinx ou quelque chose de similaire? Recompiler MySQL n'est probablement pas une option.

J'ai entendu dire que certaines personnes ajoutent simplement des lignes fictives à la table pour contourner les 50%, mais cela semble assez désespéré.

Répondre

6

Ce n'est pas un problème à résoudre avec la recherche en texte intégral. A la place, vous avez besoin d'une table enfant avec une ligne par couleur et par image.

La couleur doit être une clé étrangère à une table de couleurs, de sorte que votre table enfant devient réellement une relation plusieurs-à-plusieurs entre l'image et la couleur.

create table color ( 
id int not null primary key auto_increment, 
name varchar64) 
); 

create table image_color (
    image_id int references image(id), 
    color_id int reference color(id), 
    unique constraint (image_id, color_id) 
) ; 

ensuite indexer la relation (et de lui donner une contrainte unique sur le tuple (image_id, color_id)

Ensuite, pour trouver toutes les images avec une couleur particulière.

select a.* from image a 
join image_color b on (a.id = b.image_id) 
join color c on (b.color_id = c.id) 
where c.name = 'yellow'; 
+0

+1 pour écrire ce que je voulais écrire, seulement plus rapidement –

2

Le point entier de la table est de pouvoir rechercher par couleur. Est-ce que quelqu'un a une solution de contournement

Oui, utilisez les recherches BOOLEAN MODE, qui ne sont pas affectées par le seuil de 50% et sont moins imprévisibles. Mais, +1 à la réponse de tpdi, je ne peux pas imaginer pourquoi vous utilisez la recherche fulltext au lieu d'un simple tableau de jointure listant les couleurs. C'est un simple problème de stockage logique oui/non, il n'est pas nécessaire de faire glisser dans le texte les complexités du découpage des mots, des mots, des mots vides, des mots trop courts ("rouge" ne sera pas indexé par défaut) et surtout que vous devez utiliser les vieilles tables de MyISAM désagréables pour obtenir la fonctionnalité du tout!

La recherche en texte intégral est difficile en général et n'est pas particulièrement bien implémentée en MySQL. Il devrait être votre dernier recours pour quand vous avez vraiment besoin de rechercher des mots dans de grandes étendues de texte, et non comme une caractéristique de choix.

+0

Le mode booléen renvoie des résultats qui ne valent rien. –

+0

Pourquoi sont-ils "sans valeur"? Quels résultats «mauvais» voyez-vous? Ça fonctionne bien pour moi. – bobince

Questions connexes