@Avreliya777

Как объединить поиск по тегам и названию поста в MySQL?

Несколько миллионов постов.
У постов есть также и теги.
Как организовать поиск?
Просто если запрос будет из одного слова, которое есть в тегах, и найдено например много-много постов, напр. тысяч 300, а потом делать второй поиск тут же на поиск этого слова в названии постов, тоже куча вылезет вариантов, и потом в PHP вычленять один набор из другого? Или другие какие-то варианты есть? Как обычно делают в таких случаях?

Добавлено: а теги 2 таблицы, tags - id, name,
и tags_posts - id_tag, id_post,
т.е. я сначала нахожу совпадение тега в тегс, а потом если есть совпадение, то делаю уже второй запрос на выковыривание постов через tags_posts.
Но сейчас хочу добавить поиск по названию поста ещё, и как бы это объединить эффективно не знаю
  • Вопрос задан
  • 164 просмотра
Решения вопроса 1
ipatiev
@ipatiev
Потомок старинного рода Ипатьевых-Колотитьевых
В запросе ничего сложного, всё так, как вы и описали
Только, разумеется, в одном запросе.

Для этого пора бы уже освоить джойны. Нормализацию БД вы освоили - это прекрасно.
Джойны - тоже не бином ньютона, это основа SQL. Второй запрос не нужен, всё делается в одном
Сначала выбираем фильмы по тегам
select f.* from sakila.category c
join sakila.film_category fc on fc.category_id = c.category_id
join sakila.film f on f.film_id = fc.film_id
where c.name in ('Action', 'Drama') 
group by f.film_id;

Если хотим добавить поиск по заголовку, то просто добавляем к этому же запросу еще условие во WHERE, and description like '%Drama%'
https://sqlize.online/sql/mysql57/8d7c91ad5f6cf415...

Правда на таких объемах LIKE делать не рекомендуется. Но если сейчас работает по всей базе, то по десятой части и подавно будет. Но в целом надо уже прикручивать внешний поисковый движок, ElasticSearch. Ну или хотя бы добавить полнотекстовый индекс по названию (и тексту тогда уж заодно) и искать в них через match...against
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы