[mSearch2] Версия 0.6.0 beta

Продолжается усовершенствование компонента морфологического поиска и фильтрации для MODX Revolution.

В новой версии довольно много улучшений, касающихся, в основном, подсчета предварительных результатов и скорости фильтрации.

Поиск

Улучшен процесс индексирования ресурсов. Теперь в него попадает меньше ненужных слов, которые не влияют на результаты. Минимальная длина слова теперь равна 4, советую обновить у себя системную настройку mse2_index_min_words_length и переиндексировать документы.

Запросы, состоящие из 2х и более цифр, без букв, участвуют в поиске независимо от этой настройки. Это сделано для поиска артикулов, id и прочей числовой информации.

Если для вывода результатов работы фильтра используется сниппет mSearch2, то он будет показывать вес найденных результатов. То есть, при фильтрации поиска работает параметр [[+weight]] в чанке, и вы видите, какой суммарный вес набрал тот или иной результат.

Соответственно, сниппет mSearch2 умеет принимать в параметр &resources=`` JSON строку с id ресурсов с качестве ключей, и их весом, в качестве значений. Именно эту особенность и использует предыдущая фича.

Фильтрация

Добавлен параметр &toPlaceholder=``. Если в нем что-то есть, то mFilter2 вместо вывода готового чанка сохранит все свои данные в плейсхолдеры [[+total]], [[+results]] и [[+filters]]. Может пригодиться для сайтов со сложной версткой.

В новой версии вы можете перезагрузить метод getSuggestions(), подсчитывающий предварительные результаты, просто объявив его в своем классе фильтрации. То есть, теперь вы можете поменять логику подсчета циферок возле фильтров (если захотите).

Параметр &disableSuggestions=`` переименован в более логичный &suggestions=``. Его можно выставить в 0 или 1, для выкл\вкл предсказаний результатов фильтра.

Фильтрация ресурсов с генерацией предсказаний довольно тяжелая операция, поэтому теперь в логе админу выводится общее кол-во фильтров, результатов и фильтраций.


Из этого следуют и 2 новых параметра, отключающих предсказания при больших выборках:
&suggestionsMaxResults=`1000` — максимальное количество фильтруемых ресурсов. Если больше — предсказания отключатся.
&suggestionsMaxFilters=`200` — то же самое, только считаются сами фильтры.

Конечно, эти 2 параметра можно и отключить, выставив в 0, но лучше подобрать циферки, отвечающие возможностям вашего хостинга — чтобы оградить себя от возможных тормозов.

Добавлена возможность выводить фильтры не только чекбоксами, но и радиокнопками. У сниппета mFilter2 появился параметр &suggestionsRadio=``, в котором нужно указать радиофильтры, например:
[[!mFilters2?
	&filters=`
		resource|class_key
		,ms|new:boolean
	`
	&suggestionsRadio=`
		resource|class_key
		,ms|new
	`
	&tplFilter.row.resource|class_key=`tpl.mFilter2.filter.radio`
	&tplFilter.row.ms|new=`tpl.mFilter2.filter.radio`
]]
Отличие радиокнопок от чекбоксов в том, что за раз можно выбрать только один пункт из группы, и для соседних элементов предсказания не будут суммироваться. То есть, это переключатель фильтра, а не выбор нескольких вариантов.

При указании &parents=`` добавлена поддержка мультикатегорий miniShop2.

Добавлена возможность изменить разделитель выбранных элементов в урл фильтра на фронтенде. По умолчанию, это по-прежнему запятая, но можно указать любой другой символ, например двоеточие.

Это сделано для тех случаев, когда фильтруются параметры с запятыми. Укажите
[[!mFilters2?
	&filters=`
		resource|class_key
		,ms|new:boolean
	`
	&values_delimeter=`:`
]]
и у вас будет такой url: search.html?resource|parent=547:87:55

Обратите внимание, что на фронтенде переменная mSearch2Config.delimeter переименована в mSearch2Config.filter_delimeter. Если вы модифицировали стандартный javascript — нужно поправить.

Заключение

Но самое значительное улучшение новой версии — скорость подсчета предварительных результатов поиска. Благодаря нескольким не особо хитрым оптимизациям, время работы сокращено во много раз.

К примеру, вот на этой странице при клике на фильтр класса Ticket раньше было 2,5 сек, а теперь — 0.03 сек.

Достигается это заменой функций in_array() и array_diff() на комбинацию array_flip() + isset(), что при больших массивах и многих итерациях даёт поистине потрясающий прирост производительности.

На всякий случай — ссылка на страницу компонента.

Следующая заметка
[Office] Личный кабинет miniShop2
Предыдущая заметка
Фильтры для магазина: mFilter2 + msProducts


Комментарии ()

  1. Виталий Князь 30 июня 2013, 13:52 # 0
    «Бесконечность — не предел»
    1. Смирнов Николай 30 июня 2013, 16:02 # 0
      суумироваться
      Добавление новых комментариев отключено.