Algolia для MODX с поддержкой PageBlocks и miniShop2

Algolia — это мощная облачная поисковая платформа, обеспечивающая мгновенный и релевантный поиск.



Настройка


1. Регистрация в Algolia
Зарегистрируйтесь на Algolia и получите API-ключи.

2. Настройка в MODX
Перейдите в системные настройки MODX и укажите:
  • Application ID (algolia.app_id)
  • Admin API Key (algolia.api_key)
3. Создание индекса
Создайте индекс в Algolia и укажите его название в системной настройке algolia.index_name.


На изображении показано, как перейти в панель поиска и создать индекс.

4. Настройка полей для поиска
Укажите поля, которые будут участвовать в поиске, в настройке algolia.searchable_fields.
По умолчанию: alias,pagetitle,longtitle,description,introtext.

5. Настройка полей для вывода
Укажите поля, которые будут возвращаться в результатах поиска, в настройке algolia.fields_to_retrieve.
По умолчанию: alias,pagetitle,longtitle,description,introtext.

Настройка данных для индексации:

1. Выбор типа ресурса
Укажите тип ресурса в настройке algolia.class_key:
  • modDocument (обычные ресурсы)
  • msProduct (товары miniShop2)
  • pbResource (коллекции PageBlocks)
2. Поля для индексации
Укажите поля, которые будут отправлены в индекс, в настройке algolia.fields.
По умолчанию: alias,pagetitle,longtitle,description,introtext.

3. Дополнительные условия
Укажите дополнительные условия для выборки данных в формате JSON в настройке algolia.where.

Примеры:
[{"parent": 5}] // добавляем в индекс только ресурсы с родителем 5
[{"price:>": 0}] // добавляем продукты с ценой больше 0

// Пример для PageBlocks
[{"field_name": "name"}] // в режиме developer
[{"collection_id": 1}] // в режиме manager

Использование


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

Форма поиска
Для вывода формы поиска не требуется использовать сниппет. Просто вставьте HTML-код, например:
<form class="d-flex" role="search" method="get" action="[[~187]]"> // 187 - страница поиска
    <input class="form-control me-2" name="query" type="search" placeholder="Search" aria-label="Search">
    <button class="btn btn-outline-success" type="submit">Search</button>
</form>

Вывод результатов поиска
На странице поиска разместите сниппет AlgoliaResult

Параметры сниппета:
  • paramSearch — имя параметра поиска. По умолчанию: query.
  • tpl — чанк для обертки результатов. По умолчанию: algolia.result.
  • tpl.result.item — чанк для вывода одного результата. По умолчанию: algolia.result.item.
  • tpl.result.empty — чанк для вывода, если ничего не найдено. По умолчанию: algolia.result.empty.
  • tpl.pagination — чанк для пагинации. По умолчанию:algolia.pagination.
  • tpl.pagination.item — чанк для пункта пагинации. По умолчанию: algolia.pagination.item.
  • limit — количество результатов на одной странице. По умолчанию: 10.
  • outputSeparator — разделитель для результатов. По умолчанию: \n.
  • toPlaceholder — вывод результата в плейсхолдер. По умолчанию: false.

Пример маршрутизации для REST API в PageBlocks



/core/App/routes/web.php
use PageBlocks\App\Http\Controllers\SearchController;

Route::prefix('api/algolia')->group(function () {
    Route::get('/index', [SearchController::class, 'index']);
    Route::get('/clear', [SearchController::class, 'clear']);
    Route::get('/search', [SearchController::class, 'search']);
});

Контроллер SearchController:

/core/App/Http/Controllers/SearchController.php
<?php

namespace PageBlocks\App\Http\Controllers;

