Каков наилучший способ поиска в базе данных MySQL с помощью PHP?

StackOverflow https://stackoverflow.com/questions/152259

  •  02-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

  • НРАВИТСЯ, НРАВИТСЯ для соответствия точным подстрокам
  • РЛИКЕ для соответствия регулярным выражениям POSIX
  • ПОЛНЫЙ ТЕКСТ индексы для соответствия еще трем различным видам поиска, направленным на обработку естественного языка

Так что это зависит от того, что вы на самом деле будете искать, чтобы решить, что будет лучше.Для названий книг я бы предложил поиск НРАВИТСЯ для точного соответствия подстроки, что полезно, когда люди знают книгу, которую они ищут, а также поиск ПОЛНЫЙ ТЕКСТ, чтобы помочь найти названия, похожие на слово или фразу.Конечно, я бы дал им разные имена в интерфейсе, возможно, что-то вроде точного для поиска подстроки и похожего для полнотекстового поиска.

Пример полнотекстового сообщения: 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?
}

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

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

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

Я просто добавлю эту идею удобства использования:Предоставьте переключатель (И | ИЛИ), установленный в интерфейсе, по умолчанию это И, затем, если запрос пользователя приводит к нулю (0) совпадений и содержит как минимум два слова, ответьте опцией соответствующего эффекта:

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top