2011-01-15 34 views
5

Tôi cố gắng để thiết lập một chỉ số với nhiều-nhiều mối quan hệ cơ bản giữa tác phẩm nghệ thuật và thể loại Sphinx:index Sphinx với nhiều-nhiều mối quan hệ

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

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

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

Trong file Sphinx cấu hình của tôi, tôi có một cái gì đó như

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

Đây là từ các tài liệu, như xa như tôi có thể hiểu được, trên multi-valued attributessql_attr_multi

Nhưng rõ ràng là không có đề cập đến các bảng tie trong đó và tôi không thể hiểu làm thế nào mà được đưa vào cấu hình. Tôi chỉ muốn tìm kiếm "Ấn tượng" để tạo ra các tác phẩm nghệ thuật thuộc thể loại đó (có trọng số thích hợp nếu cụm từ được nhìn thấy trong các trường khác)

Trả lời

6

Tôi sẽ xem xét bỏ qua tính năng thuộc tính trong trường hợp này. Cách đơn giản nhất để tạo một lĩnh vực thể loại để tìm kiếm tác phẩm nghệ thuật là "khử chuẩn hóa" bảng thể loại thành sql_query.

Trong mệnh đề FROM của truy vấn SQL, bạn sẽ THAM GIA bảng thể loại cho các tác phẩm nghệ thuật qua bảng liên kết. Trong mệnh đề SELECT, sau đó bạn có thể GROUP_CONCAT genres.name thành một cột, trở thành một trường Nhân sư để tìm kiếm.

sql_query của bạn có thể trông như thế này:

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

Sau đó, một tìm kiếm nhân sư cho tác phẩm nghệ thuật tìm kiếm "ấn tượng" trong lĩnh vực @genre sẽ trở lại với "hàng".

+0

phải thêm 'GROUP BY id' vào cuối câu lệnh SQL và nó đã hoạt động! Tôi đã nghe nói về 'GROUP_CONCAT' nhưng tôi đã không đặt nó lại với nhau rằng nó có thể làm cho danh sách các mối quan hệ như thế này - loại một vấn đề cũ trong SQL. Cuộc sống khổng lồ trong trường hợp này. Cảm ơn! – sbeam

+0

Ồ vâng - điểm tốt. Tôi đã chỉnh sửa câu trả lời để phản ánh nhận xét của bạn. Tôi vui vì bạn đã làm nó hoạt động! – richbs

+0

Thực sự đã làm các trick. Cảm ơn! – Samin

Các vấn đề liên quan