Странные результаты поиска в mSearch3. Msearch2 modx revo настройка


mSearch3 / Сниппеты / mSearch3 / docs.modx.pro

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

В работе использует pdoTools, поэтому обладает всеми основными возможностями: подключение ТВ, таблиц, указание условий в &where, &select и т.д. По большому счету, этот сниппет является переделанным pdoResources с двумя отличиями:

Сниппет должен реагировать на передаваемые запросы, поэтому его нужно вызывать некэшированным.

Параметры

Название По умолчанию Описание
&tpl tpl.mSearch3.row Чанк оформления для каждого результата. Обычные плейсхолдеры ресурса + [[+weight]] и [[+intro]].
&returnIds false Вернуть только список id подходящих страниц, через запятую.
&showLog false Показывать дополнительную информацию о работе сниппета. Только для авторизованных в контекте «mgr».
&limit 10 Лимит выборки результатов.
&offset 0 Пропуск результатов с начала выборки.
&depth 10 Глубина поиска ресурсов от каждого родителя.
&outputSeparator \n Необязательная строка для разделения результатов работы.
&toPlaceholder Если не пусто, сниппет сохранит все данные в плейсхолдер с этим именем, вместо вывода не экран.
&parents Список категорий, через запятую, для ограничения вывода результатов.
&includeTVs Список ТВ параметров для выборки, через запятую. Например: «action,time» дадут плейсхолдеры [[+action]] и [[+time]].
&tvPrefix Префикс для ТВ плейсхолдеров, например «tv.».
&where Дополнительные параметры выборки, закодированные в JSON.
&showUnpublished false Показывать неопубликованные товары.
&showDeleted false Показывать удалённые ресурсы.
&showHidden true Показывать ресурсы, скрытые в меню.
&hideContainers false Скрывать ресурсы-контейнеры.
&introCutBefore 50 Укажите количество символов для вывода в плейсхолдере [[+intro]] перед первым совпадением в тексте.
&introCutAfter 250 Укажите количество символов для вывода в плейсхолдере [[+intro]] после первого совпадения в тексте.
&htagOpen <b> Открывающий тег для подсветки найденных результатов в [[+intro]].
&htagClose </b> Закрывающий тег для подсветки найденных результатов в [[+intro]].
&parentsVar parents Имя переменной для дополнительной фильтрации по родителям. Может быть передано через $_REQUEST.
&queryVar query Имя переменной для получения поискового запроса из $_REQUEST.
&tplWrapper Чанк-обёртка, для заворачивания всех результатов. Понимает плейсхолдеры: [[+output]], [[+total]], [[+query]] и [[+parents]].
&wrapIfEmpty false Включает вывод чанка-обертки &tplWrapper даже если результатов нет.
&forceSearch true Обязательный поиск для вывода результатов. Если нет поискового запроса - ничего не выводится.
&minQuery 3 Минимальная длина поискового запроса.
&fields Переопределение системной настройки веса для проиндексированных полей, через запятую: &fields=`pagetitle:5,content:3,comment:1`. По умолчанию используется mse2_index_fields.
&showSearchLog false Показывать подробную информацию о начислении баллов поиска ресурсам при включенном &showLog.

Лексиконы

Сниппет может выдавать сообщения об ошибках поиска, которые меняются с словарях системы.

Там же находятся и другие записи, используемые с чанках и сниппетах по умолчанию.

Форма поиска

Для работы сниппету нужен только поисковый запрос в массиве $_REQUEST. Его может отправить простейшая форма:

<form action="/search.html" method="get"> <input type="text" name="query" value="[[+mse2_query]]" /> <button type="submit">Искать!</button> </form>

Обратите внимание, что запрос должен передаваться под тем же именем, что указано в параметре &queryVar, по умолчанию это query.

Примеры

Если у формы указан пустой action, то она отправляется на текущую страницу:

<form action="" method="get"> <input type="text" name="query" value="[[+mse2_query]]" /> <button type="submit">Искать!</button> </form> [[!mSearch3]]

Можно использовать разбивку на страницы при помощи pdoPage. mSearch3 устанавливает pdoTools автоматически, так что pdoPage у вас уже есть.

