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

mSearch

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

Использует pdoTools для вывода, поэтому поддерживает все основные возможности: подключение TV, указание условий в &where и т.д.

Некэшируемый вызов

Сниппет должен вызываться некэшированно!), так как реагирует на поисковый запрос из $_REQUEST.

Параметры

ПараметрПо умолчаниюОписание
query$_REQUEST['mse_query']Поисковый запрос
tplmSearch.rowЧанк оформления для каждого результата
tplWrapperЧанк-обёртка для всех результатов
limit10Лимит результатов
offset0Смещение для пагинации
outputSeparator\nРазделитель между результатами
toPlaceholderСохранить результаты в плейсхолдер вместо вывода
returnchunksФормат вывода: chunks, ids, json, data

Параметр return

ЗначениеОписание
chunksВывод через чанки (по умолчанию)
idsТолько ID найденных ресурсов через запятую
jsonJSON массив с данными ресурсов
dataМассив данных (для использования в других сниппетах)

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

Глобальные плейсхолдеры

После выполнения сниппет устанавливает:

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

Плейсхолдеры в чанке tpl

ПлейсхолдерОписание
[[+id]]ID ресурса
[[+pagetitle]]Заголовок
[[+longtitle]]Расширенный заголовок
[[+introtext]]Вводный текст
[[+content]]Содержимое
[[+weight]]Релевантность (вес) результата
[[+intro]]Текст с подсвеченными совпадениями
[[+idx]]Порядковый номер в списке
и другие поля ресурса...

Плейсхолдеры в чанке tplWrapper

ПлейсхолдерОписание
[[+output]]Все результаты
[[+total]]Количество результатов
[[+query]]Поисковый запрос

Примеры

Базовый вызов

fenom
{'!mSearch' | snippet}

С кастомным чанком

fenom
{'!mSearch' | snippet : [
    'tpl' => 'mySearchResult',
    'limit' => 20
]}

С обёрткой

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

Чанк mSearch.wrapper:

fenom
{if $total > 0}
<div class="search-results">
    <p>Найдено результатов: {$total} по запросу "{$query}"</p>
    <div class="results-list">
        {$output}
    </div>
</div>
{else}
<p>Ничего не найдено</p>
{/if}

С пагинацией через pdoPage

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

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

Получение только ID

Полезно для передачи в другие сниппеты:

fenom
{set $ids = '!mSearch' | snippet : [
    'return' => 'ids',
    'limit' => 0
]}

{if $ids}
{'msProducts' | snippet : [
    'resources' => $ids,
    'sortby' => 'ids'
]}
{else}
<p>Товары не найдены</p>
{/if}

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

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

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

Фильтр default

Фильтр | default : '999999' подставляет несуществующий ID, если поиск не дал результатов. Это предотвращает вывод всех товаров при пустом запросе.

JSON для AJAX

fenom
{'!mSearch' | snippet : [
    'return' => 'json',
    'limit' => 5
]}

Чанк по умолчанию

Чанк mSearch.row:

fenom
<div class="search-result">
    <h3>
        <a href="{$id | url}">{$pagetitle}</a>
        <span class="weight">{$weight}</span>
    </h3>
    {if $intro}
    <p class="intro">{$intro}</p>
    {/if}
</div>

Подсветка результатов

Плейсхолдер [[+intro]] содержит фрагмент текста с подсвеченными найденными словами. По умолчанию слова оборачиваются в <mark>.

Настройки подсветки (через сервис Highlighter):

  • Максимальная длина фрагмента: 200 символов
  • Текст обрезается с многоточием вокруг первого совпадения

Алгоритм поиска

  1. Разбиение запроса — запрос разбивается на слова
  2. Обработка алиасов — применяются синонимы и замены
  3. Морфологический анализ — для каждого слова ищутся базовые формы
  4. Поиск в индексе — поиск слов в таблице индекса
  5. LIKE-поиск — дополнительный поиск по полному тексту
  6. Применение бонусов — добавление веса за точные совпадения
  7. Сортировка — результаты сортируются по релевантности

События

Сниппет вызывает события:

  • mseOnBeforeSearch — перед поиском, можно модифицировать запрос
  • mseOnAfterSearch — после поиска, можно модифицировать результаты