Каков наилучший способ поиска базы данных MySQL с помощью PHP?
Скажем, если бы у меня была таблица книг в базе данных MySQL, и я хотел найти поле "title" для ключевых слов (вводимых пользователем в поле поиска); Какой лучший способ сделать это в PHP? Является ли команда MySQL LIKE
наиболее эффективным способом поиска?
Ответы
Ответ 1
Да, наиболее эффективным способом обычно является поиск в базе данных. Для этого у вас есть три варианта:
- LIKE, ILIKE, чтобы соответствовать точным подстрокам
- RLIKE для соответствия регулярным выражениям POSIX
- FULLTEXT индексы, чтобы соответствовать другим трем различным видам поиска, направленным на обработку естественного языка.
Итак, это зависит от того, что вы на самом деле ищете, чтобы решить, что будет лучше всего. Для названий книг я бы предложил LIKE поиск точной подстроки, полезной, когда люди знают книгу, которую они ищут, а также поиск FULLTEXT, чтобы помочь найти названия, похожие на слово или фразу. Я бы дал им разные имена на интерфейсе, вероятно, что-то вроде точного поиска подстроки и аналогичного для полнотекстового поиска.
Пример полного текста: http://www.onlamp.com/pub/a/onlamp/2003/06/26/fulltext.html
Ответ 2
Вот простой способ разбить некоторые ключевые слова для создания некоторых статей для фильтрации столбца по этим ключевым словам, либо ANDed, либо ORed вместе.
$terms=explode(',', $_GET['keywords']);
$clauses=array();
foreach($terms as $term)
{
//remove any chars you don't want to be searching - adjust to suit
//your requirements
$clean=trim(preg_replace('/[^a-z0-9]/i', '', $term));
if (!empty($clean))
{
//note use of mysql_escape_string - while not strictly required
//in this example due to the preg_replace earlier, it good
//practice to sanitize your DB inputs in case you modify that
//filter...
$clauses[]="title like '%".mysql_escape_string($clean)."%'";
}
}
if (!empty($clauses))
{
//concatenate the clauses together with AND or OR, depending on
//your requirements
$filter='('.implode(' AND ', $clauses).')';
//build and execute the required SQL
$sql="select * from foo where $filter";
}
else
{
//no search term, do something else, find everything?
}
Ответ 3
Рассмотрите возможность использования sphinx. Это текстовый движок с открытым исходным кодом, который может напрямую использовать вашу базу данных mysql. Это гораздо более масштабируемое и гибкое, чем инструкции LIKE для ручного кодирования (и гораздо менее подверженные SQL-инъекции)
Ответ 4
Вы также можете проверить функции soundex (soundex, звуки) в руководстве mysql http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex
Его функциональность возвращает эти соответствия, если, например, строгая проверка (по LIKE или =) не вернула никаких результатов.
Ответ 5
Пример кода Пола Диксона дает основную идею хорошо для подхода на основе LIKE.
Я просто добавлю эту идею удобства использования: поставьте в интерфейсе (И | ИЛИ) радиокнопку, по умолчанию И, а затем, если пользовательский запрос приведет к нулю (0) и будет содержать как минимум два слова, ответьте с возможностью изменения:
"Извините, Не найдено совпадений для вашей поисковой фразы. Развернуть поиск, чтобы соответствовать ЛЮБОМ слову в вашей фразе?
Может быть, есть лучший способ сформулировать это, но основная идея состоит в том, чтобы направлять человека к другому запросу (который может быть успешным), без того, чтобы пользователь мог думать в терминах логической логики И и OR.
Ответ 6
Я думаю, что это самый эффективный способ, если это слово. Несколько слов могут быть разделены с функцией разрыва, как уже говорилось. Затем он может быть зациклен и использоваться для индивидуального поиска через базу данных. Если один и тот же результат возвращается дважды, его можно проверить, прочитав значения в массиве. Если он уже существует в массиве, игнорируйте его. Затем с функцией count вы будете знать, где остановиться при печати с помощью цикла. Сортировка может выполняться с помощью функции lik_text. Процент используется для сортировки массива. Это лучший.