Хелпер для индексации данных инфоблока 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