Поиск по PDF/документам на сайте

Автор:vkuzyomko

Поиск по PDF/документам на сайте

Краткий ответ: поиск по PDF/документам на сайте нужен, чтобы посетитель мог искать не только по страницам WordPress, но и внутри файлов: PDF, DOCX, XLSX, инструкций, каталогов, прайсов, договоров, технической документации и базы знаний. Обычный поиск WordPress чаще всего не читает содержимое файлов, поэтому для нормального результата нужна индексация текста документов.

Правильный поиск по документам — это не просто список PDF-файлов на странице. Сайт должен извлечь текст из файла, сохранить его в поисковый индекс, связать результат с названием документа, страницей, категорией, правами доступа и показать пользователю понятный фрагмент найденного текста.

Причина

Проблема появляется, когда на сайте много полезной информации, но она спрятана внутри файлов. Посетитель ищет слово, артикул, модель, пункт инструкции или номер документа, а WordPress находит только страницы и записи.

  • PDF-файл загружен в медиатеку, но его текст не участвует в поиске;
  • документы доступны только как ссылки на скачивание;
  • поиск находит название файла, но не текст внутри PDF;
  • сканированные PDF вообще не содержат текстового слоя;
  • файлы лежат на сервере, но не привязаны к записям WordPress;
  • часть документов закрыта для пользователей, но поиск показывает их всем;
  • каталоги, инструкции и прайсы есть на сайте, но посетитель не может быстро найти нужное место;
  • AI-чат или база знаний не могут отвечать по документам, потому что текст не извлечён.

Если сайт уже использует AI-помощника, поиск по PDF можно сделать частью базы знаний. Тогда AI-чат для сайта сможет отвечать не только по страницам, но и по загруженным инструкциям, каталогам и PDF-документам.

Что значит “поиск внутри PDF”

Есть два разных уровня поиска, и их часто путают.

Тип поиска Что ищет Проблема
Поиск по названию файла Только имя PDF, title, alt, описание в медиатеке Не находит текст внутри документа
Поиск по тексту документа Слова, фразы, номера, пункты внутри PDF/DOCX/XLSX Нужна индексация и извлечение текста
Поиск по сканированному PDF Текст на изображениях внутри PDF Нужен OCR, иначе текста для поиска нет
AI-поиск по документам Ищет смысл, а не только точное совпадение слов Нужна база знаний, чанки, embeddings или похожая логика

Какие документы можно индексировать

Технически сайт может искать по разным типам файлов, но способ обработки зависит от формата.

  • PDF — если есть текстовый слой, текст можно извлечь и индексировать;
  • сканированный PDF — нужен OCR, потому что внутри фактически изображения;
  • DOC/DOCX — можно извлекать текст, заголовки, таблицы;
  • XLS/XLSX — можно индексировать ячейки, листы, артикулы, цены;
  • CSV — удобно для каталогов, прайсов и табличных данных;
  • TXT/HTML — проще всего индексируются;
  • ZIP-архивы — нужно отдельно распаковывать и обрабатывать содержимое.

Диагностика

Перед внедрением поиска нужно понять, какие документы есть на сайте и что именно должно находиться. Без диагностики легко поставить плагин, который красиво показывает файлы, но не ищет внутри них.

Что проверить сначала

  • где хранятся документы: медиатека WordPress, папка uploads, внешний сервер, Google Drive, CRM;
  • какие форматы нужно искать: PDF, DOCX, XLSX, CSV, HTML;
  • есть ли в PDF текстовый слой;
  • есть ли сканированные документы;
  • сколько файлов нужно индексировать;
  • какой общий размер документов;
  • нужно ли искать по закрытым файлам;
  • есть ли роли пользователей и ограничения доступа;
  • нужно ли показывать фрагмент найденного текста;
  • нужно ли открывать PDF на нужной странице;
  • нужна ли фильтрация по категориям, датам, типам документов;
  • нужна ли связка с AI-поиском или чат-ботом.

