Сначала воспользуйтесь полнотекстовым поиском. Это может быть либо полнотекстовый поиск MySql, либо какая-то внешняя полнотекстовая поисковая система. Я рекомендую сфинкс . Он очень быстрый, простой и даже может быть интегрирован с MuSQL с помощью SphinxSE (поэтому поисковые индексы выглядят как таблицы в MySQL). Однако вы должны установить и настроить его.
Во-вторых, подумайте о разделении результатов поиска по типу поиска. Любой вид полнотекстового поиска вернет список подходящих элементов, отсортированных по релевантности. Вы можете искать по всем полям и получить единый список. Это плохая идея, потому что хиты по имени и хиты по категории будут смешанными. Чтобы решить эту проблему, вы можете сделать несколько поисков - сначала поиск по имени, а затем поиск по категории.
В результате у вас будет два подходящих набора, и у вас будет много вариантов, как это отобразить. Некоторые идеи:
- объединить 2 набора на основе показателя релевантности, возвращаемого поисковой системой. Это выглядит как результат одного запроса, но вы знаете, что представляет собой каждый элемент (совпадение имени или попадания в категорию), поэтому вы можете выделить это
- сделать то же поле, что и выше, но назначить разные веса разным наборам, например, для релевантности = 0,7 * name_relevancy + 0,3 * category_relevancy. Это сделает результаты поиска более естественными
- разбивать результаты на вкладки / группы, например 'По вашему запросу найдено N названий и M категорий)
- Использовать полосы при отображении результатов. Для каждой страницы (при условии, что вы разбиваете результаты поиска с помощью пагинатора) выведите на экран N элементов из первого набора и M элементов из второго набора (вы можете задать наборы по одному или перемешать элементы). Если в одном из наборов не хватает предметов, просто получите больше предметов из другого набора, поэтому на странице всегда есть M + N предметов
- Любой другой способ представить себе
И вы можете использовать этот метод для любых полей: имя, категория, актер, режиссер и т. Д. Однако, чем больше полей вы используете, тем больше поисковых запросов вы должны выполнить