Skip to content

Модуль для работы с ElasticSearch. realweb.api.elasticsearch

Совместимость

realweb.api v.6

Обновленная версия модуля

realweb.api.elastic

Модуль позволяет индексировать любые элементы на сайте и быстро искать по ним. Модуль предоставляет api для работы с elastic search. Может использоваться для:

  • Поиска по сайту
  • Реализации “умного фильтра” с возможностью показа недоступных фильтров и количества товаров
  • Фильтрации товаров по фильтру в каталоге

Преимущество использования модуля в:

  • Простоте реализации функциональности
  • Быстроте работы
  • Отсутствие ошибок работы (при правильно составленном индексе)

Модуль также позволяет добавить словарь синонимов (Например, для транслитерации поиска и т.п.) Все существующие индексы можно анализировать через сервис http://kibana.bitrix.dev.realweb.ru/

Установка и настройка

Linux

  • скачать архив ES с DEV /var/www/apps/elasticsearch-8.1.1-amd64.deb
  • проверка контрольной суммы
shell
shasum -a 512 -c elasticsearch-8.1.1-amd64.deb.sha512
  • установка
shell
sudo dpkg -i elasticsearch-8.1.1-amd64.deb
  • настройка конфигов
shell
nano /etc/elasticsearch/elasticsearch.yml
  • основные настройки
ini
network.host: localhost
http.port: 9200
xpack.security.enabled: false
  • ограничение использования MEM
shell
nano /etc/default/elasticsearch
  • основная настройка
ini
ES_JAVA_OPTS="-Xms2g -Xmx2g"
  • запуск сервиса
shell
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service
  • проверка
shell
curl -X GET http://localhost:9200/?pretty

Настройка безопасности

Будет требоваться авторизации при запросах к ES, также это нужно, чтобы получить полные права в кибане

  • изменения в конфиге /etc/elasticsearch/elasticsearch.yml
ini
xpack.security.enabled: true
xpack.security.http.ssl:
enabled: false
  • сброс пароля
shell
/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -f -i
  • проверка
shell
curl --user elastic:cxlQHE#z4zK*M5 -X GET "http://localhost:9200?pretty"

Windows

Установка ES

  • Скачать архив ES с DEV /var/www/apps/elasticsearch-8.1.1-windows-x86_64.zip
  • Распаковать в удобную для себя папку
  • Установка службу
cmd
elasticsearch-8.1.1\bin>elasticsearch-service.bat install
  • Настроить выделение памяти для службы
cmd
elasticsearch-8.1.1\bin>elasticsearch-service.bat manager
В открывшемся окне провести настройки

Окно настроек

  • Запустить службу По умолчанию сервис будет запущен на 9200 порту.

Официальная инструкция по установке

Установка Kibana

  • скачать архив ES с DEV /var/www/apps/kibana-8.1.1-windows-x86_64.zip
  • распаковать в удобную для себя папку
  • запустить из командной строки
cmd
kibana-8.1.1\bin>kibana.bat

Официальная инструкция по установке

Настройка Kibana как службы
  • Скачать NSSM
  • Выполнить
cmd
nssm install Kibana
В открывшемся окне указать путь к kibana.bat по аналогии с картинкой.

Окно настроек

  • Во вкладке Dependencies можно указать службу Elastic Search.
  • Нажать Install Service.
  • Запустить службу

После запуска kibana будет доступна в браузере по адресу http://localhost:5601

MacOs

Установка kibana

Установка и настройка Kibana

shell
sudo dpkg -i kibana-8.1.1-amd64.deb

запуск сервиса

shell
sudo systemctl daemon-reload
sudo systemctl enable kibana.service
sudo systemctl start kibana.service

пример конфига nginx

text
server {
	listen 80;
	server_name kibana.local;
	#server_name server-ip-address;

	#For autherntication remove the # from below two line:
	#auth_basic "Restricted Access";
	#auth_basic_user_file /etc/nginx/.htpasswd;

	location / {
		proxy_pass http://localhost:5601;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

		#upgrade to WebSocket protocol when requested
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection "Upgrade";
	}
}

