2009-11-14 3 views
0

Les exemples que j'ai vus pour la recherche sphinx n'utilisent pas vraiment les jointures. Si j'avais un schéma comme celui-ci (un livre a plusieurs critiques),sphinx et associations un-à-plusieurs

create table book (id int auto_increment, title varchar(200), summary longtext); 
create table reviews (id int auto_increment, book_id int, review longtext); 

Quel genre de requête dois-je donner à sphynx afin que je puisse rechercher les mots dans l'examen et il renverra le livre correspondant. Si j'utilise une jointure interne régulière, chaque révision sera un document unique et cela ne correspond pas à ce qui est visible sur le site (une seule page contient des informations sur le livre et toutes les critiques).

Que suggérez-vous? Dois-je créer une table dénormalisé pour les documents de recherche et utiliser la page rendue en entrée .: par exemple

create table sphinx_input ( 
    id int, -- corresponds 1..1 to book.id 
    contents longtext -- everything on the page 
); 

et modifier ce pour chaque changement de livres et de revues?

Répondre

2

Vous devez utiliser GROUP_CONCAT pour collecter toutes vos données pour les révisions dans le résultat unique dans sql_query de Sphinx. Peut-être quelque chose comme ce qui suit:

SELECT books.id, books.title, books.summary, 
    GROUP_CONCAT(reviews.review SEPARATOR ' ') AS reviews 
FROM books LEFT OUTER JOIN reviews ON reviews.book_id = books.id 
WHERE books.id >= $start AND books.id <= $end 
GROUP BY books.id, books.title, books.summary 

Je vous recommande d'utiliser une jointure externe donc des livres sans commentaires sont toujours retournés aussi.

+0

Merci! J'ai installé le plugin Thinking Sphinx pour les rails pour voir comment il le fait, et en effet il le fait avec GROUP_CONCAT. – lmz

+1

J'ai écrit cela, c'est pourquoi la suggestion ci-dessus est la même;) – pat

1

Vous pouvez simplement lui permettre d'indexer les avis comme d'habitude, puis effectuer la jointure des ID de révision pour réserver des identifiants dans mysql après que les résultats reviennent.