





Да, обычно наиболее эффективным способом является поиск в базе данных. Для этого у вас есть три альтернативы:
Так что это зависит от того, что вы на самом деле будете искать, чтобы решить, что будет лучше всего. Для названий книг я бы предложил поиск LIKE для точного совпадения подстроки, полезный, когда люди знают книгу, которую они ищут, а также поиск FULLTEXT, чтобы помочь найти заголовки, похожие на слово или фразу. Я бы, конечно, дал им разные имена в интерфейсе, возможно, что-то вроде точного для поиска подстроки и аналогичного для полнотекстового поиска.
Пример с полным текстом: http://www.onlamp.com/pub/a/onlamp/2003/06/26/fulltext.html
Вот простой способ разбить некоторые ключевые слова на части, чтобы создать несколько предложений для фильтрации столбца по этим ключевым словам, объединенным оператором AND или OR вместе.
$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's 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?
}
Вы также можете проверить функции soundex (soundex, похоже) в руководстве mysql http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex Его функция - возвращать эти совпадения, если, например, строгая проверка (с помощью LIKE или =) не вернула никаких результатов.
Пример кода Пола Диксона хорошо передает основную идею подхода, основанного на LIKE.
Я просто добавлю эту идею удобства использования: установите переключатель (И | ИЛИ) в интерфейсе, по умолчанию - И, а затем, если в результате запроса пользователя будет найдено ноль (0) совпадений и содержится как минимум два слова, ответьте опцией к эффекту:
"Sorry, No matches were found for your search phrase. Expand search to match on ANY word in your phrase?
Может быть, есть лучший способ сформулировать это, но основная идея состоит в том, чтобы направить человека к другому запросу (это может быть успешным), при этом пользователю не нужно думать в терминах логической логики AND и OR.
Рассмотрите возможность использования сфинкс. Это полнотекстовый движок с открытым исходным кодом, который может напрямую использовать вашу базу данных mysql. Он гораздо более масштабируемый и гибкий, чем ручное кодирование операторов LIKE (и гораздо менее восприимчив к SQL-инъекциям)
Я думаю, что лайк - самый эффективный способ, если это слово. Как уже было сказано, несколько слов можно разделить с помощью функции разнесения. Затем его можно зациклить и использовать для индивидуального поиска в базе данных. Если один и тот же результат возвращается дважды, его можно проверить, прочитав значения в массив. Если он уже существует в массиве, игнорируйте его. Затем с функцией подсчета вы будете знать, где остановиться при печати с помощью цикла. Сортировку можно производить с помощью функции Similar_text. Процент используется для сортировки массива. Это самое лучшее.