2011-01-15 2 views
5

Je suis en train de mettre en place un indice Sphinx avec un grand nombre à plusieurs relation de base entre les œuvres et les genres:index sphynx avec de nombreux à-plusieurs

artworks 
--------------- 
id 
title 
description 

genres 
--------------- 
id 
name 

artwork_genres 
--------------- 
artworks_id 
genres_id 

Dans mon fichier de configuration sphynx J'ai quelque chose comme

source src_artwork { 
    ... 
    sql_query = SELECT id, title, description FROM artworks 
    sql_attr_multi = uint tag from query; SELECT id,name FROM genres 
} 

C'est de la documentation, pour autant que je peux comprendre, sur multi-valued attributes et sql_attr_multi

Mais, évidemment, il n'y a aucune mention de la table de cravate là-dedans et je ne peut pas comprendre comment cela est introduit dans la config. Je voudrais simplement pour une recherche sur "Impressionnisme" pour aboutir à des œuvres appartenant à ce genre (pondéré comme approprié si le terme est vu dans les autres champs)

Répondre

6

Je considérerais ignorer la fonctionnalité des attributs dans ce cas. La manière la plus simple de créer un champ de genre pour rechercher des œuvres d'art consiste à «dé-normaliser» la table des genres dans sql_query.

Dans la clause FROM de votre requête SQL, vous joindriez la table des genres aux œuvres d'art via la table de liaison. Dans la clause SELECT, vous pouvez alors GROUP_CONCAT genres.name dans une colonne, qui devient un champ Sphinx à rechercher.

Votre sql_query pourrait ressembler à ceci:

source src_artwork { 
     ... 
    sql_query    = SELECT a.id, a.title, a.description, GROUP_CONCAT(DISTINCT g.name SEPARATOR ' ') AS genre \ 
     FROM artworks AS a \ 
     LEFT JOIN artwork_genres AS ag ON ag.artworks_id = a.id \ 
     LEFT JOIN genres AS g ON g.id = ag.genres_id 
     GROUP BY a.id; 
} 

Ensuite, une recherche d'œuvres d'art à la recherche sphynx pour « impressionisme » dans le champ de @genre retournera la « ligne ».

+0

a dû ajouter un 'GROUP BY id' à la fin de l'instruction SQL, et cela a fonctionné! J'avais entendu parler de 'GROUP_CONCAT' mais je ne l'ai pas mis ensemble qu'il pourrait faire des listes de relations comme ceci - sorte de vieux problème en SQL. Énorme sauveteur dans ce cas. Merci! – sbeam

+0

Oh oui - bon point. J'ai modifié la réponse pour refléter votre commentaire. Heureux que tu es parvenu à le faire fonctionner! – richbs

+0

Vraiment fait l'affaire. Merci! – Samin

Questions connexes