Каков наилучший способ поиска в базе данных MySQL с помощью PHP? - PullRequest
14 голосов
/ 30 сентября 2008

Скажите, если у меня была таблица книг в базе данных MySQL, и я хотел найти в поле «заголовок» ключевые слова (введенные пользователем в поле поиска); Каков наилучший способ сделать это в PHP? Является ли команда MySQL LIKE наиболее эффективным способом поиска?

Ответы [ 6 ]

21 голосов
/ 30 сентября 2008

Да, наиболее эффективным способом обычно является поиск в базе данных. Для этого у вас есть три варианта:

  • LIKE, ILIKE для точного соответствия подстрок
  • RLIKE для соответствия регулярным выражениям POSIX
  • FULLTEXT индексы для соответствия еще трем различным видам поиска, предназначенным для обработки естественного языка

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

Пример с полным текстом: http://www.onlamp.com/pub/a/onlamp/2003/06/26/fulltext.html

10 голосов
/ 30 сентября 2008

Вот простой способ разбить несколько ключевых слов на части, чтобы создать несколько предложений для фильтрации столбца по этим ключевым словам, 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'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?
}
2 голосов
/ 02 октября 2008

Рассмотрите возможность использования sphinx . Это полнотекстовый движок с открытым исходным кодом, который может напрямую использовать вашу базу данных mysql. Это гораздо более масштабируемо и гибко, чем ручное кодирование операторов LIKE (и гораздо менее подвержено внедрению SQL)

1 голос
/ 13 января 2012

Я думаю, что Like - это самый эффективный способ, если это слово. Несколько слов могут быть разделены с помощью функции разнесения, как уже говорилось. Затем он может быть зациклен и использован для индивидуального поиска в базе данных. Если один и тот же результат возвращается дважды, его можно проверить, считав значения в массив. Если он уже существует в массиве, игнорируйте его. Затем с помощью функции подсчета вы будете знать, где остановиться при печати с помощью петли. Сортировка может быть выполнена с помощью функции Similar_text. Процент используется для сортировки массива. Это лучшее.

1 голос
/ 02 октября 2008

Пример кода Пола Диксона хорошо отражает основную идею подхода LIKE.

Я просто добавлю эту идею юзабилити: предоставьте переключатель (AND | OR), установленный в интерфейсе, по умолчанию - AND, затем, если запрос пользователя приводит к нулю (0) совпадений и содержит хотя бы два слова, ответьте с опцией на эффект:

"Извините, Не найдено совпадений для вашей поисковой фразы. Расширить поиск, чтобы соответствовать ЛЮБОМУ слову в вашей фразе?

Возможно, есть лучший способ выразить это, но основная идея состоит в том, чтобы направить человека к другому запросу (, который может быть успешным ) без необходимости думать с точки зрения булевой логики AND и OR.

1 голос
/ 30 сентября 2008

Вы также можете проверить функции soundex (soundex, звучит как) в руководстве по mysql http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex Функционально возвращать эти совпадения, если, например, строгая проверка (по LIKE или =) не дала никаких результатов.

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