Как понять, что PDF не содержит текста

  • откройте PDF в браузере или PDF-просмотрщике;
  • попробуйте выделить мышкой текст внутри документа;
  • попробуйте нажать Ctrl+F и найти слово из документа;
  • если текст не выделяется и не находится, PDF может быть сканом;
  • для скана нужен OCR, обычная индексация не поможет.

Нужно быстро решить проблему на сайте?

Если не хотите рисковать сайтом и тратить время на эксперименты, можно оставить заявку. Я посмотрю задачу и предложу аккуратное решение.

Оставить заявку

Решение

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

Правильная архитектура

  • 1. Загрузка документа. Файл попадает в медиатеку, отдельную папку или кастомный раздел документов.
  • 2. Извлечение текста. PDF/DOCX/XLSX превращается в обычный текст.
  • 3. Очистка текста. Удаляются лишние переносы, мусор, повторяющиеся символы.
  • 4. Индексация. Текст сохраняется в базу данных или поисковый движок.
  • 5. Разделение на части. Большие документы лучше делить на страницы или смысловые блоки.
  • 6. Поиск. Пользователь вводит запрос, сайт ищет совпадения в индексе.
  • 7. Вывод результата. Показывается название документа, тип, фрагмент текста и ссылка.
  • 8. Проверка прав. Закрытые документы должны быть видны только разрешённым пользователям.

Когда нужен готовый плагин

Готовый плагин подходит, если задача стандартная: загрузить документы, показать библиотеку файлов, добавить поиск по PDF и фильтры. Это хороший вариант для небольших сайтов, где не нужна сложная логика доступа.

Когда нужен кастомный поиск

Кастомный поиск нужен, если документы связаны с пользователями, компаниями, заказами, личным кабинетом, технической базой, LMS, CRM или закрытым доступом. Например, если каждый клиент должен видеть только свои PDF-документы, это уже задача для отдельного модуля, похожая на личный кабинет на WordPress.

Код

Важно: код ниже показывает упрощённую архитектуру индекса и поиска. Он не извлекает текст из PDF сам по себе. Для реального проекта нужен модуль извлечения текста через серверную утилиту, библиотеку, внешний API или отдельный обработчик. Перед внедрением на рабочий сайт сделайте бэкап базы данных.

1. Создание таблицы индекса документов

Куда вставлять: в отдельный WordPress-плагин. Не рекомендуется хранить такую логику в теме.

<?php
if (!defined('ABSPATH')) {
    exit;
}

register_activation_hook(__FILE__, 'sc_document_search_create_table');

function sc_document_search_create_table() {
    global $wpdb;

    $table_name = $wpdb->prefix . 'sc_document_search_index';
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $table_name (
        id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
        attachment_id BIGINT UNSIGNED NOT NULL DEFAULT 0,
        document_title TEXT NOT NULL,
        document_url TEXT NOT NULL,
        document_type VARCHAR(50) NOT NULL DEFAULT '',
        page_number INT UNSIGNED NOT NULL DEFAULT 0,
        indexed_text LONGTEXT NOT NULL,
        access_level VARCHAR(50) NOT NULL DEFAULT 'public',
        created_at DATETIME NOT NULL,
        updated_at DATETIME NOT NULL,
        PRIMARY KEY  (id),
        KEY attachment_id (attachment_id),
        KEY document_type (document_type),
        KEY access_level (access_level)
    ) $charset_collate;";

    require_once ABSPATH . 'wp-admin/includes/upgrade.php';
    dbDelta($sql);
}

2. Сохранение извлечённого текста в индекс

Этот пример предполагает, что текст документа уже извлечён другим способом.

<?php
function sc_document_search_save_index($attachment_id, $document_title, $document_url, $document_type, $page_number, $indexed_text, $access_level = 'public') {
    global $wpdb;

    $table_name = $wpdb->prefix . 'sc_document_search_index';

    $wpdb->insert(
        $table_name,
        array(
            'attachment_id'   => (int) $attachment_id,
            'document_title'  => sanitize_text_field($document_title),
            'document_url'    => esc_url_raw($document_url),
            'document_type'   => sanitize_text_field($document_type),
            'page_number'     => (int) $page_number,
            'indexed_text'    => sanitize_textarea_field($indexed_text),
            'access_level'    => sanitize_text_field($access_level),
            'created_at'      => current_time('mysql'),
            'updated_at'      => current_time('mysql'),
        ),
        array(
            '%d',
            '%s',
            '%s',
            '%s',
            '%d',
            '%s',
            '%s',
            '%s',
            '%s',
        )
    );

    return $wpdb->insert_id;
}

