sheerockoff / bitrix-elastic-indexer
Bitrix infoblocks indexer into Elasticsearch.
Installs: 1 721
Dependents: 0
Suggesters: 0
Security: 0
Stars: 29
Watchers: 5
Forks: 23
Open Issues: 3
Requires
- php: >=7.2
- ext-json: *
- elasticsearch/elasticsearch: ^7.1
Requires (Dev)
- phpunit/phpunit: ^9.6
- sheerockoff/bitrix-ci: 21.400
- symfony/var-dumper: ^4.3
This package is auto-updated.
Last update: 2024-09-30 15:50:03 UTC
README
Хелпер для индексации данных инфоблока Bitrix в Elasticsearch.
Установка
composer require sheerockoff/bitrix-elastic-indexer
Быстрый старт
Подключаем зависимости, создаём клиент Elasticsearch
.
<?php use Elasticsearch\ClientBuilder; use Sheerockoff\BitrixElastic\Indexer; require 'vendor/autoload.php'; $elastic = ClientBuilder::create()->setHosts(['http://elasticsearch:9200'])->build();
Создаём экземпляр Indexer
.
$indexer = new Indexer($elastic);
По-умолчанию методы Indexer
выбрасывают исключения при ошибках. Чтобы игнорировать некоторые исключения, необходимо
передать false
вторым аргументом (strictMode
) конструктора.
$indexer = new Indexer($elastic, false);
Получаем карту индекса для инфоблока.
$infoBlockMapping = $indexer->getInfoBlockMapping($iBlockId);
Обновляем карту индекса в Elasticsearch. Метод обновит карту только тех свойств, которые отсутствуют в текущем индексе. Карты существующих свойств в индексе изменяться не будут, чтобы избежать ошибок.
$indexer->putMapping('goods', $infoBlockMapping);
Получаем текущую карту индекса из Elasticsearch.
$elasticMapping = $indexer->getMapping('goods');
Получаем сырые данные индекса для элемента.
/** @var _CIBElement $element */ $rawData = $indexer->getElementRawData($element);
Нормализуем сырые данные индекса в соответствии с картой индекса Elasticsearch.
$normalizedData = $indexer->normalizeData($elasticMapping, $rawData);
Сохраняем данные в индексе Elasticsearch.
$indexer->put('goods', $id, $normalizedData);
Ищем по индексу используя фильтры в формате похожем на формат Bitrix.
$response = $indexer->search('goods', [ 'IBLOCK_ID' => 1, 'SECTION_CODE' => 'mobile', 'INCLUDE_SUBSECTIONS' => 'Y', 'ACTIVE' => 'Y', '>CATALOG_PRICE_1' => 0, '>CATALOG_STORE_AMOUNT_1' => 0, 'PROPERTY_TAGS' => ['hit', 'sale'] ]);
Для сортировки также используется формат похожий на формат Bitrix.
$response = $indexer->search('goods', ['ACTIVE' => 'Y'], [ 'CATALOG_PRICE_1' => 'ASC', 'ID' => 'DESC' ]);
Пагинацию и другие параметры запроса можно указать в последнем аргументе метода search
.
$response = $indexer->search('goods', ['ACTIVE' => 'Y'], ['ID' => 'ASC'], [ 'from' => 40, 'size' => 20 ]);
Разработка и тестирование
Запуск тестов в контейнерах Docker:
docker compose up -d docker compose exec bitrix composer install docker compose exec bitrix vendor/bin/phpunit