class SearchController extends Controller
{
    public function getAlgolia()
    {
        return $this->modx->services instanceof \MODX\Revolution\Services\Container
            ? $this->modx->services->get('algolia')
            : $this->modx->getService('algolia', 'Algolia', MODX_CORE_PATH . 'components/algolia/model/');
    }
    /**
     * Индексируем все продукты в Algolia
     */
    public function index()
    {
        $algolia = $this->getAlgolia();
        $data = $algolia->getRecords();

        if (!$algolia->addRecords($data)) {
            return response()->json(['message' => 'Продукты не проиндексированы в Algolia'], 400);
        }

        // Настройки для индекса
        $algolia->setSettings([
            'searchableAttributes' => explode(',', $algolia->config['searchableFields']),
            'attributesToRetrieve' => explode(',', $algolia->config['fieldsToRetrieve']),
            'highlightPreTag' => '<em>',
            'highlightPostTag' => '</em>',
        ]);

        return response()->json([
            'message' => 'Продукты проиндексированы в Algolia',
            'total' => count($data),
        ]);
    }

    /**
     * Очищаем индекс Algolia
     */
    public function clear()
    {
        $algolia = $this->getAlgolia();

        if (!$algolia->clearIndex()) {
            return response()->json(['message' => 'Не удалось очистить индекс Algolia'], 400);
        }

        return response()->json(['message' => 'Индекс Algolia успешно очищен']);
    }

    /**
     * Выполняем поиск по продуктам в Algolia
     */
    public function search(array $request)
    {
        $query = $request['query'] ?? '';
        if (empty($query)) {
            return response()->json(['message' => 'Запрос не указан'], 400);
        }
        
        $algolia = $this->getAlgolia();
        $results = $algolia->search($query);

        return response()->json($results);
    }

}

Поддержка:
  • MODX: 2 / 3
  • PHP: ^8.1
Компонент уже отправлен на модерацию в ModStore, но вы можете установить его из моего репозитория.
Aleksandr Huz
12 февраля 2025, 15:49
modx.pro
451
+12
Поблагодарить автора Отправить деньги

Комментарии: 8

Николай Савин
12 февраля 2025, 15:52
+3
О, технологии из взрослой песочницы подъехали. Уважаю
    Олег Захаров
    12 февраля 2025, 16:00
    0
    Я так понимаю это типа ИИ сервис для генерации списка товаров или контента при вводе в поисковую строку? Типа умный поиск?
    В чем фишка сервиса? Для чего продукт? В описании не написано.
    По ссылке на «репозиторий» ссылка algolia.boshnik.com/docs/ битая, выходит ошибка.
      Aleksandr Huz
      12 февраля 2025, 16:10
      0
      Про поиск можно прочитать у них на сайте — www.algolia.com/

      В чем фишка сервиса? Для чего продукт? В описании не написано.
      Самое первое предложение:
      Algolia — это мощная облачная поисковая платформа, обеспечивающая мгновенный и релевантный поиск.

      По ссылке на «репозиторий» ссылка algolia.boshnik.com/docs/ битая, выходит ошибка.
      Убрал ссылку, документацию еще не добавил. Но все в статье описано.
      Артур Шевченко
      12 февраля 2025, 21:09
      0
      Опции, ТВ, поля модификаций индексировать умеет?
        Aleksandr Huz
        12 февраля 2025, 21:16
        0
        Пока нет, но обязательно добавлю. Спасибо
          Артур Шевченко
          12 февраля 2025, 22:07
          0
          А реально организовать подсказки при вводе? Компонент будет бесплатным?

          У меня есть компонент FlatFilters и там нет поиска, народ жалуется. Я вот думаю а не интегрировать туда этот шедерв? В целом сервис до 10К запросов в месяц бесплатный, если можно реализовать подсказки при вводе, то можно интегрировать.
            Aleksandr Huz
            12 февраля 2025, 22:15
            +1
            Компонент бесплатный.

            А реально организовать подсказки при вводе?
            Делаем запрос на сервер, а на сервере получаем данные:
            $algolia = $this->modx->services instanceof \MODX\Revolution\Services\Container
                        ? $this->modx->services->get('algolia')
                        : $this->modx->getService('algolia', 'Algolia', MODX_CORE_PATH . 'components/algolia/model/');
            $results = $algolia->search($query); // результат поиска
            Еще можно прочитать про Query Suggestions Index
              Артур Шевченко
              12 февраля 2025, 22:23
              +2
              Ну круто! Добавлю во FlatFilters поддержку этого компонента для организации поиска))) Спасибо!
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        8