# Подключение Elasticsearch или OpenSearch

**Elasticsearch** и **OpenSearch** — поисковые движки, позволяющие в режиме, близком к реальному времени, хранить, искать и анализировать большие объёмы данных. В сервисе **Webim** такой движок используется как дополнительное хранилище [истории чатов](https://webim.ru/kb/for-admins/view-dialog-history.html), чтобы сократить время ответа при большом числе диалогов. Ниже — подключение к **Webim**; шаги для **Elasticsearch** и **OpenSearch** совпадают по смыслу, отличаются только установка кластера и значение `type` в `db.json`.

Начиная с **Webim Server 10.8** сервер подключается к поисковому кластеру через клиент **OpenSearch** (пакет `opensearch-py`): в конфигурации допускаются типы соединения `elastic`, `elasticsearch` и `opensearch` — укажите тот, который соответствует вашему продукту. Рекомендуемый ключ секции в `dbs` — `history` (поддерживается и прежний ключ `elastic`). Параметры учётной записи, хоста, порта и шаблона имён индексов те же, что и для **Elasticsearch**.

## Инструкция по подключению

  1. Установите **Elasticsearch** или **OpenSearch** на отдельный физический или виртуальный сервер. Для **Elasticsearch** ориентируйтесь на официальную инструкцию по установке:

    * [Инструкция по установке с помощью RPM-пакета](https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.html).

    * [Инструкция по установке с помощью DEB-пакета](https://www.elastic.co/guide/en/elasticsearch/reference/current/deb.html).

    Для **OpenSearch** используйте [документацию по установке](https://docs.opensearch.org/latest/install-and-configure/install-opensearch/index/).

    Требования к серверу поиска можно посмотреть в этих руководствах и в [статье о хранилищах](https://webim.ru/kb/devops/sys-reqs-for-server/sys-reqs-server-db.html).

    Кластер **Elasticsearch** можно масштабировать по [официальной документации](https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html); для **OpenSearch** — по [документации OpenSearch](https://docs.opensearch.org/latest/).

  1. Обратитесь в [техническую поддержку](mailto:support@webim.ru) за компонентом `data-storager`, который читает историю диалогов из баз **pro** (**MySQL** или **PostgreSQL**) и переносит её в поисковый кластер (**Elasticsearch** или **OpenSearch**), и за инструкциями по его установке. Обзор сервиса — в статье [Data Storager](https://webim.ru/kb/devops/services/data-storager.html).

  1. Дополните конфигурационный файл `/etc/webim/db.json` блоком подключения к поисковому кластеру. Пример для **Elasticsearch** (`type`: `elastic`, `elasticsearch` или `opensearch` — на **Webim Server 10.8+** поддерживаются все три варианта):

    ```
    "dbs": {
      "elastic": {
        "default": {
          "type": "elastic",
          "host": "YOUR_IP_ADDRESS",
          "port": PORT, # default = 9200
          "user": "elastic",
          "password": "ELASTIC_PASSWORD",
          "scheme": "http",
          "index_name_template": "{account}-{object}"
        }
      }
    }
    ```

    Для **OpenSearch** задайте, например, `"type": "opensearch"` и учётные данные пользователя вашего кластера **OpenSearch** (имя пользователя может отличаться от `elastic`).

    В верхнем регистре указаны плейсхолдеры значений параметров, Вам необходимо заполнить их самостоятельно в соответствии с Вашей конфигурацией.

    !!! Note "N.B."
        Нужна учётная запись с **полными правами** на работу с индексами в выбранном поисковом кластере (как для **Elasticsearch**, так и для **OpenSearch**).

  1. Перезагрузите **Chat Backend**.

  1. Активируйте в [account config](https://webim.ru/kb/for-admins/service-pages/account-config-editor.html) необходимые Вам параметры:

    * `elasticsearch_history`: поиск в истории диалогов через поисковый кластер (**Elasticsearch** или **OpenSearch**). Процесс поиска ускоряется, но данные о новых диалогах в истории будут появляться с задержкой;

    * `elasticsearch_threadprocessor`: экспорт протоколов чатов в тот же кластер. Для работы необходимо активировать `elasticsearch_history`.

### Kafka и data-storager

Если для интеграции с **Elasticsearch** / **OpenSearch** или для наполнения **ClickHouse** используется сервис **data-storager**, необходима установленная и доступная **Apache Kafka**.  
**data-storager** публикует и читает сообщения из Kafka (режимы *producer* и *consumer*), поэтому необходимо обеспечить:

  * доступ к брокеру/кластеру Kafka (bootstrap servers) из инфраструктуры **Webim**;

  * наличие топиков и прав на запись/чтение для сервисной учетной записи;

  * при использовании защищенных профилей — корректные параметры авторизации/шифрования (SASL/SSL).

## Маркер соответствия аккаунта для data-storager

### Назначение

Маркер соответствия связывает аккаунт с конкретным инстансом **data-storager**. Producer **data-storager** создаёт задачи на перекачку данных только для тех аккаунтов, у которых значение `es_storager_key` в meta-БД совпадает со значением переменной окружения сервиса.

### Где задаются значения

  * В окружении **data-storager** (файл `.env` сервиса): переменная **`ES_KEY_VALUE`** — строка, с которой producer сравнивает значение из meta-БД.

  * В meta-БД, таблица `accountkeyvalue`: строка с `key = 'es_storager_key'` и `value`, совпадающим с **`ES_KEY_VALUE`** из `.env` инстанса **data-storager**, который должен обрабатывать этот аккаунт.

!!! Note "N.B."
    Имя ключа в meta-БД — историческое (`es_storager_key`); в переменных окружения актуальное имя — **`ES_KEY_VALUE`**. Значения в БД и в `.env` должны совпадать посимвольно.

### Значение по умолчанию

Отсутствует. Значение необходимо задать явно. Пустые/несогласованные значения недопустимы.

Альтернатива для стенда: имена аккаунтов в переменной `PRODUCE_FOR_ACCOUNTS` файла `.env` (через запятую). Такие аккаунты обрабатываются даже без строки `es_storager_key`.

### Глубина индексации и подключение к базе pro

В той же таблице `accountkeyvalue` можно задать:

  * `es_store_since` — дата, с которой индексировать историю (приоритетнее `es_store_period`);

  * `es_store_period` — глубина в микросекундах от текущего момента;

  * `pro_db_connection_key` — ключ именованного URL базы **pro**, если аккаунт живёт не на подключении по умолчанию.

Подробности, примеры SQL и связанные переменные окружения — в статье [Data Storager](https://webim.ru/kb/devops/services/data-storager.html).

---

Источник: https://webim.ru/kb/devops/connect-elasticsearch.html
