Методы фильтрации данных в веб-разработке на PHP

Раздел: Веб-разработка -> Реализация поиска

Поиск по ключевому слову в PHP

Наиболее эффективное решение: полнотекстовый поиск в MySQL с использованием MATCH AGAINST

Для веб-приложений, где данные хранятся в MySQL, оптимальным способом реализации поиска по ключевому слову является использование полнотекстового индекса. Этот подход обеспечивает высокую скорость выполнения запросов и встроенную сортировку по релевантности. Пример настройки и использования:


-- Создание таблицы с полнотекстовым индексом
CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255),
    content TEXT,
    FULLTEXT INDEX ft_search (title, content)
);

-- Пример запроса на PHP с PDO
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'user', 'pass');
$keyword = 'PHP поиск';
$stmt = $pdo->prepare(
    "SELECT *, MATCH(title, content) AGAINST(:keyword IN NATURAL LANGUAGE MODE) AS relevance 
     FROM articles 
     WHERE MATCH(title, content) AGAINST(:keyword IN NATURAL LANGUAGE MODE) 
     ORDER BY relevance DESC"
);
$stmt->execute(['keyword' => $keyword]);
$results = $stmt->fetchAll();

Search tags php tag (поиск по тегам в php)

Типичные проблемы и их решение

  • Ошибка 1214 (ER_TOO_MANY_FTS_RESULTS) - возникает при слишком большом количестве результатов. Решение: ограничить выборку через LIMIT.
  • Пустой результат при использовании коротких слов - полнотекстовый индекс игнорирует слова короче минимальной длины (обычно 4 символа). Решение: изменить параметр ft_min_word_len в конфигурации MySQL.
  • SQL-инъекция - использование подготовленных запросов (как в примере) полностью её предотвращает.

Как найти точное вхождение подстроки в строке без учета регистра?


function searchString($haystack, $needle) {
    return mb_stripos($haystack, $needle) !== false;
}

Search topic php (поиск по теме в php)

Функция mb_stripos безопасно работает с многобайтовыми кодировками (UTF-8). Версия stripos подходит для однобайтовых строк. Подход полезен для фильтрации небольшого массива данных прямо в PHP.

Проблемы:

  • Не различает целые слова - найдет часть слова (например, "поиск" в "поисковый").
  • Нет сортировки по релевантности.

Как выполнить поиск с использованием регулярного выражения для гибкого шаблона?


$pattern = '/\bпоиск\b/ui'; // u - юникод, i - без учета регистра
if (preg_match($pattern, $text)) {
    echo 'Слово найдено';
}

Search type php id type (тип поиска по id в php)

Регулярные выражения позволяют искать по сложным шаблонам (границы слов, синонимы, опциональные символы). Подходит для обработки текстов на лету.

Ошибки:

  • Неверный флаг /u приводит к ошибке при работе с UTF-8.
  • Слишком сложный шаблон может снизить производительность.

Как отфильтровать массив по ключевому слову с помощью array_filter?


$data = ['PHP for beginners', 'Advanced PHP', 'JavaScript basics'];
$keyword = 'PHP';
$filtered = array_filter($data, function($item) use ($keyword) {
    return mb_stripos($item, $keyword) !== false;
});
print_r($filtered);

Search php view (вид поиска в php)

Array
(
    [0] => PHP for beginners
    [1] => Advanced PHP
)

Catalog php search (поиск в каталоге php)

Этот метод полезен, когда данные уже загружены в память (например, из кэша) и не требуется обращение к БД.

Недостатки:

  • Обработка всего массива в PHP потребляет память; для больших наборов данных лучше использовать SQL.
  • Операция не изменяет исходный массив, создает новый.

Как реализовать простой поиск в MySQL с оператором LIKE?


$stmt = $pdo->prepare("SELECT * FROM articles WHERE title LIKE :pattern OR content LIKE :pattern");
$stmt->execute(['pattern' => '%' . $keyword . '%']);
$results = $stmt->fetchAll();

Index php act search (действие поиска в php)

Оператор LIKE подходит для начинающих и малых объёмов данных. Символ % означает любую последовательность символов. Важно экранировать спецсимволы (%, _) с помощью addcslashes при необходимости.

Типичные ошибки:

  • Потеря производительности на больших таблицах из-за полного сканирования, если нет индекса. Решение: создать индекс на колонке, но LIKE с ведущим % не использует индекс.
  • SQL-инъекция - обязательно использовать подготовленные запросы.