3. AJAX-поиск по индексу документов

Важно: поиск работает с пользовательским вводом. Нужно использовать nonce, sanitize и $wpdb->prepare(). Если документы закрытые, обязательно проверяйте права пользователя перед выводом результата.

<?php
add_action('wp_ajax_sc_document_search', 'sc_document_search');
add_action('wp_ajax_nopriv_sc_document_search', 'sc_document_search');

function sc_document_search() {
    check_ajax_referer('sc_document_search_nonce', 'nonce');

    global $wpdb;

    $query = isset($_POST['query']) ? sanitize_text_field($_POST['query']) : '';
    $query = trim($query);

    if (mb_strlen($query) < 3) {
        wp_send_json_error(array(
            'message' => 'Введите минимум 3 символа.'
        ));
    }

    $table_name = $wpdb->prefix . 'sc_document_search_index';
    $like = '%' . $wpdb->esc_like($query) . '%';

    $results = $wpdb->get_results(
        $wpdb->prepare(
            "SELECT id, document_title, document_url, document_type, page_number, indexed_text
             FROM $table_name
             WHERE access_level = %s
             AND indexed_text LIKE %s
             ORDER BY updated_at DESC
             LIMIT 20",
            'public',
            $like
        ),
        ARRAY_A
    );

    $items = array();

    foreach ($results as $row) {
        $items[] = array(
            'title' => esc_html($row['document_title']),
            'url' => esc_url($row['document_url']),
            'type' => esc_html($row['document_type']),
            'page' => (int) $row['page_number'],
            'excerpt' => esc_html(sc_document_search_make_excerpt($row['indexed_text'], $query)),
        );
    }

    wp_send_json_success(array(
        'items' => $items
    ));
}

function sc_document_search_make_excerpt($text, $query) {
    $text = wp_strip_all_tags($text);
    $position = mb_stripos($text, $query);

    if ($position === false) {
        return mb_substr($text, 0, 220) . '...';
    }

    $start = max(0, $position - 80);
    $excerpt = mb_substr($text, $start, 220);

    return '...' . $excerpt . '...';
}

4. Форма поиска на фронтенде

Куда вставлять: в шаблон страницы, shortcode или файл плагина.

<div class="sc-document-search-box">
    <input type="text" id="sc_document_search_query" placeholder="Введите слово, артикул или фразу">
    <input type="hidden" id="sc_document_search_nonce" value="<?php echo esc_attr(wp_create_nonce('sc_document_search_nonce')); ?>">
    <button type="button" id="sc_document_search_button">Найти</button>
    <div id="sc_document_search_status"></div>
    <div id="sc_document_search_results"></div>
</div>

5. jQuery для отправки поиска

Куда вставлять: лучше подключать отдельным JS-файлом только на странице поиска документов.

