Взвешивание результатов поиска - PullRequest
0 голосов
/ 27 августа 2010

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

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

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

Ответы [ 3 ]

2 голосов
/ 27 августа 2010

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

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

1 голос
/ 20 февраля 2011

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

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

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

  1. объединить 2 набора на основе показателя релевантности, возвращаемого поисковой системой. Это выглядит как результат одного запроса, но вы знаете, что представляет собой каждый элемент (совпадение имени или попадания в категорию), поэтому вы можете выделить это
  2. сделать то же поле, что и выше, но назначить разные веса разным наборам, например, для релевантности = 0,7 * name_relevancy + 0,3 * category_relevancy. Это сделает результаты поиска более естественными
  3. разбивать результаты на вкладки / группы, например 'По вашему запросу найдено N названий и M категорий)
  4. Использовать полосы при отображении результатов. Для каждой страницы (при условии, что вы разбиваете результаты поиска с помощью пагинатора) выведите на экран N элементов из первого набора и M элементов из второго набора (вы можете задать наборы по одному или перемешать элементы). Если в одном из наборов не хватает предметов, просто получите больше предметов из другого набора, поэтому на странице всегда есть M + N предметов
  5. Любой другой способ представить себе

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

1 голос
/ 19 февраля 2011

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

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

Редактировать: В случае точного совпадения заголовков вы можете воспользоваться индексом БД, а не искать всю таблицу. Опционально, то же самое относится и к категории.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...