<form action="" method="get"> <input type="text" name="query" value="[[+mse2_query]]" /> <button type="submit">Искать!</button> </form> [[!pdoPage? &element=`mSearch3` ]] [[!+page.nav]]

Сниппет можно вызывать вместе с mSearchForm

[[!mSearchForm]] [[!pdoPage? &element=`mSearch3` ]] [[!+page.nav]]

Также mSearch3 можно использовать для поиска и вывода товаров вместе с msProducts:

[[!pdoPage? &element=`msProducts` &parents=`0` &resources=`[[!mSearch3:default=`999999`?returnIds=`1`&limit=`0`]]` &sortby=`ids` ]] [[!+page.nav]]

Параметр returnIds указывает msProducts список найденных товаров для вывода. А фильтр default подставляет отсутствующий id в случаях, когда ничего не найдено, иначе msProducts будет выводить все товары подряд.

При таком вызове вы сможете использовать все поля товаров в чанке оформления.

docs.modx.pro

[mSearch3] Версия 0.6.0 beta / Расширения MODX / Блоги / bezumkin.ru

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

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

Поиск

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

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

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

Соответственно, сниппет mSearch3 умеет принимать в параметр &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

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

Заключение

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

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

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

Добавление новых комментариев отключено.

bezumkin.ru

MODX Revo - Создание поиска для блога

