Современные поисковые системы используют для поиска спецальные базы данных - ElasticSearch, Sphinx и другие. На сервисе FacetSearch.ru развернут OpenSearch(fork ElasticSearch). Компонент для MODX FacetSearch загружает данные сайта в сервис, в базу OpenSearch и выводит, на сайте с MODX, форму фасетного поиска, фильтрующею товары и ресурсы с помощью запросов в сервис.
FacetSearch фильтрует большые каталоги за 0,6-0,9 секунды.
1) Зарегистрируйтесь на сервисе facetsearch.ru В ответном письме придут данные для подключения к сервису.
2) Установите компонент FacetSearch с https://modstore.pro/packages/ecommerce/facetsearch При установке должны поставиться pdoTools и getTables.
3) В настроках компонента введите данные из email: server_url, index, api_key. И активируйте настройку facetsearch_enable_upload.
4) Зайдите в таблицу компонента FacetSearch и настройте опции, которые должны выгружаться в базу сервиса (это те опции, по которым дальше настроим фильтрацию). Чтобы получить список полей, нажмите кнопку "Обновить таблицу опций". Для фильтрации продуктов минишопа активируйте опцию Ресурс->class_key. Выберете "Тип опции" строка или число или массив строк. Число для числовых значений в опции. Например price. Массив строк или массив чисел для значений массивов. Например, size храниться в виде json массива. Здесь сразу же можно указать "Заголовок фильтра" - подписть название фильтра. Или ввесть подпись в лексиконе ключ вида facetsearch_field_size.
5) Создайте индекс кнопкой "Создать индекс".
6) Добавте в крон файл /core/components/facetsearch/cron/upload_resources.php выполнять каждую минуту. (На openserver: */1 * * * * c:\ospanel\modules\php\PHP_7.2\php.exe -q -f c:\ospanel\domains\demo.loc\core\components\facetsearch\cron\upload_resources.php) Дождитесь загрузки данных на сервис. Посмотреть статус загрузки можно кнопкой "Статус". 20 000 товаров загружаются в течении 5 минут.
7) В шаблоне каталога вызовите сниппет FacetSearch.
{'!FacetSearch' | snippet: [
'element'=>'msProducts',
'filters'=>'
price:number,
size:default,
color,
tags,
',
'ajaxMode'=>'button',
'tplFilter.outer.size'=>'tpl.FacetSearch.filter.select',
'tplFilter.row.size'=>'tpl.FacetSearch.filter.option',
'aggsRadio'=>'size',
'addFilters'=>'{ "class_key":"msProduct"}'
]}
Параметры сниппета похожи на параметры mFilter2. filters - опции фильтра в формате алиас_опции:тип. Типы только default и number. Для типа number автоматически подгрузиться слайдер. Тип default для чекбоксов и селектов. Его можно не указывать.
tplFilter.outer.алиас_опции и tplFilter.row.алиас_опции чанки оформления фильтра.
aggsRadio - для селектов необходимо указывать здесь алиасы опций, чтобы правильно считались агрегации (Подсчет результатов для выбора значения опции. В mFilter2 suggestions/)
addFilters дополнительные фильтры в json-формате. 'addFilters'=>'{ "class_key":"msProduct"}' ограничевает выборку только товарами msProduct.
element - определяет каким сниппетом будут обрабатываться результаты фильтрации.
ajaxMode - режим работы пагинации. Не задано - следущая страница заменяет текущие результаты. button - добавляет к текущим снизу. scroll - подгружает результаты при прокрутке страницы.
Название | По умолчанию | Описание |
---|---|---|
&element | pdoResources | Сниппет, который будет вызываться для вывода результатов работы. Вы можете указать набор параметров для него: &element=`pdoResources@myParams`. |
&sort | Список полей ресурса для сортировки. Указывается в формате «поле:направление». Можно указывать несколько полей через запятую, например: «publishedon:desc,price:asc». | |
&filters | parent:number | Список фильтров ресурсов, через запятую. Указывается в формате «alias:type». | &parents | Список категорий, через запятую, для ограничения вывода результатов. |
&tplOuter | tpl.FacetSearch.Outer | Чанк оформления всего блока фильтров и результатов. |
&tplFilter.outer.default | tpl.FacetSearch.filter.outer | Стандартный чанк оформления одной группы фильтров. |
&tplFilter.row.default | tpl.FacetSearch.filter.checkbox | Стандартный чанк оформления одного фильтра в группе. По умолчанию выводится как checkbox. | &showLog | false | Показывать дополнительную информацию о работе сниппета. Только для авторизованных в контекcте «mgr». |
&aggsRadio | Список фильтров через запятую, для которых возможен выбор только одного значения, например, элементы radio и select. Предсказания этих групп фильтров не суммируются между собой. Например: «class_key,new» | |
&toPlaceholders | Если не пусто, FacetSearch сохранит все данные в плейсхолдеры: [[+filters]] , [[+results]] и [[+total]] с префиксом, указанным в этом параметре. Например, если вы укажете &toPlaceholders=`my.`, то получите: [[+my.filters]] , [[+my.results]] и [[+my.total]] |
|
&toSeparatePlaceholders | Работает так же как и &toPlaceholders, только в раздельные плейсхолдеры попадает еще и filters. Например, если вы укажете &toSeparatePlaceholders=`my.` и &filters=`test,pagetitle` то получите плейсхолдеры [[+my.results]] , [[+my.total]] , [[+my.test]] и [[+my.pagetitle]] . |
|
&ajaxMode | default | Режим ajax пагинации: default , scroll или button . Работает аналогично pdoPage, только без параметра &ajaxHistory. |
&sortOption | count | Режим сортировки значений фильтра. По умолчанию, count - значения в порядке убывания агрегации (подсчета числа результатов). asc - в алфавитном порядке. desc - в обратном алфавитному. |
При изменении в таблице опций нужно пересоздавать индекс. Это удалить его и заново создать его и загрузить в него ресурсы. Но для того, чтобы работа сайта не прерывалась, сделана кнопка "Ребилд индекс". При нажатии этой кнопки создается новый индекс. Товары загружаются в него, а фильтры работают на старом индексе. После загрузки товаров старый индекс удаляется.
В новой версии компонента MODX FacetSearch появилась возможность использовать свой сервер базы данных OpenSearch, без использования сервиса facetsearch.ru. Подойдет тем, кто не хочет передавать свои данные стороннему сервису и может платить за VPS. OpenSearch требует минимум 40гб жесткого диска. На 20гб не стартует. В бегет VPS с 40гб, сейчас, стоит 8 400р в год.
Установка тестировалась на ubuntu-22.04.2-live-server, OpenSearch 2.3.0, PHP 8, Nginx. Инструкция установки OpenSearch взята из статьи Установка, настройка и эксплуатация стэка OpenSearch в классической среде
В архиве core\components\facetsearch\facetsearchserver.zip в компоненте FacetSearch находиться php скрипты, которые нужно установить на сервере с базой OpenSearch, и которые предостовляют промежуточное АПИ для доступа к базе.
Надеюсь этот этап не надо расписывать.
Инструкция установки OpenSearch взята из статьи Установка, настройка и эксплуатация стэка OpenSearch в классической среде
Устанавливаем java и unzip:
sudo apt-get update
sudo apt install openjdk-11-jdk unzip
Создание пользователя opensearch:
sudo groupadd opensearch
sudo useradd opensearch -g opensearch -M -s /bin/bash
sudo passwd opensearch
tar -xf opensearch-2.4.0-linux-x64.tar.gz
sudo mkdir /opt/opensearch
sudo mv ./opensearch-2.4.0/* /opt/opensearch
rmdir ./opensearch-2.4.0
sudo chown -R opensearch:opensearch /opt/opensearch
sudo -u opensearch /opt/opensearch/opensearch-tar-install.sh
Дожидаемся сообщения «Node 'server-elk01' initialized» и нажимаем «Ctrl+C».
sudo nano /lib/systemd/system/opensearch.service
и вставляем код (Удобнее подключиться через putty. putty позволяет вставить код)
[Unit]
Description=Opensearch
Documentation=https://opensearch.org/docs/latest
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
RuntimeDirectory=opensearch
PrivateTmp=true
Restart=on-failure
RestartSec=60s
WorkingDirectory=/opt/opensearch
User=opensearch
Group=opensearch
ExecStart=/opt/opensearch/bin/opensearch
StandardOutput=journal
StandardError=inherit
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65535
# Specifies the maximum number of processes
LimitNPROC=4096
# Specifies the maximum size of virtual memory
LimitAS=infinity
# Specifies the maximum file size
LimitFSIZE=infinity
# Not use SWAP
LimitMEMLOCK=infinity
# Disable timeout logic and wait until process is stopped
TimeoutStopSec=0
# Allow a slow startup before the systemd notifier module kicks in to extend the timeout
TimeoutStartSec=75
[Install]
WantedBy=multi-user.target
sudo chown -R root:root /lib/systemd/system/opensearch.service
sudo systemctl daemon-reload
sudo mkdir /var/log/opensearch
sudo chown -R opensearch /var/log/opensearch
sudo systemctl start opensearch
sudo systemctl status opensearch
sudo systemctl enable opensearch
curl -X GET https://localhost:9200 -u 'admin:admin' --insecure
OpenSearch установлен. Остольные настройки по желанию. Если еще нужно OpenSearch-Dashboards, то нужно будет еще сменить пароль админа OpenSearch.
sudo apt install nginx
sudo ufw allow ssh
sudo ufw allow 'Nginx HTTP'
sudo ufw enable
sudo apt install php-fpm
sudo apt install php8.1-curl
sudo mkdir /var/www/facetsearchserver
sudo chown -R $USER:$USER /var/www/facetsearchserver
sudo nano /etc/nginx/sites-available/facet
server {
listen 80;
server_name facet;
root /var/www/facetsearchserver;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
location ~ /\.ht {
deny all;
}
location ~ /secret/ {
deny all;
}
}
И подключаем к Nginx:
sudo ln -s /etc/nginx/sites-available/facet /etc/nginx/sites-enabled/
sudo systemctl reload nginx
{ "success":0,"message":"Access denied!","data":[]}
Отредактируйте файл /var/www/facetsearchserver/index.php
$config = [
'host'=>'https://localhost:9200', //Адрес OpenSearch
'login'=>'admin', //Логин
'password'=>'admin', //Пароль
'index'=>'demo.loc', //Индекс базы(такой же как на вашем сайте в настройках FacetSearch)
'api_key'=>'', //Ключ АПИ. Сгенирируйте с помощью какого-либо генератора паролей. Его же забить в настройки FacetSearch.
];
require __DIR__ . '/vendor/autoload.php';
require __DIR__ . '/facet.class.php';
$facet = new facet($config);
echo json_encode($facet->run());
На этом эстановка завершена. Можно создавать индекс и настраивать сайт с использованием FacetSearch.