Как использовать Elasticsearch для масштабируемого поиска из PHP?


// Отправка запроса через cURL
$url = 'http://localhost:9200/articles/_search';
$query = json_encode([
    'query' => [
        'match' => [
            'content' => 'ключевое слово'
        ]
    ]
]);

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

$result = json_decode($response, true);

Elasticsearch обеспечивает быстрый поиск, поддержку нечеткого поиска, стемминг и релевантность. Подходит для больших проектов. В PHP также есть официальный клиент elasticsearch/elasticsearch.

Сложности:

  • Необходимость установки и настройки отдельного сервиса.
  • Обучение синтаксису DSL запросов.
- Search php search name (поиск по имени в php)
- Search index php subaction (поддействие поиска в php)
- Php search form (форма поиска в php)

Расширенные примеры

Пример 1. Полнотекстовый поиск с булевыми операторами

Цель: поиск с указанием обязательных и запрещённых слов.

Пример

$keyword = '+PHP -JavaScript';
$stmt = $pdo->prepare(
    "SELECT *, MATCH(title, content) AGAINST(:keyword IN BOOLEAN MODE) AS relevance 
     FROM articles 
     WHERE MATCH(title, content) AGAINST(:keyword IN BOOLEAN MODE)
     ORDER BY relevance DESC"
);
$stmt->execute(['keyword' => $keyword]);
// Результат: статьи, где есть слово PHP, но нет JavaScript
(выборка записей с релевантностью)

Использование BOOLEAN MODE даёт гибкость в управлении поиском.

Пример 2. Поиск с пагинацией результатов

Пример

$page = 1;
$perPage = 10;
$offset = ($page - 1) * $perPage;

$stmt = $pdo->prepare(
    "SELECT *, MATCH(title, content) AGAINST(:keyword IN NATURAL LANGUAGE MODE) AS relevance 
     FROM articles 
     WHERE MATCH(title, content) AGAINST(:keyword IN NATURAL LANGUAGE MODE)
     ORDER BY relevance DESC
     LIMIT :limit OFFSET :offset"
);
$stmt->bindValue(':keyword', $keyword, PDO::PARAM_STR);
$stmt->bindValue(':limit', $perPage, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
$pageResults = $stmt->fetchAll();

Такой подход снижает нагрузку на сервер и удобен для пользователей.

Пример 3. Поиск с использованием расстояния Левенштейна (нечеткий поиск)

Пример

function fuzzySearch($word, $list, $maxDistance = 2) {
    $results = [];
    foreach ($list as $item) {
        if (levenshtein($word, $item) <= $maxDistance) {
            $results[] = $item;
        }
    }
    return $results;
}

$cities = ['Москва', 'Санкт-Петербург', 'Казань', 'Новосибирск'];
$fuzzy = fuzzySearch('Москв', $cities);
print_r($fuzzy);
Array
(
    [0] => Москва
)

Функция levenshtein вычисляет минимальное количество замен, вставок и удалений для преобразования одной строки в другую. Полезна для автодополнения и исправления опечаток.

Пример 4. Интеграция с Elasticsearch через официальный клиент

Пример

composer require elasticsearch/elasticsearch

use Elastic\Elasticsearch\ClientBuilder;

$client = ClientBuilder::create()->setHosts(['localhost:9200'])->build();
$params = [
    'index' => 'articles',
    'body'  => [
        'query' => [
            'multi_match' => [
                'query'  => 'keyword search',
                'fields' => ['title^3', 'content']
            ]
        ]
    ]
];
$response = $client->search($params);
$hits = $response['hits']['hits'];

Клиент упрощает работу, предоставляя удобные методы и автоматическую сериализацию.

Пример 5. Поиск в MySQL с использованием индекса FULLTEXT и сортировкой по дате

Пример

$stmt = $pdo->prepare(
    "SELECT id, title, created_at, 
            MATCH(title, content) AGAINST(:keyword) AS relevance 
     FROM articles 
     WHERE MATCH(title, content) AGAINST(:keyword)
     ORDER BY relevance DESC, created_at DESC"
);
$stmt->execute(['keyword' => $keyword]);

Дополнительная сортировка по дате помогает выводить актуальные записи с одинаковой релевантностью.

Поиск по ключевому слову в PHP - comments

En
Search php keyword (php)