Skip to content
This repository has been archived by the owner on Jun 21, 2024. It is now read-only.

Индексация инфоблоков Bitrix в Elasticsearch.

License

Notifications You must be signed in to change notification settings

bitrix-toolkit/bitrix-elastic-indexer

Repository files navigation

Bitrix Elasticsearch Indexer

PHPUnit Coverage Scrutinizer

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