Если нужны полные права то необходимо выполнить следующие шаги

  • сброс пароля (вход в кибану по elastic:cxlQHE#z4zK*M5)
shell
/usr/share/elasticsearch/bin/elasticsearch-reset-password -u kibana_system -f -i
  • конфигурация
ini
elasticsearch.username: "kibana_system"
elasticsearch.password: "cxlQHE#z4zK*M5"
xpack.encryptedSavedObjects.encryptionKey: "ключ_32_символа"
  • перезапуск сервиса
shell
systemctl restart kibana

В случае возникновения ошибки Kibana server is not ready yet. удалить индексы кибаны

shell
curl http://localhost:9200/_aliases?pretty=true
curl -XDELETE http://localhost:9200/.kibana-event-log-8.1.1-000001

Пример настройки конфигурации индекса

php
'settings' => array(
    "analysis" => array(
        "analyzer" => array(
            "rebuilt_russian" => array(
                "tokenizer" => "standard",
                "filter" => array(
                    "lowercase",
                    "russian_stemmer",
                    "russian_stop",
                    "synonym"
                )
            )
        ),
        "filter" => array(
            "russian_stop" => array(
                "type" => "stop",
                "stopwords" => "_russian_"
            ),
            "russian_stemmer" => array(
                "type" => "stemmer",
                "language" => "russian"
            ),
            "synonym" => array(
                "type" => "synonym",
                "ignore_case" => "true",
                "synonyms_path" => "analysis/synonym.txt"
            )
        )
    )
),

Пример настройки данных индекса

php
array(
    'name' => 'Karamelka Каталог фильтр',
    'code' => 'karamelka_catalog_filter',
    'settings' => array(
        'number_of_replicas' => 1,
        'number_of_shards' => 1
    ),
    'properties' => array(
        array(
            'name' => 'Раздел',
            'code' => 'SECTION_ID',
            'settings' => array("type" => 'integer')
        ),
        array(
            'name' => 'Цена',
            'code' => 'PRICE',
            'settings' => array("type" => 'float')
        ),
        array(
            'name' => 'Бренд',
            'code' => 'BRAND',
            'settings' => array("type" => 'integer')
        ),
        array(
            'name' => 'Страна',
            'code' => 'COUNTRY',
            'settings' => array("type" => 'integer')
        ),
    )
)

Добавление данных в индекс

При добавлении данных стоит очистить от html тегов. Регистр можно не менять - поиск регистронезависимый

php
$obItem = new \Realweb\Api\Module\Elasticsearch\Model\Search\Item('index_name', $iItemId);
$obItem->setData(array(
    'section_id'=>array(1,2),
    'title' => 'test',
    'body' => 'test',
    'property_1'=>array(1,2,3),
    'property_2'=>array('value1','value2','value3'),
));
$obItem->save();

Поиск

php
$obNav = new \Realweb\Api\Model\Main\Pagination();
$obNav->setParam('index', 'index_name');
$obNav->setParam('sort', array(
    'PRICE' => 'desc'
));
$obNav->setParam('filter', array(
    'BRAND' => array(1, 2),
    'COUNTRY' => 1,
    'SECTION_ID' => array(1, 2, 3),
    'PRICE' => array(
        'min' => 0,
        'max' => 400
    )
));
$obCollection = \Realweb\Api\Module\Elasticsearch\Model\Helper::getInstance()->filter($obNav);

Поиск по всем ключевым словам

php
$obNav = new \Realweb\Api\Model\Main\PageNavigation();
$obNav->setParam('index', 'karamelka_catalog');
$obNav->setParam('query', 'test');
\Realweb\Api\Module\Elasticsearch\Model\Helper::getInstance()->search($obNav);

Поиск с учетом приоритета ключевых полей и без возврата индексируемых данных (source)

php
$obNav = new \Realweb\Api\Model\Main\PageNavigation();
$obNav->setParam('index', 'karamelka_catalog');
$obNav->setParam('query', 'test');
$obNav->setParam('multi_match', true);
$obNav->setParam('source', array('none'));
\Realweb\Api\Module\Elasticsearch\Model\Helper::getInstance()->search($obNav);

Получение фильтров

php
$obNav->setParam('filter', array(
    'section_id'=>1,
));
$obElasticCollection = \Realweb\Api\Module\Elasticsearch\Model\Helper::getInstance()->aggregation($obNav);

Синонимы

Для использования синонимов необходимо добавить в настройки секцию synonym, где нужно указать путь к файлу с синонимами относительно директории конфига /etc/elasticsearch/elasticsearch.yml т.е. /etc/elasticsearch/ в директории должна быть символьная ссылка на директорию в проекте, где расположен файл с синонимами

Репозиторий

Репозиторий модуля