2009-08-25 12 views
2

J'ai besoin d'un moyen de faire une recherche dans plus de 50 colonnes, varchar et int, dans une table spécifique. J'ai vu des gens recommander Lucene et Sphinx, mais je n'ai aucune idée de comment les utiliser et le Full-Text de MySQL ne me permettra pas de combiner plus de 16 colonnes ou les deux colonnes varchar et int.Recherche PHP et MySQL sur plusieurs colonnes

Répondre

2

Si votre table ne reçoit pas beaucoup de mise à jour ou si un délai avant que les modifications soient reflétées dans la recherche est acceptable, vous pouvez peut-être créer une table dérivée périodiquement régénérée qui combine toutes vos colonnes dans un LONGTEXT. index de texte intégral sur cela.

+0

le problème est qu'il y a environ 65 000 lignes à ce stade, environ 500 étant ajoutées chaque semaine. –

+0

Si les 500 sont dans un lot, plutôt que de manière aléatoire, il serait facile de régénérer la table dérivée après le lot. En supposant que les insertions viennent à des moments aléatoires, cependant, 500 par semaine est toujours seulement un peu plus d'une heure en moyenne. Vous pourriez probablement lancer un job cron toutes les minutes qui régénérerait la table dérivée si des changements avaient été faits et ne ressentiraient aucune douleur particulière. – chaos

+0

+1 pour une table dénormalisée avec des index MySQL FULLTEXT. Cependant, je considérerais le sphinx comme une première option. –

0

Vous pourriez envisager de faire pivoter votre table et de la hacher un peu. Prenez toutes vos colonnes varchar et stockez les données dans une table "Search_Strings"; faire la même chose pour les colonnes int:

table originale

id 
always_field1 
always_field2 
varstring1 
... 
varstringx 
int1 
... 
inty 

nouvelle main_table (même nombre de lignes que le tableau original, mais très peu de colonnes)

id 
always_field1 
always_field2 

Search_Strings (

id (FK to main_table) 
old_column_name 
string_value 

Search_Ints

id (FK to main_table) 
old_column_name 
int_value 

Avec cette configuration, vous avez besoin d'un index de texte intégral uniquement sur string_value. Désolé, je ne peux rien suggérer avec Sphinx ou Lucene car je ne les connais pas.

+0

Pour indexer cette table de chaînes à l'aide de Sphinx, il vous suffit de vous assurer que la table "strings" possède une clé id unique (pensez à des séquences). cf: http://www.postneo.com/2009/02/06/sphinx-search-with-postgresql –

Questions connexes