2010-11-01 6 views
4

Je souhaite utiliser Sphinx pour de nombreuses applications. J'ai pris le cas des questions et des tags ici dans StackOverflow pour l'illustration.Recherche many-to-many avec Sphinx

Une question peut être associée à de nombreuses étiquettes et vice versa pour une étiquette.

Donc dans le mysql, j'ai 3 tables: question, tag, question_tag.

Je voudrais rechercher des questions qui contiennent autant de balises dans les ensembles "java", "sphinx", "mysql", "hibernate" que possible. Ainsi, le résultat pourrait provenir de questions avec 3 matchs, 2 matchs ou 1 match.

Actuellement, je crée un champ qui enchaîne toutes ces variables avec de l'espace et qui a un champ sphinx. Mais cela semble stupide et crée beaucoup de frais généraux lors de l'ajout et la suppression de balises. Il y aura une façon plus intelligente, non?

Répondre

4

Jetez un oeil à MVA - Attributs multi valeur, dans la documentation MVA et sql_attr_multi.

J'ai utilisé ceci dans le passé pour rechercher des "intérêts" contre une "personne". Donc, je peux aimer la musique rock et regarder le rugby. Sphinx peut indexer ceci dans un tableau et vous pouvez les rechercher en utilisant la correspondance OR ou AND.

0

Le plus simple devrait être de simplement joindre les tables et le groupe par l'ID de la question. Sphinx fait le reste pour vous:

source src_questions{ 
    select question_id, question_subject, question_body, tag_value from question \ 
    JOIN question_tag on question.question_id = question_tag.question_id \ 
    JOIN tag on question_tag.tag_id = tag.tag_id 
    GROUP BY question_id 
} 

qui part du principe que vous avez les colonnes suivantes dans vos tables

table question:

question_id INT 
question_subject VARCHAR or TEXT 
question_body VARCHAR or TEXT 

table tag:

tag_id INT 
tag_value VARCHAR or TEXT 

question_tag_table:

question_id INT 
tag_id INT 
+0

Puisque c'est un cas many2many, vous allez créer de nombreux enregistrements pour les mêmes questions. Un autre problème plus sérieux est que si la question rencontre plus de 1 mot-clé de votre phase de recherche, la note est encore faible. –

Questions connexes