Skip to content
mFilter
mFilter
Фасетная фильтрация для MODX 3 с поддержкой SEO URL
  • MODX 3
  • PHP 8.1
  • Vue 3
  1. Компоненты
  2. mFilter
  3. Интерфейс админки
  4. Обслуживание

Обслуживание ​

Вкладка для ручного запуска и диагностики индекса фасетов, кэша и прогрева. Большую часть этой работы 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

json
{
  "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Кэш результатов фильтрации

Подробнее о структуре: Модели и БД.