<script>
jQuery(document).ready(function() {
    jQuery(document).on('click', '#sc_document_search_button', function() {
        var query = jQuery('#sc_document_search_query').val();
        var nonce = jQuery('#sc_document_search_nonce').val();

        jQuery('#sc_document_search_status').html('Идёт поиск...');
        jQuery('#sc_document_search_results').html('');

        jQuery.ajax({
            url: '<?php echo admin_url("admin-ajax.php") ?>',
            type: 'POST',
            dataType: 'json',
            data: {
                action: 'sc_document_search',
                nonce: nonce,
                query: query
            },
            success: function(response) {
                if (!response.success) {
                    jQuery('#sc_document_search_status').html(response.data.message);
                    return;
                }

                jQuery('#sc_document_search_status').html('');

                if (!response.data.items.length) {
                    jQuery('#sc_document_search_results').html('<p>Ничего не найдено.</p>');
                    return;
                }

                var html = '<div class="sc-document-search-results-list">';

                jQuery.each(response.data.items, function(index, item) {
                    html += '<div class="sc-document-search-result">';
                    html += '<h3><a href="' + item.url + '" target="_blank" rel="noopener">' + item.title + '</a></h3>';
                    html += '<p><strong>Тип:</strong> ' + item.type + ' <strong>Страница:</strong> ' + item.page + '</p>';
                    html += '<p>' + item.excerpt + '</p>';
                    html += '</div>';
                });

                html += '</div>';

                jQuery('#sc_document_search_results').html(html);
            },
            error: function() {
                jQuery('#sc_document_search_status').html('Ошибка поиска. Попробуйте позже.');
            }
        });
    });
});
</script>

Результат

После правильной настройки посетитель может искать внутри документов так же удобно, как по обычным страницам сайта. Он вводит запрос и получает не просто файл, а понятный результат: название документа, тип, страницу, фрагмент найденного текста и ссылку на открытие или скачивание.

Хороший результат

  • поиск находит текст внутри PDF, а не только название файла;
  • результаты показывают фрагмент найденного текста;
  • документы можно фильтровать по типу, категории, дате или разделу;
  • закрытые документы не видны публичным пользователям;
  • индексация не тормозит сайт;
  • большие документы обрабатываются частями;
  • сканированные PDF помечаются как требующие OCR;
  • ошибки индексации пишутся в лог;
  • поиск можно использовать как основу для AI-базы знаний;
  • администратор понимает, какие файлы проиндексированы, а какие нет.

Дополнительные способы

Вариант 1: готовый плагин поиска по PDF

Подходит, если нужно быстро добавить поиск по документам без разработки. Важно проверить, ищет ли плагин именно внутри текста PDF, а не только по названию файла.

Плюсы: быстрее запуск, настройки в админке, меньше кода.

Минусы: ограничения логики, не всегда есть OCR, сложнее сделать права доступа под бизнес-процесс.

Вариант 2: библиотека документов

Подходит для сайтов с каталогами, инструкциями, прайсами, архивами, техническими файлами и фильтрами.

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

Минусы: сама библиотека не всегда означает полноценный поиск внутри текста файлов.

Вариант 3: кастомный WordPress-плагин

Подходит, если документы нужно связать с пользователями, компаниями, заказами, ролями, CRM, личным кабинетом или закрытой базой знаний.

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

Минусы: нужно проектирование, тестирование и обработка разных форматов файлов.

Вариант 4: AI-поиск по документам

Подходит, если пользователь ищет не точное слово, а смысл. Например: “как заменить фильтр”, “где указана гарантия”, “какой артикул подходит к модели”.

Плюсы: лучше понимает вопросы обычным языком.

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

OCR для сканированных PDF

Если PDF создан из сканов, обычный поиск не найдёт текст, потому что текста внутри нет. На странице видна картинка с буквами, но для программы это изображение.

Когда нужен OCR

  • PDF сделан из отсканированных страниц;
  • текст в PDF нельзя выделить мышкой;
  • поиск Ctrl+F внутри PDF ничего не находит;
  • документ содержит фотографии страниц;
  • старые инструкции и архивы были оцифрованы через сканер.

Что важно учитывать

  • OCR может ошибаться в распознавании символов;
  • качество зависит от чёткости скана;
  • таблицы и схемы распознаются хуже обычного текста;
  • распознавание больших архивов может быть тяжёлым для сервера;
  • лучше выполнять OCR в фоне, а не при открытии страницы пользователем.

Безопасность

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

Что нужно защитить

  • закрытые PDF и DOCX;
  • документы конкретного пользователя;
  • файлы компании или клиента;
  • счета, договоры, акты;
  • техническую документацию только для сотрудников;
  • результаты поиска по закрытым файлам;
  • прямые ссылки на файлы в uploads;
  • AJAX-запросы поиска;
  • логи индексации.

