
Обслуживание
Вкладка для ручного запуска и диагностики индекса фасетов, кэша и прогрева. Большую часть этой работы mFilter выполняет сам.
Структура вкладки
┌───────────────────────────────────────────────────────────────────┐
│ Индекс фасетов [Активен] [Пересобрать сейчас] [Через Scheduler] │
│ Денормализованный индекс значений фильтров. │
│ Заменяет тяжёлые JOIN-запросы. │
│ │
│ 450.3 тыс 12.8 тыс 01.11.2026, 10:32 │
│ текстовых записей числовых записей последняя пересборка │
├───────────────────────────────────────────────────────────────────┤
│ Кэш данных фильтров [142 записей] [Очистить кэш] │
│ Промежуточные результаты вычислений. │
│ Очищается автоматически. │
├───────────────────────────────────────────────────────────────────┤
│ ▶ Прогрев baseIds (устаревает) [Legacy] │
└───────────────────────────────────────────────────────────────────┘Индекс фасетов
Индекс фасетов — значения фильтров (color, size, price, weight и т. п.), заранее собранные в две таблицы. Фильтрация читает их и не соединяет на каждом запросе таблицы товаров и опций. Без индекса фильтры работают, но медленнее: значения читаются из исходных таблиц.
Кнопки
| Кнопка | Как работает |
|---|---|
| Пересобрать сейчас | Сборка идёт в запросе админки, страницу нужно дождаться. Подходит, если сборка укладывается в таймаут веб-сервера |
| Через Scheduler | Сборка уходит в фон, без таймаута: выполнится на ближайшем срабатывании cron, когда до неё дойдёт очередь Scheduler. Кнопка видна, только если установлен Scheduler |
Пока индекс собирается, сайт работает: фильтры, которых ещё нет в индексе, читаются из исходных таблиц.
Если Scheduler поставили после mFilter, его задачи не зарегистрированы, и «Через Scheduler» собирает индекс синхронно. Переустановите пакет mFilter.
Статусы
| Статус | Что означает |
|---|---|
| Активен (зелёный) | Индекс построен и используется |
| В очереди Scheduler (синий) | Сборка ждёт очереди или уже идёт. Обе кнопки на это время недоступны |
| Не построен (жёлтый) | Индекс пустой. Кнопка называется «Построить сейчас», в карточке — предупреждение. Фильтры читают значения из исходных таблиц, медленнее |
Метрики
| Метрика | Описание |
|---|---|
| Текстовых записей | Число строк в mfl_facet_index_text (бренды, цвета, размеры) |
| Числовых записей | Число строк в mfl_facet_index_num (price, weight) |
| Последняя пересборка | Дата и время последней полной пересборки |
Когда индекс обновляется автоматически
- При сохранении набора фильтров — пересобираются только изменённые ключи
- При сохранении или удалении товара через админку MODX — точечно для этого товара (плагин на
OnDocFormSave/OnResourceDelete) - После CSV-импорта MiniShop3 (
msOnAfterImport) — полная пересборка - Каждые 5 минут задачей Scheduler
mfl_sync_facet_index— догоняет правки, после которых у ресурса обновлёнeditedon.$resource->save()иsetTVValue()его не обновляют - При установке и обновлении пакета — задача
mfl_rebuild_facet_indexставится в очередь Scheduler - Кнопкой «Переиндексация» в шапке админки
Когда нужна ручная пересборка
- После прямого SQL без обновления
editedon— синхронизация такие правки не видит - После
DELETE FROMнапрямую в базе - После восстановления товаров из корзины: при удалении их строки убраны из индекса, а восстановление их не возвращает. Достаточно и сохранить заново товар
- При расхождениях между фильтрами и реальными товарами
Подробнее: Синхронизация индекса фасетов.
Две пересборки одновременно не идут
Пока идёт полная пересборка индекса фасетов, вторая не запускается. Что будет вместо неё, зависит от того, кто её просит:
| Кто просит пересборку | Что будет |
|---|---|
| Задача Scheduler | Встанет в очередь на две минуты позже. Так до 60 раз, около двух часов, потом сдаётся — в журнале Facet index rebuild gave up |
| «Пересобрать сейчас» | Предупреждение «Уже выполняется», ничего не запустится |
| «Через Scheduler» | Кнопка недоступна, пока сборка в очереди или идёт |
| «Переиндексация» | Шаг индекса пропускается: с Scheduler — сообщение «Индекс фасетов уже в очереди», без него — «Эта работа уже выполняется». Остальные шаги пройдут |
| Синхронизация каждые 5 минут | Пропустит такт и вернётся в следующий, ничего не потеряв |
| Импорт MiniShop3 без Scheduler | Пересборка будет пропущена, в журнале — предупреждение |
Отложенный запуск не отменяет работу, ради которой его поставили: если индекс освободится за эти два часа, запуск выполнится и прочитает каталог заново.
Сохранение набора фильтров и товара обновляет индекс без этой очереди — частичная и точечная сборка идут параллельно с полной.
Так же защищены индексация значений TV и генерация алиасов: без защиты два параллельных обхода записывали одному значению два алиаса.
Чем опасны две сборки сразу
Полная пересборка очищает обе таблицы индекса и наполняет их заново — на крупном каталоге это минуты. Вторая выбросила бы всё, что успела записать первая, и окно, когда фильтры показывают неполный набор значений, растянулось бы на обе. Индекс в итоге остался бы полным, но каталог читался бы дважды.
Кэш данных фильтров
Промежуточные результаты вычислений: значения фильтров со счётчиками и прогретые списки товаров страниц.
Две части кэша стирают разные события, о прогретых списках см. также Прогрев кэша:
| Событие | Значения и счётчики | Прогретые списки товаров |
|---|---|---|
| Сборка индекса фасетов — полная или частичная, которая идёт при сохранении набора с изменёнными фильтрами | Очищает | Не стирает |
| Сохранение и удаление товара, синхронизация индекса | Очищает для страниц каталога с этим товаром, в том числе через дополнительные категории MiniShop3 | Не стирает |
| Сохранение набора фильтров | Очищает для его страниц | Стирает |
| Сохранение страницы каталога | Очищает для неё самой | Стирает |
| Кнопка «Очистить кэш» | Очищает | Стирает |
| Кнопка «Переиндексация» | Очищает | Стирает |
| Кнопка «Пересобрать кэш» на вкладке «Наборы фильтров» | Очищает | Стирает |
Задачи mfl_reindex_slugs и mfl_rebuild_cache | Очищают | Стирают |
Прежние счётчики после правки товара остаются, пока не истечёт срок кэша (mfilter.cache_lifetime, по умолчанию час), в двух случаях:
- у страницы, чей список товаров задаёт не её дерево:
&parents,&resources, поиск; - у категории, из которой товар перенесли.
Кнопка «Очистить кэш»
Нужна только при отладке расхождений данных.
Удаляет значения, счётчики и прогретые списки товаров — страницы остаются непрогретыми до ближайшего прогрева. Служебные записи остаются: метки индекса фасетов и параметры вызовов сниппетов, кроме тех, что давно не запрашивали. Поэтому счётчик записей после очистки не нулевой.
Прогрев baseIds (устаревает)
Заранее получает списки товаров страниц, где mFilter вызван с &element. После стабилизации индекса фасетов будет упрощён или удалён. Не отключайте, если не уверены.
Подробнее: Прогрев кэша.
Кнопка «Переиндексация» в шапке
Полезна после массовых изменений в каталоге. Кнопка в правом верхнем углу админки запускает две независимые работы:
- индекс TV, алиасы значений фильтров и очистка кэша — строго в этом порядке. Алиас строится из подписи, которую держит индекс TV. Кэш очищается последним, иначе за время пересборки он наполнится наполовину обновлёнными данными;
- сборка индекса фасетов.
Порядок между этими двумя работами не задан: с Scheduler обе уходят в очередь и выполняются в том порядке, в каком он до них доберётся.
Алиасы строятся по наборам фильтров — так же, как кнопкой «Сгенерировать» на вкладке «Алиасы». Обе кнопки и задача Scheduler дают одни и те же алиасы, но кэш очищают только «Переиндексация» и задача.
Сборка индекса фасетов сама сбрасывает кэш значений и счётчиков, даже если оборвалась на середине, — нажимать «Очистить кэш» после неё не нужно. Если настроен прогрев и установлен Scheduler, ближайший прогрев переносится на «сейчас». После оборвавшейся сборки — нет: такой индекс нужно пересобрать.
Подсветка
| Цвет | Что значит |
|---|---|
| Серая | Индекс актуален, при необходимости можно перезапустить |
| Жёлтая, с подписью «Построить индекс» | Индекс ещё не построен — нажмите для первой сборки |
С Scheduler и без него
С Scheduler оба шага уходят в фон: кнопка отвечает сразу, работа выполняется на ближайшем срабатывании cron. Два исключения:
- сборка индекса уже в очереди или идёт — этот шаг пропускается с сообщением «Индекс фасетов уже в очереди»;
- Scheduler поставили после mFilter — задачи не зарегистрированы, и оба шага идут синхронно. Переустановите пакет mFilter.
Без Scheduler всё выполняется синхронно, и страницу нужно дождаться. На крупных каталогах обход наборов занимает минуты и может упереться в таймаут веб-сервера. Тогда сообщение назовёт шаг, ответа которого не дождались:
- сборка индекса фасетов после таймаута продолжается на сервере — сразу нажимать второй раз не стоит;
- шаг «индекс TV и алиасы» таймаут может оборвать.
Проверьте, что cron для Scheduler работает
Если Scheduler установлен, но его cron не настроен, задача встанет в очередь и не выполнится: кнопка отчитается, что работа запущена, а данные останутся прежними. Очередь видна в разделе Scheduler — у выполненной задачи заполнено время запуска.
Диагностика
Индекс не построен — фильтры медленные
Если статус индекса — «Не построен», нажмите «Построить сейчас». После сборки число записей должно стать больше нуля.
Пустой индекс не даёт нулей в счётчиках: фильтры без строк в индексе читаются из исходных таблиц.
Товар есть в каталоге, но пропадает при выборе фильтра
Сохраните товар заново или пересоберите индекс кнопкой «Пересобрать сейчас». Фильтр есть в индексе, а строк этого товара в нём нет — так бывает после прямых SQL-вставок и после восстановления товара из корзины.
Индекс пересобран не полностью
Сообщение «Индекс пересобран не полностью. Не удалось записать фильтры: …» — эти фильтры читаются из исходных таблиц, медленнее. Причина — в журнале ошибок MODX.
Статус «В очереди Scheduler» не уходит часами
Найдите в Scheduler запуск задачи mfl_rebuild_facet_index и удалите его. Сборку оборвали — например, перезапуском PHP, — а её запуск остался со статусом «выполняется». Пока его не удалить, обе кнопки недоступны.
Долгая сборка зависает
Если «Пересобрать сейчас» не возвращает ответ, установите Scheduler и собирайте кнопкой «Через Scheduler» — сборка уйдёт в фон без таймаута.
Записи в журнале
При пересборке через Scheduler в журнал MODX пишется:
[mFilter] Facet index full rebuild started
[mFilter] Facet index: indexed 145320 rows for 'color'
[mFilter] Facet index: indexed 87234 rows for 'size'
[mFilter] Facet index rebuild done: 8 filters, 450320 text rows, 12845 num rows, 8432msКнопка «Пересобрать сейчас» при успехе в журнал не пишет.
API статуса
Этим запросом админка заполняет строку состояния — его можно использовать и для своего мониторинга. Нужна сессия менеджера с правом mfilter.
GET /assets/components/mfilter/connector.php?route=/maintenance/status
{
"success": true,
"version": "1.9.1",
"facet_index": {
"is_built": true,
"is_pending": false,
"needs_attention": false,
"text_rows": 450320,
"num_rows": 12845,
"total_rows": 463165,
"last_built_at": 1730633520
},
"counts": {
"filter_sets": 3,
"slugs": 1450,
"word_forms": 87,
"warmup_configs": 2,
"cache_records": 142
},
"dependencies": {
"minishop3": true,
"msearch": false,
"scheduler": true
}
}Пример сокращён. Ещё в ответе есть:
tv_index,cache,php_version,modx_version;- в
counts—patterns,templates,tv_index,facet_index_text,facet_index_num; - в
facet_index—last_built_at_iso.
Системные таблицы
| Таблица | Назначение |
|---|---|
mfl_facet_index_text | Текстовые значения фильтров |
mfl_facet_index_num | Числовые значения фильтров |
mfl_request_runs / mfl_request_ids | Регистрация больших списков ID для JOIN |
mfl_cache | Кэш результатов фильтрации |
Подробнее о структуре: Модели и БД.
