Взвешивание результатов поиска

0

PHP/MySQL. У меня есть база данных, полная фильмов в стиле YouTube. Каждое видео имеет название и категорию. Видео и категории имеют отношение m: n.

Я бы хотел, чтобы мои посетители могли искать видео и вводить поисковые запросы в одном поле поиска. Я не могу понять, как вернуть лучшие результаты поиска на основе категории, вхождения в имени.

Какой лучший способ сделать что-то подобное? Подсчет очков? = > Проверить для каждого условия поиска, происходит ли это во имя видео; если да, призовите видео точку; проверьте, включено ли видео в категории, которые также содержатся в поисковом запросе; если да, призовите его. Сортировка по полученным номерам? Это звучит очень дорого с точки зрения использования ЦП.

Теги:
algorithm
search

3 ответа

1
Лучший ответ

Сначала используйте полнотекстовый поиск. Это может быть либо полнотекстовый поиск в MySql, либо какой-то экстренный полнотекстовый поисковый движок. Я рекомендую sphinx. Он очень быстр, прост и даже может быть интегрирован с MuSQL с использованием SphinxSE (так что индексы поиска выглядят как локальные таблицы в MySQL). Однако вы должны установить и настроить его.

Во-вторых, подумайте о разделении результатов поиска по типу поиска. Любой полнотекстовый поиск возвращает список согласованных элементов, отсортированных по релевантности. Вы можете искать по всем полям и получать один список. Это плохая идея, потому что хиты по имени и хитам по категории будут смешанными. Чтобы решить эту проблему, вы можете выполнять несколько поисков - сначала искать по имени, а затем искать по категориям.

В результате у вас будет два набора соответствия, и у вас будет много вариантов, как отобразить это. Некоторые идеи:

  • объединить 2 набора на основе релевантности, возвращаемой поисковой системой. Это похоже на результат одного запроса, но вы знаете, что каждый элемент (название попало или попало в категорию), чтобы вы могли выделить это.
  • выполните ту же самую плату, что и выше, но назначьте разные веса различным наборам, для релевантности релевантности = 0.7 * name_relevancy + 0.3 * category_relevancy. Это сделает результаты поиска более естественными.
  • выводят результаты на вкладки/группы, например. "Есть N категорий и категорий M, соответствующих вашему запросу).
  • Используйте полосы при отображении результатов. Для каждой страницы (при условии, что вы разбиваете результаты поиска с помощью paginator) dispslay N элементов из первого набора и M элементов из второго набора (вы можете сбросить настройки один за другим или перетасовать элементы). Если в одном из наборов недостаточно элементов, просто получите больше предметов из другого набора, поэтому на странице всегда есть M + N.
  • Любой другой способ, который вы можете себе представить

И вы можете использовать этот метод для любых полей - имя, categroy, actor, director и т.д. Однако чем больше полей вы используете, тем больше поисковых запросов вы должны выполнить

  • 0
    офигенно, именно то, что я искал. спасибо и добро пожаловать на SO
2

Использование полнотекстового поиска может помочь: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html#function_match

Вы можете проверить сразу несколько столбцов на выражение.

1

Я не думаю, что вы можете не смотреть на название и категорию каждого фильма для каждого поиска. Таким образом, использование ЦП для этого является данным. Если вас беспокоит использование процессора в сортировке, в большинстве случаев это будет незначительно, так как вы будете сортировать только те элементы, у которых больше нуля.

Сказав это, то, что вы, вероятно, хотите, это система, которая частично основана на правилах и частично основана на точках. Например, если у вас есть заголовок, равный поисковому термину, он должен быть первым, независимо от точек. Архитектор поиска, чтобы вы могли легко добавлять правила и настраивать точки, как вы сочтете нужными, чтобы обеспечить наилучшие результаты.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню