Skip to content

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

License

Notifications You must be signed in to change notification settings

intaro/bitrix-elastic-indexer

 
 

Repository files navigation

Bitrix Elasticsearch Indexer

PHPUnit Coverage Scrutinizer

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

About

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

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • PHP 100.0%