Современные поисковые системы используют для поиска спецальные базы данных - 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, и которые предостовляют промежуточное АПИ для доступа к базе.

  1. Установить Ubuntu
  2. Установить OpenSearch
  3. Установить PHP 8, Nginx
  4. Настройка конфига

Надеюсь этот этап не надо расписывать.

Инструкция установки 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
											

Приступаем к установке.
  1. Переходим на официальный сайт OpenSearch (https://opensearch.org/downloads.html) и скачиваем архив tar.gz версии opensearch-2.4.0-linux-x64.tar.gz. После скачивания перенесите архив на свой сервер в удобный для вас каталог и перейдите в него в консоли.
  2. Распаковываем архив:
    
    tar -xf opensearch-2.4.0-linux-x64.tar.gz
    												
  3. Будем устанавливать OpenSearch в каталог «/opt/opensearch», поэтому создаем рабочий каталог для OpenSearch:
    
    sudo mkdir /opt/opensearch
    												
  4. Переносим распакованные данные в рабочий каталог:
    
    sudo mv ./opensearch-2.4.0/* /opt/opensearch
    												
  5. Удаляем каталог, оставшийся от распаковки:
    
    rmdir ./opensearch-2.4.0
    												
  6. Делаем пользователя opensearch владельцем рабочего каталога OpenSearch:
    
    sudo chown -R opensearch:opensearch /opt/opensearch
    												
  7. Запускаем установочный скрипт от имени пользователя opensearch:
    
    sudo -u opensearch /opt/opensearch/opensearch-tar-install.sh
    												
    Дожидаемся сообщения «Node 'server-elk01' initialized» и нажимаем «Ctrl+C».
  8. Создаем файл демона для работы OpenSearch:
    
    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
    												
  9. Делаем пользователя root владельцем файла демона:
    
    sudo chown -R root:root /lib/systemd/system/opensearch.service
    												
  10. Перечитаем конфигурацию systemd, чтобы система обнаружила вновь созданный демон:
    
    sudo systemctl daemon-reload
    												
  11. Создаем каталог для логов opensearch:
    
    sudo mkdir /var/log/opensearch
    												
  12. Делаем пользователя opensearch владельцем каталога логов:
    
    sudo chown -R opensearch /var/log/opensearch
    												
Первый запуск OpenSearch
  1. Запустим настроенный нами демон OpenSearch:
    
    sudo systemctl start opensearch
    												
  2. Проверим статус запуска демона OpenSearch:
    
    sudo systemctl status opensearch
    												
  3. Настроим автозапуск демона OpenSearch:
    
    sudo systemctl enable opensearch
    												
  4. Проверим работоспособность демона OpenSearch:
    
    curl -X GET https://localhost:9200 -u 'admin:admin' --insecure
    												

OpenSearch установлен. Остольные настройки по желанию. Если еще нужно OpenSearch-Dashboards, то нужно будет еще сменить пароль админа OpenSearch.

  1. Дальше закроем прямой доступ к OpenSearch и организуем апи FacetSearch с помощью PHP и Nginx.
  2. Устанавливаем Nginx:
    
    sudo apt install nginx
    												
  3. Настраиваем фаервол:
    
    sudo ufw allow ssh
    sudo ufw allow 'Nginx HTTP'
    sudo ufw enable
    												
  4. Устанавливаем PHP:
    
    sudo apt install php-fpm
    sudo apt install php8.1-curl
    												
  5. Создаем папку сайта:
    
    sudo mkdir /var/www/facetsearchserver
    sudo chown -R $USER:$USER /var/www/facetsearchserver
    												
  6. Копируем из установленного у вас компонента FacetSearch из архива core\components\facetsearch\facetsearchserver.zip в папку /var/www/facetsearchserver.
  7. Создаем домен Nginx (У меня имя домена facet. Измените на нужный вам):
    
    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
    												
  8. Проверяем. При в браузере http://facet/ должно выдавать:
    
    { "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.