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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
14
0
16 266
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

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

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

Так что это зависит от того, что вы на самом деле будете искать, чтобы решить, что будет лучше всего. Для названий книг я бы предложил поиск 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. Процент используется для сортировки массива. Это самое лучшее.

Другие вопросы по теме