Как написать запрос MySQL для поиска в базе данных? - PullRequest
1 голос
/ 18 марта 2011

У меня собственный веб-сайт обоев, и я пытаюсь написать функцию поиска, которая будет искать в базе данных термины, которые ищет пользователь. У меня есть 2 поля в базе данных, я ищу против TAGS и ИМЯ

В настоящее время я делаю поисковый запрос, делю его на несколько слов и затем выполняю поиск в базе данных по этим терминам. Так что, если пользователь ищет «Нью-Йорк», мой запрос будет выглядеть так

SELECT * FROM wallpapers 
WHERE tags LIKE '%New%' OR name LIKE '%new%' 
or tags LIKE '%York%' OR name LIKE '%York%'

Проблема с этим, конечно, заключается в том, что все, что связано с термином «новый», будет всплывать, как, например, «новая машина» и т. Д. Если я заменю приведенный выше запрос следующим кодом, то он будет слишком расплывчатым и будет похож на 2 обоев. покажет

SELECT * FROM wallpapers 
WHERE tags LIKE '%New York%' OR name LIKE '%New York%'

У кого-нибудь есть лучший способ написать поисковый запрос?

Ответы [ 4 ]

4 голосов
/ 18 марта 2011

Похоже, вы хотите представить понятие актуальности.

Попытка:

select * from (
SELECT 1 as relevance, * FROM wallpapers 
WHERE tags LIKE '%New York%' OR name LIKE '%New York%'
union
select 10 as relevance, * FROM wallpapers 
WHERE (tags LIKE '%New%' OR name LIKE '%new%') 
and (tags LIKE '%York%' OR name LIKE '%York%')
union
select 100 as relevance, * FROM wallpapers 
WHERE tags LIKE '%New%' OR name LIKE '%new%' 
union
select 100 as relevance, * FROM wallpapers 
WHERE tags LIKE '%York%' OR name LIKE '%York%'
)
order by relevance asc

Кстати, это будет работать очень и очень плохо, если ваша база данных станет слишком большой - вы хотите последовательно форматировать столбцы, чтобы они были все в верхнем регистре (или все в нижнем регистре), и вы хотите избежать использования подстановочных знаков ваши предложения where, если вы можете.

Как только это станет проблемой, посмотрите на полнотекстовый поиск.

1 голос
/ 18 марта 2011

Я полагаю, что вы можете получить пользу от полнотекстовых индексов.Читайте на MySQL полный текстовый поиск.Вам нужно будет использовать движок MyISAM для ваших таблиц.

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

1 голос
/ 18 марта 2011

Вы можете использовать свой первый запрос, чтобы сделать первый выбор, и после этого вы можете ранжировать результаты: обои с обоими ключевыми словами "New" и "York" будут иметь более высокий рейтинг, чем обои только с одним из ключевых слов.

Если второй запрос возвращает только 2 фонового рисунка, можете ли вы привести пример тегов / имени фонового рисунка, не возвращенного запросом, но который вы хотели бы получить?

Это проблема заглавных букв? Пробелы?

0 голосов
/ 18 марта 2011

Возможно, это действительно глупый вопрос, но, может быть, вы следуете тому, что хотите?

SELECT * FROM wallpapers 
WHERE ( tags LIKE '%New%' OR name LIKE '%new%' )
and ( tags LIKE '%York%' OR name LIKE '%York%' )

Поиск обоев, которые должны иметь оба слова, но в любом месте.

Предупреждение Остерегайтесь SQL-инъекций таким образом при поиске «слов», таких как new'york или new%york. Пожалуй, самый простой способ - при расщеплении обрабатывать все неальфа / нечисловые символы как пробелы, так что new@york и аналогичные становятся new и york.

Примечания о поиске:

Поиск таким способом в базах данных - это просто перебор (полное сканирование таблицы). Пока у вас есть только несколько обоев, это не большая проблема. Почти все современное дешевое оборудование должно иметь возможность осуществлять поиск по миллиону обоев в течение секунды или около того, если база данных помещается в память.

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

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