问题:具有多对多关系的狮身人面像索引

我正在尝试建立一个 Sphinx 索引,它在艺术品和流派之间具有基本的多对多关系:

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

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

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

在我的狮身人面像配置文件中,我有类似的东西

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

据我所知,这是来自文档,关于多值属性和sql_attr_multi

但显然那里没有提到领带表,我无法理解它是如何被带入配置的。我只是想搜索“印象派”以产生属于该类型的艺术品(如果在其他领域看到该术语,则酌情加权)

解答

在这种情况下,我会考虑忽略属性功能。创建用于搜索艺术品的流派字段的最简单方法是将流派表“反规范化”到 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 字段中搜索“印象派”的艺术品的 sphinx 搜索将返回“行”。

Logo

华为、百度、京东云现已入驻,来创建你的专属开发者社区吧!

更多推荐