我正在尝试建立一个Sphinx索引,其中包含艺术品和流派之间基本的多对多关系:
artworks
---------------
id
title
description
genres
---------------
id
name
artwork_genres
---------------
artworks_id
genres_id
在我的sphinx配置文件中,我有类似
的内容source src_artwork {
...
sql_query = SELECT id, title, description FROM artworks
sql_attr_multi = uint tag from query; SELECT id,name FROM genres
}
据我所知,这是来自multi-valued attributes和sql_attr_multi
的文档但显然没有提到那里的领带表,我无法理解它是如何进入配置的。我只是喜欢搜索“印象派”来制作属于该类型的艺术作品(如果在其他领域中看到这个术语,则适当加权)
答案 0 :(得分:7)
在这种情况下,我会考虑忽略属性功能。创建用于搜索艺术品的类型字段的最简单方法是将类型表“去规范化”到sql_query中。
在SQL查询的FROM子句中,您可以通过链接表将类型表加入到艺术作品中。在SELECT子句中,然后可以将GROUP_CONCAT genres.name放入一个列中,该列成为要搜索的Sphinx字段。
您的sql_query可能如下所示:
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;
}
然后,在@genre字段中搜索寻找“印象派”的艺术品的狮身人面像将返回“行”。