Практические правила

  • не показывать закрытый документ только потому, что он найден в индексе;
  • проверять права пользователя перед выводом результата;
  • не хранить приватные файлы только как публичные ссылки из uploads;
  • для закрытых документов использовать серверную проверку доступа;
  • не индексировать документы, которые не должны быть доступны через поиск;
  • не выводить в сниппете конфиденциальные данные;
  • не давать поиску обходить роли WordPress;
  • логировать ошибки без персональных данных.

Производительность

Индексация документов может быть тяжёлой. Особенно если на сайте сотни PDF-файлов, большие каталоги, таблицы XLSX или сканы с OCR. Нельзя извлекать текст из PDF при каждом поисковом запросе пользователя.

Что тормозит сайт

  • извлечение текста из PDF во время поиска;
  • поиск LIKE по огромному LONGTEXT без подготовки;
  • индексация всех файлов при каждой загрузке страницы;
  • OCR на рабочем запросе пользователя;
  • отсутствие очереди обработки;
  • слишком большие сниппеты результатов;
  • поиск по закрытым файлам без фильтров доступа;
  • много AJAX-запросов без ограничения.

Что помогает

  • индексировать документы заранее;
  • обрабатывать большие файлы порциями;
  • делить документы на страницы или фрагменты;
  • использовать cron для фоновой индексации;
  • хранить статус индексации файла;
  • добавлять фильтры по типу, категории и дате;
  • ограничивать минимальную длину запроса;
  • использовать отдельный поисковый движок для больших архивов;
  • подключать CSS и JS поиска только на нужной странице.

Если после добавления поиска сайт или админка начали работать медленнее, нужно проверить AJAX, базу данных, cron и логи. Общий подход похож на ускорение WordPress/WooCommerce, только дополнительно проверяется индексация файлов.

Частые ошибки

Думать, что медиатека WordPress сама ищет внутри PDF

Медиатека хранит файл и его метаданные, но это не значит, что стандартный поиск WordPress умеет читать весь текст документа.

Путать просмотр PDF и поиск по PDF

PDF viewer может красиво открыть файл на странице, но это не означает, что сайт индексирует содержимое документа.

Индексировать только название файла

Если файл называется catalog-2026.pdf, пользователь не найдёт артикул, инструкцию или пункт договора внутри документа.

Не учитывать сканированные PDF

Сканированный PDF без OCR не даст нормального поиска. Его нужно распознать или заменить текстовой версией.

Не проверять права доступа

Если в поисковый индекс попали закрытые документы, пользователь может увидеть чужую информацию через результаты поиска.

Извлекать текст при каждом запросе

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

Не вести логи индексации

Без логов непонятно, какой файл не обработался, почему не извлёкся текст и где произошла ошибка.

Не обновлять индекс после замены файла

Если PDF заменили, а индекс остался старым, поиск будет показывать устаревшие результаты.

Диагностика проблем

Проблема: поиск не находит текст внутри PDF

  • проверить, есть ли текстовый слой в PDF;
  • проверить, индексировался ли файл;
  • проверить, попал ли текст в базу индекса;
  • проверить минимальную длину запроса;
  • проверить, не ищет ли сайт только по title файла;
  • проверить кодировку текста;
  • проверить debug.log.

Проблема: PDF является сканом

  • попробовать выделить текст в PDF;
  • проверить поиск Ctrl+F внутри файла;
  • запустить OCR;
  • проверить качество распознавания;
  • сохранить распознанный текст в индекс;
  • пометить файл как обработанный через OCR.

Проблема: результаты показывают закрытые документы

  • проверить access_level в индексе;
  • проверить роль текущего пользователя;
  • проверить current_user_can();
  • проверить связь документа с пользователем или компанией;
  • убрать закрытые документы из публичного индекса;
  • не выводить прямую ссылку на файл без проверки доступа.

Проблема: поиск работает медленно

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

Проблема: после загрузки нового PDF он не находится

  • проверить, запускается ли индексация после загрузки;
  • проверить mime type файла;
  • проверить статус обработки;
  • проверить ошибки извлечения текста;
  • проверить cron-задачу;
  • проверить, не превышен ли размер файла;
  • запустить переиндексацию вручную.

