Хелпер для индексации данных инфоблока Bitrix в Elasticsearch.
Необходимо явно указать репозиторий форка в секции repositories файла composer.json, например:
{
"repositories": [
{
"type": "git",
"url": "https://github.com/intaro/bitrix-elastic-indexer"
}
]
}Добавить в composer пакет sheerockoff/bitrix-elastic-indexer:
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
