#php #mysql #sql #codeigniter
#php #mysql #sql #codeigniter
Вопрос:
Я разрабатываю сайт рецептов с использованием codeigniter (я использую mysql в качестве базы данных). Пользователь может ввести любое количество ингредиентов.Мне нужно выполнить поиск рецептов, содержащих эти ингредиенты. т.е. если пользователь кладет яйца и помидоры, мне нужно выполнить поиск рецептов, в которых используются оба. результат поиска рецепта должен быть на порядок меньше требуемого количества дополнительных ингредиентов. Поскольку количество ингредиентов варьируется, как написать sql-запрос? Как упорядочить результат поиска? Есть идеи, как это сделать? Заранее благодарю вас.
Комментарии:
1. какова структура вашей таблицы на данный момент?
Ответ №1:
Самое простое решение (не самое лучшее, ИМХО, но одно из самых простых) — использовать полнотекстовый индекс MySQL. Вы можете начать с чтения документации MySQL по полнотекстовому индексу, это чрезвычайно полезно при создании небольшой поисковой системы. Объяснение заимствовано из википедии:
При полнотекстовом поиске поисковая система проверяет все слова в каждом сохраненном документе, пытаясь сопоставить поисковые слова, предоставленные пользователем.
Итак, по моему предложению, вы можете создать эту таблицу, похожую на эту:
----------------------------------------
RECIPES
----------------------------------------
id | int(11) | PRIMARY KEY
title | varchar(255) |
body | mediumtext |
ingredients | tinytext | FULLTEXT
Соображения:
-
Добавьте полнотекстовый индекс только к
ingredients
полю. -
Храните ингредиенты внутри поля
ingredients
, разделенные пробелом, не используйте запятую. -
Храните ингредиенты в двух местах,
ingredients
поле выше предназначено только для поиска. Возможно, вам было бы лучше использовать другую таблицу для хранения списка ингредиентов для других вариантов использования. -
Поскольку вы используете полнотекстовый индекс, вы можете использовать
BOOLEAN MODE
синтаксис. Если вы хотите выполнить поиск рецептов, которые имеютegg
иtomato
используютeggs tomato
, если вы хотите выполнить поиск рецептов, которые содержат,egg
но неtomato
содержат, используйтеegg -tomato
. Смотрите руководство MySQL для подробного объяснения.
Опять же, это может быть не лучшим решением, но это первое, что приходит мне в голову, и это, безусловно, легко.
Пара предостережений:
-
Полнотекстовый движок MySQL по умолчанию не распознает слова длиной менее 4 символов, вы можете это изменить.
-
Если вы не используете логический режим, полнотекстовый поиск MySQL вернет пустой результат, если он превышает 50% вашего набора данных.
-
Полнотекстовый поиск будет игнорировать стоп-слова, вот список.
Ответ №2:
http://www.jarrodgoddard.com/web-development/advanced-web-site-search-with-sql вот статья о том, как использовать запросы MySQL для получения результатов поиска на основе релевантности. Проявив немного творчества, вы можете сами добавить актуальности, упорядочив их по количеству определенного ингредиента.
Как сохраняются ингредиенты? Надеюсь, в реляционной таблице (recipe_id, ingredient_id, amount)? Это упрощает поиск.