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

mSearch

Полнотекстовый поиск с морфологическим анализом для MODX Revolution 3.x.

Возможности

  • Морфологический анализ — поиск по словоформам с помощью библиотеки phpMorphy (русский, английский, немецкий, украинский языки)
  • Словарный индекс — быстрый поиск с настраиваемыми весами полей
  • Алиасы поиска — синонимы и замены для расширения результатов
  • Статистика запросов — отслеживание популярных запросов
  • Автоматическая индексация — при сохранении ресурсов
  • Отложенная индексация — фоновая индексация через Scheduler
  • Vue-интерфейс — современная админ-панель на Vue 3 + PrimeVue
  • Автодополнение — подсказки при вводе запроса

Системные требования

ТребованиеВерсия
MODX Revolution3.0.0+
PHP8.1+
MySQL5.7+ / MariaDB 10.3+

Зависимости

  • pdoTools 3.x — для работы сниппетов и шаблонизатора Fenom
  • VueTools — для административного интерфейса
  • Scheduler (опционально) — для отложенной индексации

Установка

Через менеджер пакетов

  1. Перейдите в Extras → Installer
  2. Нажмите Download Extras
  3. Найдите mSearch в списке
  4. Нажмите Download и затем Install

После установки:

  1. Перейдите в Extras → mSearch → Словари
  2. Скачайте морфологический словарь для нужного языка (русский, английский, немецкий, украинский)
  3. Перейдите на вкладку Индексация и создайте поисковый индекс

Быстрый старт

1. Создайте страницу поиска

Создайте ресурс для вывода результатов поиска, например /search/.

2. Добавьте форму и результаты

fenom
{'!mSearchForm' | snippet : [
    'pageId' => 5,
    'autocomplete' => 1
]}

{'!mSearch' | snippet : [
    'tpl' => 'mSearch.row',
    'limit' => 10
]}

3. Настройте индексацию

Укажите в системных настройках поля для индексации:

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

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

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

Все настройки имеют префикс mse_ и находятся в пространстве имён msearch.

Индексация

НастройкаПо умолчаниюОписание
mse_index_fieldspagetitle:3,longtitle:2,description:2,introtext:2,content:1Поля для индексации с весами
mse_index_min_word_length3Минимальная длина слова для индексации
mse_index_split_words#\s|[,.:;!?"'«»„"()\[\]{}<>]#uРегулярное выражение для разделения текста на слова
mse_use_schedulerfalseИспользовать Scheduler для отложенной индексации

Поиск

НастройкаПо умолчаниюОписание
mse_search_exact_match_bonus10Бонус за точное совпадение запроса в тексте
mse_search_like_match_bonus3Бонус за LIKE-совпадение
mse_search_all_words_bonus5Бонус если все слова запроса найдены
mse_search_split_words#\s+#uРегулярное выражение для разделения запроса

Фронтенд

НастройкаПо умолчаниюОписание
mse_frontend_css[[++assets_url]]components/msearch/css/web/msearch.cssURL CSS файла
mse_frontend_js[[++assets_url]]components/msearch/js/web/msearch.jsURL JS файла

Плейсхолдеры

После выполнения поиска доступны плейсхолдеры:

ПлейсхолдерОписание
[[+mse.total]]Общее количество найденных результатов
[[+mse.query]]Обработанный поисковый запрос

В чанке результата (tpl):

ПлейсхолдерОписание
[[+weight]]Вес (релевантность) результата
[[+intro]]Текст с подсвеченными совпадениями
[[+idx]]Порядковый номер результата

События

СобытиеОписание
mseOnRegisterAdaptersРегистрация адаптеров для индексации кастомных моделей
mseOnBeforeIndexПеред индексацией ресурса
mseOnGetWorkFieldsИзменение списка полей для индексации
mseOnAfterIndexПосле индексации ресурса
mseOnBeforeSearchПеред выполнением поиска
mseOnAfterSearchПосле выполнения поиска

Отличия от mSearch2

mSearch — это полностью переписанный компонент для MODX 3.x:

АспектmSearch2mSearch
MODX2.x3.x
PHP5.6+8.1+
ИнтерфейсExtJSVue 3 + PrimeVue
АрхитектураПроцедурныйService-based
АлиасыСинонимыАлиасы (синонимы + замены)
ФильтрацияmFilter2Нет (используйте pdoTools)
phpMorphyВстроенныйComposer-пакет cijic/phpmorphy
Источник словарейSourceForgeGitHub
Эстонский языкДаНет
SchedulerНетДа (отложенная индексация)

mFilter2

Сниппет mFilter2 не входит в mSearch. Для фильтрации используйте стандартные возможности pdoTools или сторонние решения.

Примеры

Базовый поиск

fenom
<form action="{'search' | url}" method="get">
    <input type="text" name="mse_query" value="{$_GET['mse_query']}" placeholder="Поиск...">
    <button type="submit">Найти</button>
</form>

{'!mSearch' | snippet : [
    'tpl' => 'mSearch.row',
    'limit' => 10
]}

С пагинацией

fenom
{'!mSearchForm' | snippet : ['pageId' => $_modx->resource.id]}

{'!pdoPage' | snippet : [
    'element' => 'mSearch',
    'tpl' => 'mSearch.row',
    'limit' => 10
]}

{$_modx->getPlaceholder('page.nav')}

Поиск товаров MiniShop3

fenom
{'!pdoPage' | snippet : [
    'element' => 'msProducts',
    'parents' => 0,
    'resources' => '!mSearch' | snippet : ['return' => 'ids', 'limit' => 0] | default : '999999',
    'sortby' => 'ids'
]}

{$_modx->getPlaceholder('page.nav')}

Поддержка