индекс сфинкса с отношением многие ко многим - PullRequest
5 голосов
/ 15 января 2011

Я пытаюсь настроить индекс Сфинкса с базовым отношением «многие ко многим» между произведениями искусства и жанрами:

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
}

Это, насколько я понимаю, из документов по многозначным атрибутам и sql_attr_multi

Но, очевидно, там нет упоминаний о связующей таблице, и я не могу понять, как это заносится в конфигурацию. Я просто хотел бы, чтобы поиск по «импрессионизму» привел к тому, что произведения искусства принадлежат к этому жанру (при необходимости взвешиваются, если термин встречается в других полях)

1 Ответ

7 голосов
/ 16 января 2011

Я бы рассмотрел игнорирование атрибутов в этом случае. Самый простой способ создать поле жанра, с помощью которого можно искать произведения искусства, - это «ненормализовать» таблицу жанров в sql_query.

В предложении FROM вашего SQL-запроса вы присоедините таблицу жанров к произведениям искусства через таблицу ссылок. В предложении 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 вернет «строку».

...