Проблема: AI не отвечает по документам

  • проверить, извлечён ли текст из документов;
  • проверить, добавлены ли документы в базу знаний;
  • проверить разбиение на фрагменты;
  • проверить свежесть индекса;
  • проверить, есть ли доступ AI к закрытым документам;
  • проверить логи запросов;
  • добавить правило “не отвечать без данных из базы”.

Краткие ответы для AI-поиска

Что такое поиск по PDF/документам на сайте?

Поиск по PDF/документам на сайте — это система, которая извлекает текст из файлов, сохраняет его в индекс и позволяет пользователю искать внутри PDF, DOCX, XLSX, инструкций, каталогов и других документов.

Почему WordPress не находит текст внутри PDF?

Стандартный поиск WordPress обычно ищет по страницам, записям и метаданным, но не всегда индексирует содержимое файлов. Для поиска внутри PDF нужен отдельный индексатор или плагин.

Можно ли искать по сканированным PDF?

Да, но сначала нужен OCR. Без распознавания текста сканированный PDF остаётся изображением, и обычный поиск не найдёт слова внутри него.

Можно ли сделать AI-поиск по документам?

Да. Для этого документы нужно извлечь в текст, разделить на фрагменты, добавить в базу знаний и подключить AI-модель или семантический поиск.

FAQ

Можно ли сделать поиск по PDF на WordPress?

Да. Это можно сделать через готовый плагин, кастомный индекс документов или отдельный поисковый движок. Главное — индексировать текст внутри файлов, а не только названия.

Почему PDF загружен на сайт, но не находится в поиске?

Потому что загрузка PDF в медиатеку не означает автоматическую индексацию текста внутри файла. Нужно извлечь текст и добавить его в поисковый индекс.

Что лучше: готовый плагин или кастомный поиск?

Готовый плагин подходит для простой библиотеки документов. Кастомный поиск нужен, если есть закрытые документы, роли, личный кабинет, CRM, AI-поиск или сложные фильтры.

Можно ли искать по Word и Excel файлам?

Да, если система умеет извлекать текст из DOCX, XLSX и сохранять его в индекс. Для таблиц важно правильно обрабатывать листы, строки, артикулы и числовые значения.

Нужен ли OCR для PDF?

OCR нужен только для сканированных PDF, где текст не выделяется мышкой и не находится через Ctrl+F.

Можно ли открыть PDF сразу на найденной странице?

Иногда да, если PDF viewer и индекс хранят номер страницы. Но точное открытие зависит от просмотрщика PDF и структуры ссылки.

Можно ли закрыть PDF от публичного поиска?

Да. Нужно хранить уровень доступа документа и проверять права пользователя перед выводом результата и перед скачиванием файла.

Влияет ли поиск по PDF на скорость сайта?

Может влиять, если извлекать текст во время поиска. Правильно делать индексацию заранее и искать уже по подготовленному индексу.

Можно ли подключить поиск по документам к AI-чату?

Да. Документы можно превратить в базу знаний, чтобы AI-чат отвечал на вопросы по инструкциям, прайсам, каталогам и PDF-файлам.

Что делать, если документов очень много?

Нужно использовать фоновую индексацию, очередь, разбиение на фрагменты, фильтры и, при необходимости, отдельный поисковый движок вместо простого LIKE-поиска в MySQL.

Вывод

Поиск по PDF/документам на сайте нужен там, где важная информация хранится не только на страницах WordPress, но и внутри файлов: инструкций, каталогов, прайсов, договоров, архивов, технической документации и закрытых материалов.

Лучший результат даёт не просто PDF viewer, а полноценная система: извлечение текста, индексация, фильтры, права доступа, логи, фоновая обработка и понятный вывод результатов. Если добавить AI-поиск, документы становятся не мёртвым архивом, а рабочей базой знаний для посетителей, клиентов и сотрудников.

Об авторе

vkuzyomko administrator