2011-01-15 13 views
5

Estoy intentando configurar un índice de esfinge con una relación de muchos a muchos básica entre obras de arte y géneros:índice de esfinge con muchos-a-muchos relación

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

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

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

En mi archivo de la esfinge de configuración que tengo algo como

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

Esto es de la documentación, por lo que yo puedo entender, en multi-valued attributes y sql_attr_multi

Pero, obviamente, no se hace mención de la mesa empate en allí y me no puedo entender cómo se trae eso a la configuración. Simplemente me gustaría buscar "Impresionismo" para obtener obras de ese género (ponderado según corresponda si el término aparece en los otros campos)

Respuesta

6

Considero ignorar la función de atributos en este caso. La forma más sencilla de crear un campo de género para buscar obras de arte es "desnormalizar" la tabla de géneros en sql_query.

En la cláusula FROM de su consulta SQL, UNE la tabla de géneros a las obras de arte a través de la tabla de enlaces. En la cláusula SELECT, puede agrupar GROUP_CONCAT genres.name en una columna, que se convierte en un campo Sphinx para buscar.

Su sql_query podría tener este aspecto:

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; 
} 

A continuación, una búsqueda de la esfinge de obras de arte en busca de "impresionismo" en el campo @genre devolverá la "fila".

+0

tenía que agregar un 'GROUP BY id' al final de la declaración de SQL, ¡y funcionó! Había oído hablar de 'GROUP_CONCAT' pero no lo armé para establecer listas de relaciones como esta: un viejo problema en SQL. Enorme salvavidas en este caso. ¡Gracias! – sbeam

+0

Oh sí, buen punto. He editado la respuesta para reflejar tu comentario. ¡Me alegra que lo hayas hecho funcionar! – richbs

+0

Realmente funcionó. ¡Gracias! – Samin

Cuestiones relacionadas