сфинкс и ассоциации один-ко-многим - PullRequest
0 голосов
/ 14 ноября 2009

Примеры, которые я видел для поиска сфинксов, на самом деле не используют объединения. Если бы у меня была такая схема (одна книга имеет несколько рецензий),

create table book ( id int auto_increment, title varchar(200), summary longtext );
create table reviews ( id int auto_increment, book_id int, review longtext );

Какой запрос я должен задать sphinx, чтобы я мог найти слова в обзоре, и он вернет соответствующую книгу. Если я использую обычное внутреннее объединение, каждый отзыв будет одним документом, который не соответствует тому, что видно на сайте (одна страница содержит информацию о книге и все отзывы).

Что вы предлагаете? Должен ли я создать денормализованную таблицу для поисковых документов и использовать отображаемую страницу в качестве входных данных, например ::

create table sphinx_input ( 
   id int, -- corresponds 1..1 to book.id
   contents longtext -- everything on the page
);

и изменить это для каждого изменения в книгах и обзорах?

Ответы [ 2 ]

2 голосов
/ 24 ноября 2009

Вы захотите использовать GROUP_CONCAT, чтобы собрать все ваши данные для обзоров в единый результат в sql_query от Sphinx. Возможно что-то вроде следующего:

SELECT books.id, books.title, books.summary,
  GROUP_CONCAT(reviews.review SEPARATOR ' ') AS reviews
FROM books LEFT OUTER JOIN reviews ON reviews.book_id = books.id
WHERE books.id >= $start AND books.id <= $end
GROUP BY books.id, books.title, books.summary

Я бы порекомендовал использовать внешнее объединение, чтобы книги без рецензий также по-прежнему возвращались.

1 голос
/ 16 ноября 2009

Вы можете просто позволить ему индексировать рецензии как обычно, а затем выполнить объединение идентификаторов рецензий с идентификаторами книг в mysql после возвращения результатов.

...