- PVSM.RU - https://www.pvsm.ru -
Что-то блог MODX на Хабре совсем зачах. Нужно его немного оживить. Хочу представить вам свой не особо новый компонент, который недавно был практически полностью переписан и расширен.
Компонент называется mSearch [1]. Изначально он задумывался как простейший поиск по сайту, но с учетом морфологии русского языка. То есть, нужно было простое и легкое решение для любого сайта, без установки Sphinx и других серьезных систем.
В процессе гугления я натолкнулся на одну интересную реализацию [2] этой задачи при помощи phpMorphy [3]. Полнотекстовый поиск по таблице с индексом, с генерацией разных словарных форм. Идея мне приглянулась, под мои критерии она подходила и я написал свое решение, положив в основу этот метод.
Это сниппет и плагин. Сниппет ищет, плагин индексирует документы при сохранении.
Установка, как обычно, из репозитория, в 4 клика. При этом, вам будет предложено скачать и установить словари phpMorphy для русского языка — не отказывайтесь.
Если вы устанавливаете расширение на рабочий сайт, нужно будет проиндексировать имеющиеся документы. Делается это просто:
[[!mSearch?
&indexer=`1`
&offset=`0`
&limit=`200`
]]
Первый параметр показывает, что мы не ищем, а индексируем, а второй и третий — ограничение выборки, для больших сайтов. Если документов много, а сервер дохлый — придется работать в несколько запусков, меняя значение offset, в данном примере сначала 0, потом 200, потом 400 и т.д.
Индексация нужна только один раз, после установки на сайт, если там есть документы. Потом индексировать будет плагин mSearchIndexer при сохранении документов.
Все параметры mSearch вы можете увидеть в свойствах сниппета, а сюда я напишу только основные:
Параметры indexFields, includeTVs, includeTVList, disablePhpMorphy есть и у плагина. Они отвечают за индексацию ресурса при обновлении.
Также эти параметры влияют и на первичную индексацию (&indexer=`1`).
Обращая ваше внимание, что множество параметров не случайно называются как у getResources. Это означает, что и работают они так же. Сниппет прекрасно поддерживает вывод с пагинацией через getPage и может, в некоторых случая, спокойно заменять getResources.
Поиск идет по таблице индекса, что дает неплохую скорость, даже при большом количестве документов, проверял на ~6000 шт.
Конечно, этот метод не идеален, с релевантностью не все гладко, но лучше решения для русского языка и MODX в любом случае нет. Главное, на мой взгляд то, что можно довольно хорошо уточнить где искать, с каким шаблоном, среди каких родителей и т.д. Ну а параметр &where позволяет и вовсе, как угодно настроить поиск.
Погонять поиск можно тут [5]. Учтите, что морфология работает только для русского языка.
Здесь [6] можно посмотреть как выглядит SQL запрос. Там же чуть более подробный пример вызова сниппета.
Логичным применением mSearch стал поиск по товарам магазина, и вывод найденных результатов, вместо getResources. А это в свою очередь развилось в написание сниппета mFilter, для гибкой фильтрации найденных товаров.
Это второй сниппет в mSearch. Он предназначен для динамической генерации фильтров для найденных (или заранее указанных) ресурсов.
Фильтры строятся для ТВ параметров ресурсов, иили свойств товаров miniShop.
Выглядит это вот так [7].
Вы видите слева параметры, справа результаты поиска на моем демо-сайте по фразе «Sony». Возле каждого параметра есть циферки — это количество результатов, которое вы получите при выборе это параметра. То есть, все варианты фильтра просчитываются на лету, и невозможные комбинации отключаются.
Работает исключительно через Ajax (js скрипт [8] для примера прилагается). При загрузке страницы выбираются все нужные свойства ресурсов для построения фильтров, кэшируются, и выводится форма фильтров. при каждом изменении формы, она отправляется на сервере и в ответ приходят результаты и состояние переключателей фильтра.
Работает довольно шустро, но на действительно больших объемах пока не проверял.
Основные параметры mFilter:
Для вывода результатов фильтра необходимы сниппеты getPage [9], getResources [10](если используете miniShop — msGetResources).
Также требуются jquery плагины:
jQuery 1.7+ — основной помошник
jQueryUI 1.8+ — нужен только виджет slider для цен и других числовых значений
jQuery Form 2.7+ — отправка формы и прием ответа
Для вывода товаров из определенной категории магазина miniShop можно использовать такой сниппет (измените по вкусу):
if (!empty($_REQUEST['query'])) {return;}
$parent = $modx->resource->id;
$tmp = $modx->getChildIds($parent);
if (empty($tmp)) {return 0;}
$tpls = explode(',', $modx->getOption('minishop.goods_tpl'));
$q = $modx->newQuery('modResource', array('id:IN' => $tmp, 'template:IN' => $tpls, 'deleted:!=' => 1, 'published' => 1));
$q->select('id');
if ($q->prepare() && $q->stmt->execute()) {
$ids = $q->stmt->fetchAll(PDO::FETCH_COLUMN, 0);
return implode(',', $ids);
}
Все чанки оформления и js скрипт для работы идут в комплекте. Конечно, не факт, что у вас все получится настроить как надо с первого раза, для этого нужны кое-какие знания MODX, jQuery и понимание работы Ajax. При всех «не работает!» первым делом смотрите в консоль своего браузера на предмет ошибок javascript.
Но я, как смог, постарался упростить задачу построения фильтра. И теперь, при определенном желании, вы сможете сделать это у себя на сайтемагазине.
Автор: bezumkin
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/modx/9429
Ссылки в тексте:
[1] mSearch: http://modx.com/extras/package/msearch
[2] интересную реализацию: http://valera.ws/2007.09.05~morpho_search_in_mysql/
[3] phpMorphy: http://sourceforge.net/projects/phpmorphy/
[4] miniShop: http://habrahabr.ru/post/131456/
[5] можно тут: http://modx-minishop.ru/documentation/search.html?query=%D0%BA%D0%BE%D1%80%D0%B7%D0%B8%D0%BD%D0%B0
[6] Здесь: http://bezumkin.ru/modx/msearch/?query=%D0%BA%D0%BE%D1%80%D0%B7%D0%B8%D0%BD%D0%B0
[7] Выглядит это вот так: http://modx-minishop.ru/search.html?query=sony
[8] js скрипт: https://github.com/bezumkin/mSearch/blob/master/assets/components/msearch/js/mfilter.js
[9] getPage: http://modx.com/extras/package/getpage
[10] getResources : http://modx.com/extras/package/getresources
[11] Simple Dream: http://simpledream.ru
Нажмите здесь для печати.