PHP/MySQL. У меня есть база данных, полная фильмов в стиле YouTube. Каждое видео имеет название и категорию. Видео и категории имеют отношение m: n.
Я бы хотел, чтобы мои посетители могли искать видео и вводить поисковые запросы в одном поле поиска. Я не могу понять, как вернуть лучшие результаты поиска на основе категории, вхождения в имени.
Какой лучший способ сделать что-то подобное? Подсчет очков? = > Проверить для каждого условия поиска, происходит ли это во имя видео; если да, призовите видео точку; проверьте, включено ли видео в категории, которые также содержатся в поисковом запросе; если да, призовите его. Сортировка по полученным номерам? Это звучит очень дорого с точки зрения использования ЦП.
Сначала используйте полнотекстовый поиск. Это может быть либо полнотекстовый поиск в MySql, либо какой-то экстренный полнотекстовый поисковый движок. Я рекомендую sphinx. Он очень быстр, прост и даже может быть интегрирован с MuSQL с использованием SphinxSE (так что индексы поиска выглядят как локальные таблицы в MySQL). Однако вы должны установить и настроить его.
Во-вторых, подумайте о разделении результатов поиска по типу поиска. Любой полнотекстовый поиск возвращает список согласованных элементов, отсортированных по релевантности. Вы можете искать по всем полям и получать один список. Это плохая идея, потому что хиты по имени и хитам по категории будут смешанными. Чтобы решить эту проблему, вы можете выполнять несколько поисков - сначала искать по имени, а затем искать по категориям.
В результате у вас будет два набора соответствия, и у вас будет много вариантов, как отобразить это. Некоторые идеи:
И вы можете использовать этот метод для любых полей - имя, categroy, actor, director и т.д. Однако чем больше полей вы используете, тем больше поисковых запросов вы должны выполнить
Использование полнотекстового поиска может помочь: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html#function_match
Вы можете проверить сразу несколько столбцов на выражение.
Я не думаю, что вы можете не смотреть на название и категорию каждого фильма для каждого поиска. Таким образом, использование ЦП для этого является данным. Если вас беспокоит использование процессора в сортировке, в большинстве случаев это будет незначительно, так как вы будете сортировать только те элементы, у которых больше нуля.
Сказав это, то, что вы, вероятно, хотите, это система, которая частично основана на правилах и частично основана на точках. Например, если у вас есть заголовок, равный поисковому термину, он должен быть первым, независимо от точек. Архитектор поиска, чтобы вы могли легко добавлять правила и настраивать точки, как вы сочтете нужными, чтобы обеспечить наилучшие результаты.
Изменить: в случае точного совпадения названия вы можете воспользоваться индексом DB, а не искать всю таблицу. По желанию, это относится и к категории.