2011-01-13 4 views
0

Fond J'ai une table avec max 2000 lignes, l'utilisateur devrait rechercher jusqu'à 6 colonnes.
Je ne sais pas à l'avance ce qu'il cherche et je veux une recherche concaténés (de search1 ET terme2 ET ...)MySQL Fulltext vs J'aime

Problème Dans ces colonnes, j'ai l'un ID pas la description simple (c.-à-i avoir l'identifiant de la ville, pas son nom). Donc, je pensais à deux solutions:

  1. Créer une autre table, où je mets des mots-clés (1 clé/ligne), puis je recherche à l'aide, il COMME search1% OU COMME terme2% ...
  2. Ajouter un champ à la table existante où je mets tous les mots-clés, puis faire un FULLTEXT sur ce

Lequel est le meilleur? Je sais que les lignes sont FEWS de sorte qu'il n'y aura pas de gros problèmes de perfomance, mais j'espère qu'ils deviennent de plus en plus :)

Exemple
C'est ma table:

ID | TOWN | TYPE | ADRESSE |
11 | 14132 | 3 | boulangerie rue 220
13 | 45632 | 8 | la première ligne devrait trouver 12 rue principale

14132 = Londres
45632 = New York,
3 = Client
8 = Administrateur

Le typage utilisateur "London Client".

+0

Je ne comprends pas la situation. Pouvez-vous montrer la structure de votre table et un exemple de rangée? –

+0

en utilisant le moteur de recherche n'est pas une option? (Comme Lucene, ne savent pas ce qui est l'environnement de serveur que vous utilisez) – Maxym

Répondre

1

Si vous allez simplement utiliser une série de LIKEs, j'aurais pensé qu'il serait logique d'utiliser un index FULLTEXT, la raison principale étant qu'il vous permettrait d'utiliser des requêtes booléennes plus complexes à l'avenir . (Comme l'indique @Quassnoi, vous pouvez simplement créer un index si vous n'en avez pas besoin pour un champ spécifique.)

Cependant, il convient de noter que fulltext a ses limites - les mots qui sont communs à toutes les lignes ont un «score» faible et ne correspondra donc pas aussi clairement que si vous aviez effectué une série de LIKE. (D'un autre côté, vous pouvez bien sûr obtenir un «score» à partir d'une requête FULLTEXT, ce qui peut être utile selon la manière dont vous voulez classer les résultats.)

0

Vous ne devez pas créer un champ distinct, étant donné qu'un indice FULLTEXT peut être créé sur plusieurs champs:

CREATE fx_mytable_fields ON mytable (field1, field2, field3) 

SELECT * 
FROM mytable 
WHERE MATCH(field1, field2, field3) AGAINST ('+search1 +search2') 

Cela renverra tous les enregistrements qui contiennent search1 et search2 dans l'un des champs, comme ceci:

field1 field2  field3 
--  --   -- 
search1 something search2 

ou ceci:

field1   field2  field3 
--    --   -- 
search1 search2 something something else 
+0

yep, mais je n'ai pas la chaîne de requête dans ce tableau, je n'ai que l'id de faire une jointure – tampe125

+1

@ tampe125: dans ce cas, vous devrait utiliser 'LIKE' ou' REGEXP' (qui est lent), utiliser un moteur 'FULLTEXT' externe, comme' Sphinx' (qui nécessite l'installation) ou créer une table dénormalisée supplémentaire, l'indexer et la remplir en temps opportun . – Quassnoi

0

Étant donné que vous avez les données dans des tableaux séparés , vous devez avoir un index FULLTEXT sur chacun des champs consultables dans chaque table.Après cela, il suffit de construire la requête avec les JOINs en place afin que vous puissiez fulltext MATCH CONTRE la version texte du champ, et non le numéro de clé étrangère.

SELECT user.id, user.name, town.name 
FROM user 
LEFT JOIN town ON user.town = town.id 
WHERE MATCH(user.name, town.name) AGAINST (...)