На этом уроке мы создадим для нашего блога, который работает под управлением CMF MODX Revolution, систему поиска с помощью компонента mSearch.

  • Скачаем и установим компонент "mSearch".

  • Проиндексируем страницы нашего сайта.

    Индексация существующих страниц блога осуществляется посредством нижеприведённого кода, который необходимо добавить в любой шаблон.

    [[!mSearch? &indexer=`1` &offset=`1` &limit=`500` ]]

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

    Например, вставим вышеприведённый код в содержимое главной страницы:

    Откроем главную страницу нашего блога и увидим результат индексирования ресурсов сниппетом mSearch:

    После этого данный код можно удалить из содержимого главной страницы.

    Во время исполнения данный сниппет проиндексирует первые 500 ресурсов нашего блога. Первый параметр (indexer) указывает на то, что сниппет mSearch будет выполнять не поиск, а индексацию ресурсов блога. Второй и третий параметр (offset и limit) задаёт ограничение на выборку ресурсов, которые необходимо проиндексировать. Если на Вашем блоге содержится больше чем 500 ресурсов (например, 1200), то производить их индексацию придётся в несколько запусков:

    Индексацию ресурсов достаточно выполнить только один раз, после установки компонента mSearch. Ресурсы, которые будут добавляться уже после установки компонента mSearch индексировать с помощью сниппета не надо. Они будут индексироваться автоматически с помощью плагина, который идёт в комплекте с данным компонентом.

  • Изменим название плейсхолдеру total в сниппете mSearch. Это необходимо сделать для того, чтобы избежать конфликтов, т.к. данное имя плейсхолдера также использует компонент Tickets.

  • Создадим ресурс (страницу) "Поиск" и запомним его идентификатор (id). В дальнейшем он нам пригодится для создания формы поиска.

  • Создадим шаблон "Поиск".

    • Скопируем код из любого другого шаблона (например, блог). Удалим из него лишний код, т.е. оставим только код, формирующий основную структуру веб-страницы.

      <!DOCTYPE html> <html lang="ru"> [[$chunk.head]] <body> <div> <div> [[$chunk.header]] [[$chunk.navbar]] <div> <h2>[[*pagetitle]]</h2> </div> <div> </div> </div> </div> [[$chunk.footer]] </body> </html>
    • Разработаем форму поиска:

      <!-- Контейнер, который будет содержать форму --> <div> <!-- Форма поиска --> <!-- 14 - это id ресурса, в котором будут отображаться результаты поиска --> <form action="[[++site_url]][[~14]]" method="get"> <div> <div> <input type="text" name="query" maxlength="50" value="[[+mse.query]]" placeholder="Найти"> </div> <button type="submit"><i></i> Поиск</button> </div> </form> </div>
    • Разработаем код, который будет выводить результаты поиска с помощью сниппетов pdoResources и mSearch:

      [[!pdoResources? &parents=`2` &showHidden=`1` &resources=`[[!mSearch? &parents=`2` &showHidden=`1` &returnIds=`1`]]` &limit=`10` &tpl=`searchTpl` &tplWrapper=`@INLINE <h3>Результаты поиска по запросу: [[+mse.query]] ([[+mse.total]])</h3> [[+mse.total:isnot=`0`:and:isnot=``:then=`[[+output]]`]]` ]]

      где:

      • parents=`2` - указывает сниппету mSearch на то, что поиск необходимо производить только в ресурсах, имеющих в качестве родителя ресурс с id=2.

      • &showHidden=`1` - указывает сниппетам на то, что необходимо выбирать ресурсы, скрытые для меню.

      • returnIds=`1` - указывает сниппету mSearch на то, что необходимо возвращать вместо оформленных результатов идентификаторы (id) ресурсов.

      • tpl=`searchTpl` - указываем сниппету pdoResources на то, что в качестве шаблона для вывода каждого найденного результата (ресурса) необходимо использовать чанк searchTpl.

      • limit=`10` - указывает сниппету pdoResources на то, что необходимо ограничить количество результатов выборки до 10.

      • resources - указывает сниппету pdoResources на то, что необходимо использовать ресурсы предоставленные сниппетом mSearch.

      • tplWrapper - шаблон, который предназначен для оборачивания результатов работы сниппета pdoResources. Код [[+mse.total... выполняет следующее: он проверяет, не является ли значение плейсхолдера [[+mse.total]] равным нулю и пустой строке. Если это условие выполняется, то выводятся результаты работы сниппета с помощью плейсхолдера [[+output]]. В противном случае ничего не выводится. Данное условие необходимо из-за того, что когда сниппет mSearch не находит не один подходящий ресурс, то он выводит все ресурсы сайта.

      • [[+mse.total]] - плейсхолдер, который содержит число найденных ресурсов сниппетом mSearch.

      • [[+mse.query]] - плейсхолдер, который содержит текст запроса.

    • Итоговый код шаблона "Поиск":

    <!DOCTYPE html> <html lang="ru"> [[$chunk.head]] <body> <div> <div> [[$chunk.header]] [[$chunk.navbar]] <div> <h2>[[*pagetitle]]</h2> <div> <form action="[[++site_url]][[~14]]" method="get"> <div> <div> <input type="text" name="query" maxlength="50" value="[[+mse.query]]" placeholder="Найти"> </div> <button type="submit"><i></i> Поиск</button> </div> </form> </div> [[!pdoResources? &parents=`2` &showHidden=`1` &resources=`[[!mSearch? &parents=`2` &showHidden=`1` &returnIds=`1`]]` &limit=`10` &tpl=`searchTpl` &tplWrapper=`@INLINE <h3>Результаты поиска по запросу: [[+mse.query]] ([[+mse.total]])</h3> [[+mse.total:isnot=`0`:and:isnot=``:then=`[[+output]]`]]` ]] </div> <div> </div> </div> </div> [[$chunk.footer]] </body> </html>
  • Создадим чанк searchTpl со следующим содержимым:

    <div> <div> <a href="[[++site_url]][[~[[+id]]]]">[[+pagetitle]]</a> </div> <div>[[+description]]</div> </div>
  • Установим ресурсу (странице) "Поиск" шаблон "Поиск".

  • Создадим форму "Поиск" для остальных страниц блога.

    • Создадим чанк "search" со следующим содержимым:

      <div> <h5>Поиск</h5> <form action="[[++site_url]][[~14]]" method="get"> <div> <input type="text" name="query" maxlength="50" value="" placeholder="Найти"> <span> <button type="submit">Найти</button> </span> </div> </form> </div>
    • Добавим чанк "search" в необходимые шаблоны нашего блога:

  • Результаты урока представим в виде следующих изображений:

    itchief.ru

    Странные результаты поиска в mSearch3 / modx.pro

    Всем привет! Прошу помочь мне в следующей задаче.

    Суть в том, что при выполнении всех условий поиска — получаем положительный ответ. При не выполнении условий — отрицательный. Но если в поисковый запрос ввести значение, которое в индексе есть, но не подходит под условия этого самого поиска — то не выдается никакой ответ, ни положительный, не отрицательный.

    Если описать проблему подробнее и на примерах:

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

    Сперва я решил сделать все наименования типов для моделей — их дочерними ресурсами. И искать по дочерним ресурсам. Реализация была следующая:

    [[!mSearchForm? &autocomplete=`queries` &minQuery=`1`]] [[!pdoPage? &parents=`[[*id]]` &element=`mSearch3` &tpl=`tpl.mSearch3_type.row` &tplWrapper=`tpl.mSearch3_wrapModel` &wrapIfEmpty=`1` &minQuery=`1` ]] [[!+page.nav]]

    Шаблоны были такими:

    tpl.mSearch3_type.row

    <div> Данный тип серии подходит. </div>tpl.mSearch3_wrapModel<div>[[+output]]</div> Структура была такая:

    Все отлично, ищет. Но возник косяк, который увы, мне не удается решить.

    Допустим мы находимся на странице с id = 2.

    Вводим 57826 — Положительный ответ. Вводим билиберду — Отрицательный ответ. Вводим 57891 (т.е. тот, что уже есть в ресурсах, но исходя из условий поиска должен давать отрицательный результат) — Не получаем ответа вообще, не выдается ничего.

    Потом я пробовал сделать по другому.

    Создал TV авто-метку, вводил типы в него, и искал по этому полю, в настройках mSearch3 в настройке mse2_index_fields поставил значение: tv_searchType:3. Обновил индекс. Вызов изменил на такой:

    [[!pdoPage? &element=`mSearch3` &tpl=`tpl.mSearch3_type.row` &tplWrapper=`tpl.mSearch3_wrapModel` &wrapIfEmpty=`1` &minQuery=`1` &includeTVs=`searchType` &where=`{"pagetitle":"[[*pagetitle]]"}` ]] В результате чего добиваюсь той же работы что и с первым методом реализации.

    Подскажите пожалуйста, почему отдает пустой результат в той ситуации, которую я описал выше. Заранее спасибо!

    modx.pro

    Урок 25. Создание AJAX поиска на сайте MODX

    Создадим живой AJAX поиск на сайте. Для этого нам понадобятся:

    Установка mSearch и индексация страниц сайта

    Установим дополнение mSearch через репозиторий дополнений и проиндексируем все наши ресурсы. Для этого нужно вызвать на любом удобном вам ресурсе вызов mSearch в виде:

    Это проиндексирует первые 500 ресурсов, далее выставляем значение offset=`500` и индексируете следующие 500 ресурсов и т.д.

    При индексации данные перезаписываются, так что можно запускать этот процес сколько угодно раз подряд, индекс от этого не разрастается.

    После того как вы проиндексировали всё 1 раз, все новосозданные или изменённые ресурсы индексирует плагин, который идёт в комплекте с mSearch, более подробно: http://bezumkin.ru/modx/msearch/

    Создание страницы приёма поисковых запросов

    Создадим страницу, которая будет принимать поисковые AJAX запросы и отправлять ответы в виде HTML кода на целевую страницу. Создадим её с названием search-results и этим же псевдонимом search-results, назначим пустой шаблон и сохраним. URL, по которому должна отрываться страница, будет в таком случае yoursite.com/search-results.html. Вставим следующий код в поле "Содержимое" (Content):

    После сохранения нажмём "Просмотр" и создадим парочку запросов к этой странице для проверки её работоспособности, например вот так (ссылки кликабельны): ?query=resource ?query=modx. После проверки работоспособности перейдём к созданию самой страницы поиска.

    Создание AJAX страницы поиска

    Данная страница будет отправлять GET запрос по адресу yoursite.com/search-results.html и получать от неё ответ в виде html кода - это и есть наш AJAX. Создадим чанк ajax-search и вставим туда код или просто вставим в код шаблона этот код:

    Форма с классом .sisea-search-form отправляет GET запрос, далее наша страница должна принять данный код и вставить его в контейнер с классом .site-search-results. Вставим следующий скрипт, который будет это делать, в HEAD нашего сайта:

    Перед скриптом нужно вызвать библиотеку jQuery.

    Рекомендую для изучения

    Демо AJAX поиск

    modx.ws


    Prostoy-Site | Все права защищены © 2018 | Карта сайта