Поиск через Sphinx; книги, тэги, авторы.

Крот

Новичок
Поиск через Sphinx; книги, тэги, авторы.

Осваиваю потихоньку сфинкс, интересует следующий вопрос.

Мне хочется через один запрос к сфинксу искать сразу информацию по книгам, тэгам, авторам.
Я делаю несколько сорсов а-ля

[SQL]
SELECT books.book_id as id, books.title, books.description, tags.tag_title, "" author_title FROM books, tags, books2tags WHERE books2tags.book_id = books.book_id AND tags.tag_id = books2tags.tag_id
[/SQL]

[SQL]
SELECT books.book_id as id, books.title, books.description, "" as tag_title, authors.author_title[/B] FROM books, authors, books2authors WHERE books2authors.book_id = books.book_id AND authors.author_id = books2authors.author_id
[/SQL]

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

Это нормально? Или есть какой-то другой путь?

PS: Сперва я хотел вынести тэги, авторов и т.д. в multi value attribute (MVA), но потом понял, что мне вместо одного запроса придется делать несколько (в индекс с тэгами, авторами и т.д.) и решил так не делать, т.к. непонятно как потом эти разные(по-сути) результаты "релевантно объединить".

Такие дела...
 

crocodile2u

http://vbolshov.org.ru
Во-первых, у сфинкса есть свой сайт с форумом, на котором более оперативно и грамотно ответят на эту тему.

А во-вторых, когда ты получаешь ответ от сфинкса - то как ты понимаешь, что именно нашлось - при твоей структуре? То есть, как ты понимаешь, что в этом документе сфинкс нашел тег, в этом - книгу, а в этом - автора?

А если, кстати, задача стоит отыскать только книгу (то есть, спрашиваем "Лев Толстой" - получаем "Война и мир", "Анна Каренина") - то можно все имена авторов (и то же самое с тегами) запихнуть в один сорс, без дублирования ИД книги (например, group_concat() для мускуля, для постгре также реализуемо). И сфинкс будет искать по всем полям - название книги, теги, авторы.

Запрос будет примерно такой:

Код:
SELECT books.id, books.title, books.description, 
  group_concat(author_title) AS all_authors, 
  group_concat(tag_title) AS all_ tags FROM books 
JOIN books2authors ON (books2authors.book_id = books.id) 
JOIN books2tags ON (books2tags.book_id = books.id) 
JOIN authors ON (authors.id = books2authors.author_id) 
JOIN tags ON (tags.id = books2authors.tag_id) 
GROUP BY books.id, books.title, books.description
 

Крот

Новичок
А во-вторых, когда ты получаешь ответ от сфинкса - то как ты понимаешь, что именно нашлось - при твоей структуре?
В конкретно моём случае это не так важно... Я ищу по всем нужным мне полям, предварительно выставив веса приоритетов; другими словами - мне без разницы в каком поле он найдет эту информацию - мне просто важно, чтобы она была релевантной. Я получаю book_id и мне этого уже достаточно.

Хотя узнать что именно нашлось - задачка тоже вполне себе интересная.

Огромное спасибо, не знал что такое существует. Много где можно применить.
 
Сверху