Skip to content
mSearch
mSearch
Полнотекстовый поиск с морфологическим анализом для MODX 3
  1. Компоненты
  2. mSearch
  3. Интерфейс
  4. Индексация

Индексация

Вкладка для создания и управления поисковым индексом.

Назначение

Построение индекса — ресурсоёмкая операция, поэтому она выполняется порциями через Ajax-запросы. На этой вкладке вы можете создать индекс, отслеживать прогресс и очистить его при необходимости.

Интерфейс

Статистика

ПоказательОписание
Всего ресурсовОбщее количество ресурсов в системе
ПроиндексированоКоличество ресурсов в индексе
Слов в индексеОбщее количество слов

Элементы управления

ЭлементОписание
ПорцияКоличество ресурсов, обрабатываемых за один запрос (1-500)
Создать индексЗапустить индексацию
Очистить индексУдалить все записи из индекса

Прогресс-бар

Во время индексации отображается прогресс выполнения в процентах.

Как работает индексация

  1. Извлечение данных — из БД загружаются поля ресурса согласно настройке mse_index_fields
  2. Разбиение на слова — текст разбивается по регулярному выражению из mse_index_split_words
  3. Фильтрация — отбрасываются слова короче mse_index_min_word_length символов
  4. Морфологический анализ — для каждого слова генерируются базовые формы через phpMorphy
  5. Сохранение — слова с весами записываются в таблицу индекса

Системные настройки

Связанные настройки находятся в области Индексация — см. полное описание на странице Системные настройки.

Настройка весов полей

Параметр mse_index_fields определяет ценность слов в разных полях. Формат:

поле1:вес1,поле2:вес2,...

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

Примеры конфигурации

Стандартная:

pagetitle:3,longtitle:2,description:2,introtext:2,content:1

С TV-параметрами:

pagetitle:3,content:1,tv_subtitle:2,tv_keywords:3

Для товаров MiniShop3:

pagetitle:3,description:2,content:1,article:5,vendor_name:2

Когда нужно переиндексировать

Индекс обновляется автоматически при сохранении ресурсов. Полная переиндексация требуется:

  • При первой установке компонента
  • После изменения системных настроек индексации
  • После массового импорта контента

Рекомендации

ПорцияПрименение
50Стандартное значение для большинства серверов
10-20Для слабых серверов или больших документов
100+Для мощных серверов с быстрым хостингом

Оптимальное значение

Если при индексации возникают ошибки timeout, уменьшите размер порции.

Интеграция со Scheduler

mSearch поддерживает отложенную индексацию через компонент Scheduler. Это позволяет индексировать ресурсы в фоновом режиме, не замедляя сохранение документов.

Включение

  1. Установите компонент Scheduler
  2. Включите системную настройку mse_use_scheduler

Как это работает

При сохранении ресурса:

Без SchedulerСо Scheduler
Индексация выполняется сразуСоздаётся задача в очереди
Замедляет сохранениеСохранение мгновенное
Блокирует интерфейсИндексация в фоне

Задача mse_index_resource

Задача регистрируется автоматически при установке mSearch (если Scheduler уже установлен).

Параметры:

ПараметрОписание
resource_idID ресурса для индексации
(без параметров)Полная переиндексация всех ресурсов

Ручной запуск полной индексации

Вы можете запустить полную переиндексацию через Scheduler:

  1. Перейдите в Extras → Scheduler
  2. Найдите задачу mse_index_resource (namespace: msearch)
  3. Запустите задачу без параметров

Регулярная переиндексация

Через Scheduler можно настроить периодическую переиндексацию, например, раз в неделю.

Логирование

Задача записывает прогресс в лог MODX:

[mSearch indexResource task] Starting full reindex...
[mSearch indexResource task] Progress: 100/500 (indexed: 100)
[mSearch indexResource task] Progress: 200/500 (indexed: 200)
...
[mSearch indexResource task] Full reindex completed. Total indexed: 500

Fallback при отсутствии Scheduler

Если Scheduler не установлен или задача не найдена, mSearch автоматически переключается на прямую индексацию.

События

При индексации вызываются события — их полное описание см. на странице Плагин и события.

Пример: добавление поля с условием

Через mseOnGetWorkFields можно модифицировать список индексируемых полей на лету — например, для конкретного типа ресурса повысить вес pagetitle или подключить TV-поля:

php
<?php
/** @var array $fields by reference */
$fields = &$scriptProperties['fields'];
/** @var modResource $resource */
$resource = $scriptProperties['resource'];

if ($resource->get('class_key') === \MyApp\Model\News::class) {
    $fields['pagetitle'] = 5;
    $fields['tv_tags'] = 3;
}

Пример: индексация опций товаров MiniShop3 через свой адаптер

Для индексации связанных данных кастомных моделей правильный путь — собственный адаптер, реализующий ContentAdapterInterface. Сам адаптер регистрируется через событие mseOnRegisterAdapters:

php
<?php
// Плагин на событие mseOnRegisterAdapters
/** @var MSearch\Services\Indexer\IndexerInterface $indexer */
$indexer = $scriptProperties['indexer'];

$indexer->addAdapter(new \MyApp\Adapters\MsProductWithOptionsAdapter(
    $modx,
    $modx->services->get('msearch')
));

Адаптер сам решает, какие поля включить в индекс через getIndexableFields() и как извлечь их содержимое из объекта через extractContent(). Подробнее — см. Расширение компонента.