Сложный поиск. Как реализовать?

denisOg

Новичок
Как сделать сложный поиск. Например, есть много пользователей, у пользователей есть любимые фильмы, и есть много фильмов. У каждого фильма есть теги. Пользователь вводит теги я делаю поиск по фильмам.

Учитывать нужно несколько условий:
  • убрать из поиска те категории, на которые он не подписан.
  • Убрать из поиска те фильмы, которые он уже видел.
  • …….возможно другие условия.
Учитывать нужно множество вариантов для сортировки:
  • с начало те, которые входят в такие же категории, как и любимые фильмы.
  • отсортировать так, что бы фильмы с большим числом совпадений по тегам были выше.
  • Отсортировать фильмы по их внутреннему рейтингу .
  • Взять актеров из любимых фильмов пользователя и отсортировать фильмы в том порядке, где больше всего актеров из его любимых фильмов.
  • ………… возможно другие сортировки (на по названию фильма, году выпуску, актеру)
Делать проект хочу на PHP (YII). Как лучше хранить данные? Как организовать поиск, что бы работал максимально быстро.

Можно конечно сделать обычный реляционный запрос с WHERE и ORDER BY (с кучей LEFT JOIN), но может есть варианты побыстрее.

Один из вариантов решения по сортировки по актерам: есть актеры у фильма, ID которых можно занести в массив, начиная с известных. Например, FILM_ACTORS[1,34,56,7,43,23,45,6]. У пользователя есть любимые фильмы, из актеров которых можно составить массив (актеры, которые попадаются чаще, становятся в начало массива): USER_FAV_ACTORS[3,45,6,43].

Нужно сравнивать эти два массива и отсортировать их по тому, насколько их совпадение близко к началу массива USER_FAV_ACTORS.

Есть какие нибудь мысли, коллеги?
 

Redjik

Джедай-мастер
Как лучше хранить данные?
MySQL
Как организовать поиск, что бы работал максимально быстро.
Sphinx
Один из вариантов решения по сортировки по актерам: есть актеры у фильма, ID которых можно занести в массив, начиная с известных. Например, FILM_ACTORS[1,34,56,7,43,23,45,6]. У пользователя есть любимые фильмы, из актеров которых можно составить массив (актеры, которые попадаются чаще, становятся в начало массива): USER_FAV_ACTORS[3,45,6,43].
Это и есть обычный реляционный запрос.
 

WMix

герр M:)ller
Партнер клуба
PHP:
select *
from select in(select на что подписан + фильтр get/post  из поиска)
where возможно другие условия.
order by с начало те, которые входят в такие же категории, как и любимые фильмы. [отсортировать так, что 
бы фильмы с большим числом совпадений по тегам были выше.] asc,
по их внутреннему рейтингу desc
дальше дибажить нада
 

fixxxer

К.О.
Партнер клуба
Вот только эффективности от такого запроса ожидать не стоит, в большинстве случаев будет fullscan + temp.table + filesort. Плюс возможно еще и correlated subquery.
 

WMix

герр M:)ller
Партнер клуба
разбивай на части, php тебе зачем?
 

fixxxer

К.О.
Партнер клуба
Во-первых, не вижу, чем мне поможет разбить на части.
Во-вторых зачем мне велосипеды городить, если можно взять хранилище, которое умеет делать сортировку-группировку по мере скана, а не после?
В-третьих, это не мне )
 

WMix

герр M:)ller
Партнер клуба
либо доклад выложить страниц эдак на 30, либо коротко идею рассказать. без этих данных не добраться, их нужно изначально иметь в любом виде и либо конкретнее, либо абстрактнее вопрос желается. )
 

fixxxer

К.О.
Партнер клуба
Если ты про партиционирование и map-reduce на php, то это, конечно, можно, но неясно зачем.
 

denisOg

Новичок
Во-вторых зачем мне велосипеды городить, если можно взять хранилище, которое умеет делать сортировку-группировку по мере скана, а не после?
Это что такое? Где можно почитать? Или это надстройка над мускулом?
 

dimitrius

Новичок
Я тоже над этим вопросом работал, не эксперт, сфинкс в моем случае не подошел, так, как хостинг, а не вдс. Сделал через sql + кеширование популярных запросов(каждый запрос хранится в БД, если > 5 = популярный, но это у меня так как посещала небольшая)
 

denisOg

Новичок
Я тоже над этим вопросом работал, не эксперт, сфинкс в моем случае не подошел, так, как хостинг, а не вдс. Сделал через sql + кеширование популярных запросов(каждый запрос хранится в БД, если > 5 = популярный, но это у меня так как посещала небольшая)
хм.... В том то и дело, что популярных запросов будет очень мало. Даже если теги совпадут, то есть другие условия и сортировки у каждого пользователя. Плюс, если пользователь добавил в избранное фильм, то это влияет на его поисковой результат.

Или вы имели ввиду хранить подзапросы? Это я и планировал делать.

если сфинкс не подошел, потому что не сервер, то это не причина от него отказываться мне :)

спасибо.
 
Сверху