Настроить массовый поиск дублей

Продукты
Все продукты

Сервис массового поиска дублей используется для дедупликации в разделах Creatio.

Важно. Для работы сервиса массового поиска дублей необходимо предварительно настроить сервис глобального поиска в ElasticSearch. Подробнее: Настроить глобальный поиск.
Для настройки cервиса массового поиска дублей необходимы базовые знания администрирования kubernetes или docker-compose и ОС Linux.

Развертывание компонентов глобального поиска дублей можно выполнять с использованием оркестратора Kubernetes и пакетного менеджера Helm или Docker.

Для расчета требований к серверам воспользуйтесь калькулятором системных требований.

Настроить сервис массового поиска дублей с использованием Kubernetes 

Для настройки сервиса скачайте исходные файлы. Скачать файлы.

Чтобы установить сервис:

  1. Настройте целевое окружение:
    1. Кластер Kubernetes. Подробно о том, как настроить и администрировать кластер, читайте в документации Kubernetes.
    2. Пакетный менеджер Helm. Установка пакетного менеджера подробно описана в документации Helm.
    3. Сервис глобального поиска с использованием Kubernetes. Подробнее: Настроить глобальный поиск.
  2. Из архива с исходными файлами извлеките файл values-onsite.yaml и сохраните его в ту же папку, где находится архив.
  3. Откройте извлеченный файл. Основные параметры, которые используются в файле, описаны в таблице ниже. Для оптимизации нагрузки на Redis и RabbitMQ, рекомендуется использовать для массового поиска дублей те же экземпляры сервисов, что и для глобального поиска. Сервис ElasticSearch всегда используется тот же, что и для глобального поиска.

    На заметку. Сервис Mongodb по умолчанию разворачивается вместе с сервисом поиска дублей. Если необходимо изменить параметры развертывания Mongodb, то извлеките все исходные файлы из архива и измените параметры в файле values-onsite.yaml в секции mongodb.

  4. Настройте в исходном файле values-onsite.yaml подключение к сервисам, которые были установлены ранее, например, при настройке глобального поиска.

    • Для Redis:

      Настройте подключение к ранее установленному Redis. Для этого в секции global.redis файла values-onsite.yaml укажите параметры подключения.

      # Multi pods global parameters
      global:
        # Redis server connection parameters
        redis:
          host: [host]
          port: [port]
          database: [database]
      

      Где

      [host] — адрес сервера Redis;

      [port] — порт подключения к Redis-серверу;

      [database] — имя базы данных Redis.

    • Для RabbitMQ:

      Настройте подключение к ранее установленному RabbitMQ. Для этого в секции global.rabbitmq файла values-onsite.yaml укажите параметры подключения.

      # Multi pods global parameters
      global:
        # RabbitMQ connection parameters
        rabbitmq:
          host: [host]
          vhost: [vhost]
          port: [port]
          user: [user]
          password: [password]
      

      Где

      [host] — адрес сервиса RabbitMQ;

      [vhost] — адрес virtual host сервиса RabbitMQ;

      [port] — порт для amqp подключения к RabbitMQ;

      [user] — пользователь RabbitMQ;

      [password] — пароль пользователя RabbitMQ.

    • Для Mongodb:

      1. Отключите установку Mongodb. Для этого в секции mongodb файла values-onsite.yaml установите значение enabled: false.

        mongodb:
          enabled: false
        
      2. Настройте подключение к внешней mongodb. Для этого в секции global.mongodb файла values-onsite.yaml укажите параметры подключения.

        # Multi pods global parameters
        global:
          # Deduplication database connection parameters
          mongodb:
            host: [host]
            port: [port]
            user: [user]
            password: [password]
        

        Где

        [host] — адрес сервиса Mongodb;

        [port] — порт для подключения к сервису;

        [user] — пользователь Mongodb, под которым выполняется подключение;

        [password] — пароль пользователя Mongodb.

    • Для ElasticSearch:

      Настройте подключение к ранее установленному ElasticSearch. Для этого в секции global.elasticsearch файла values-onsite.yaml укажите параметры подключения.

      # Multi pods global parameters
      global:
        # Elastic search connection parameters
        elasticsearch:
          protocol: [protocol]
          host: [host]
          port: [port]
          path: [path]
          user: [user]
          password: [password]
      

      Где

      [user] — пользователь ElasticSearch;

      [password] — пароль пользователя ElasticSearch;

      [port] — порт подключения к ElasticSearch;

      [path] — параметр path сервиса ElasticSearch (по умочланию \);

      [protocol] — протокол подключения ElasticSearch (по умолчанию http).

      [host] — адрес сервиса ElasticSearch.

  5. Выполните команду helm install gs -f values-onsite.yaml deduplication.tgz. В результате будет выполнена установка сервиса массового поиска дублей вместе со всеми выбранными зависимостями.

    На заметку. По умолчанию сервисы разворачиваются с типом NodePort.

Основные параметры сервиса глобального поиска, которые используются в файле values.yaml.

Параметр

Описание параметра

duplicatesSearchWorker.maxDuplicatesPerRecord

Максимально допустимое количество дублей для одной записи.

log4Net

Настройки логирования.

global.elasticsearch

Параметры подключения к ElasticSearch.

global.rabbitmq

Настройки подключения к RabbitMQ.

global.mongodb

Настройки подключения к внутренней базе сервиса поиска дублей.

global.db

Настройки подключения к внутренней сервисной базе данных сервиса глобального поиска.

global.redis

Настройки подключения к Redis.

Настроить сервис массового поиска дублей в Docker 

Компоненты сервиса массового поиска дублей 

Для настройки сервиса необходимы:

  1. Компоненты глобального поиска. Список приведен в статье Настроить глобальный поиск.

  2. Компоненты сервиса массового поиска дублей. Перечень компонентов приведен ниже.

Mongodb — документоориентированная система управления базами данных.

dd-web-api — web-сервис для общения в Creatio.

dd-data-service — внутренний сервис коммуникаций с mongodb.

dd-duplicates-search-worker — компонент поиска дублей.

dd-duplicates-deletion-worker — компонент, выполняющий точечное удаление дублей.

dd-duplicates-confirmation-worker — компонент, выполняющий группировку и фильтрацию найденных дублей с учетом уникальности.

dd-duplicates-cleaner — компонент очистки дублей.

dd-deduplication-task-worker — компонент постановки задачи дедупликации.

dd-deduplication-preparation-worker — компонент подготовки процесса дедупликации, формирует запросы для поиска дублей согласно правилам.

dd-deduplication-task-diagnostic-worker — компонент, контролирующий выполнение задачи поиска дублей.

Для настройки компонентов скачайте исходные файлы. Скачать файлы.

  1. Развернуть и настроить глобальный поиск в Creatio.

  2. Скачать, разархивировать и скопировать необходимые для настройки исходные файлы на машину с установленным ПО docker, docker-compose. Скачать файлы.

  3. Настроить переменные окружения.

  4. Запустить контейнеры.

  5. Проверить успешность запуска контейнеров.

  6. Проверить логирование.

  7. Подключить функциональность массового поиска дублей в Creatio.

Настроить переменные окружения 

Переменные окружения содержатся в файле compose/.env. Установите значения переменных, отредактировав этот файл.

Название переменной

Описание

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

ELASTICSEARCH_URI

Ip-адрес сервера, на котором был развернут ElasticSearch на шаге настройки глобального поиска в Creatio.

http://user:password@external.elasticsearch-ip:9200/

Запустить контейнеры 

Для запуска контейнеров необходимо выполнить команду:

cd compose # перейти в папку compose
docker-compose up -d

Проверить успешность запуска контейнеров 

Для просмотра списка всех запущенных контейнеров необходимо в консоли выполнить команду:

docker ps --filter "label=service=dd" -a --format "table {{.Names}}\t{{.Ports}}\t{{.Status}}\t{{.RunningFor}}"

У всех запущенных контейнеров отобразится статус “Up”.

Проверить логирование 

По умолчанию логирование происходит во время выполнения команды “stdout” контейнеров. Чтобы просмотреть последние 100 записей логов из контейнера dd-data-service, выполните команду:

docker logs --tail 100 dd-data-service

Обновить версию массового поиска дублей 

Для обновления сервиса массового поиска дублей с версии 2.0 на версию 3.0 выполните следующие шаги.

  1. Сделайте резервную копию данных о дублях в приложении. Для этого через swagger web-api http://[ip-адрес сервера]:8086/api выполните команду /api/snapshot/backup/gzip/{indexName}, где {indexName} — название индекса (последние 64 символа) из ситемной настройки “Адрес сервиса поиска” (код “GlobalSearchUrl”).
  2. Удалите все docker volume версии 2.0. Для этого перейдите в папку docker-compose файлов версии 2.0 и выполните команду docker-compose down -v.
  3. Установите сервис массового поиска дублей версии 3.0.
  4. Загрузите в обновленный сервис данные о дублях, полученные на шаге 1. Для этого на новой версии сервиса выполните через swagger команду /api/snapshot/restore/gzip.

Подключить функциональность массового поиска дублей в Creatio 

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

  1. Установите значение системной настройки “Адрес сервиса дедупликации”.

  2. Настройте права на системную операцию “Поиск дублей”.

  3. Включите в Creatio функциональность массового поиска дублей. Обратите внимание, что данная настройка отличается для разных СУБД.

  4. Перезапустите приложение Creatio.

Установить значение системной настройки “Адрес сервиса дедупликации” 

В разделе Системные настройки найдите настройку “Адрес сервиса дедупликации” (DeduplicationWebApiUrl) и в ней укажите URL к dd-web-api, строка следующего типа: http://external.deduplication-web-api:8086.

Настроить права на системную операцию “Поиск дублей” 

В разделе Доступ к операциям откройте системную операцию “Поиск дублей” (CanSearchDuplicates) и на детали Доступ к операции раздайте права необходимым пользователям/ролям, которые смогут выполнять поиск дублей.

Включить в Creatio функциональность массового поиска дублей 

Для включения функциональности (Feature Toggle) массового поиска дублей (Deduplication, ESDeduplication, BulkESDeduplication) необходимо выполнить SQL-скрипт. Этот скрипт различается в зависимости от используемой СУБД — MS SQL, Oracle или Postgre SQL.

DECLARE @DeduplicationFeature NVARCHAR(50) = 'Deduplication';
DECLARE @DeduplicationFeatureId UNIQUEIDENTIFIER = (SELECT TOP 1 Id FROM Feature WHERE Code = @DeduplicationFeature);

DECLARE @ESDeduplicationFeature NVARCHAR(50) = 'ESDeduplication';
DECLARE @ESDeduplicationFeatureId UNIQUEIDENTIFIER = (SELECT TOP 1 Id FROM Feature WHERE Code = @ESDeduplicationFeature);

DECLARE @Bulk_ES_DD_Feature NVARCHAR(50) = 'BulkESDeduplication';
DECLARE @Bulk_ES_DD_FeatureId UNIQUEIDENTIFIER = (SELECT TOP 1 Id 
FROM Feature WHERE Code =@Bulk_ES_DD_Feature);

DECLARE @allEmployeesId UNIQUEIDENTIFIER = 'A29A3BA5-4B0D-DE11-9A51-005056C00008';
IF (@DeduplicationFeatureId IS NOT NULL)
BEGIN
      IF EXISTS (SELECT * FROM AdminUnitFeatureState WHERE FeatureId = @DeduplicationFeatureId)
       UPDATE AdminUnitFeatureState SET FeatureState = 1 WHERE FeatureId =@DeduplicationFeatureId
      ELSE
       INSERT INTO AdminUnitFeatureState (SysAdminUnitId, FeatureState, FeatureId) VALUES (@allEmployeesId, '1',
@DeduplicationFeatureId)
END;
ELSE
BEGIN
      SET @DeduplicationFeatureId = NEWID()
      INSERT INTO Feature (Id, Name, Code) VALUES
(@DeduplicationFeatureId, @DeduplicationFeature, @DeduplicationFeature)
       INSERT INTO AdminUnitFeatureState (SysAdminUnitId, FeatureState, FeatureId) VALUES (@allEmployeesId, '1', @DeduplicationFeatureId)
END;

IF (@ESDeduplicationFeatureId IS NOT NULL)
BEGIN
      IF EXISTS (SELECT * FROM AdminUnitFeatureState WHERE FeatureId = @ESDeduplicationFeatureId)
     UPDATE AdminUnitFeatureState SET FeatureState = 1 WHERE FeatureId = @ESDeduplicationFeatureId
      ELSE
       INSERT INTO AdminUnitFeatureState (SysAdminUnitId, FeatureState, FeatureId) VALUES (@allEmployeesId, '1', @ESDeduplicationFeatureId)
END;
ELSE
BEGIN
      SET @ESDeduplicationFeatureId = NEWID()
      INSERT INTO Feature (Id, Name, Code) VALUES (@ESDeduplicationFeatureId, @ESDeduplicationFeature, @ESDeduplicationFeature)
      INSERT INTO AdminUnitFeatureState (SysAdminUnitId, FeatureState, FeatureId) VALUES (@allEmployeesId, '1', @ESDeduplicationFeatureId)
END;

IF (@Bulk_ES_DD_FeatureId IS NOT NULL)
BEGIN
      IF EXISTS (SELECT * FROM AdminUnitFeatureState WHERE FeatureId = @Bulk_ES_DD_FeatureId)
       UPDATE AdminUnitFeatureState SET FeatureState = 1 WHERE FeatureId =@Bulk_ES_DD_FeatureId
      ELSE
       INSERT INTO AdminUnitFeatureState (SysAdminUnitId, FeatureState,FeatureId) VALUES (@allEmployeesId, '1', @Bulk_ES_DD_FeatureId)
END;
ELSE
BEGIN
      SET @Bulk_ES_DD_FeatureId = NEWID()
      INSERT INTO Feature (Id, Name, Code) VALUES (@Bulk_ES_DD_FeatureId, @Bulk_ES_DD_Feature, @Bulk_ES_DD_Feature)
      INSERT INTO AdminUnitFeatureState (SysAdminUnitId, FeatureState, FeatureId) VALUES (@allEmployeesId, '1', @Bulk_ES_DD_FeatureId)
END;
CREATE OR REPLACE FUNCTION
generate_uuid return varchar2 is
       v_uuid varchar2(38);
       v_guid varchar2(32);
BEGIN
       v_guid := sys_guid();
       v_uuid := lower(
'{' ||
       substr(v_guid, 1,8) || '-' ||
       substr(v_guid, 9,4) || '-' ||
       substr(v_guid, 13,4) || '-' ||
       substr(v_guid, 17,4) || '-' ||
       substr(v_guid, 21) ||
       '}'
       );
       RETURN v_uuid;
END;
/
DECLARE
      DeduplicationFeature VARCHAR(50) := 'Deduplication';
      DeduplicationFeatureId VARCHAR(38) := NULL;
      DeduplicationFeatureId_GUID VARCHAR(38) := generate_uuid();
      ESDeduplicationFeature VARCHAR(50) := 'ESDeduplication';
      ESDeduplicationFeatureId VARCHAR(38) := NULL;
      ESDeduplicationFeatureId_GUID VARCHAR(38) := generate_uuid();
      BulkESDeduplicationFeature VARCHAR(50) := 'BulkESDeduplication';
      BulkESDeduplicationFeatureId VARCHAR(38) := NULL;
      Bulk_ES_DD_GUID VARCHAR(38) := generate_uuid();
      allEmployeesId VARCHAR(38) := '{7F3B869F-34F3-4F20-AB4D-7480A5FDF647}';
      State_Deduplication VARCHAR(1) := NULL;
      State_ESDeduplication VARCHAR(1) := NULL;
      State_BulkESDeduplication VARCHAR(1) := NULL;
BEGIN
      SELECT MAX("Id") INTO DeduplicationFeatureId FROM "Feature" WHERE "Code" = DeduplicationFeature AND rownum = 1;
      SELECT MAX("Id") INTO ESDeduplicationFeatureId FROM "Feature" WHERE "Code" = ESDeduplicationFeature AND rownum = 1;
      SELECT MAX("Id") INTO BulkESDeduplicationFeatureId FROM "Feature" WHERE "Code" = BulkESDeduplicationFeature AND rownum = 1;
      SELECT MAX("FeatureState") INTO State_Deduplication FROM "AdminUnitFeatureState" WHERE "FeatureId" = DeduplicationFeatureId AND rownum = 1;
      SELECT MAX("FeatureState") INTO State_ESDeduplication FROM "AdminUnitFeatureState" WHERE "FeatureId" = BulkESDeduplicationFeatureId AND rownum = 1;
      SELECT MAX("FeatureState") INTO State_BulkESDeduplication FROM "AdminUnitFeatureState" WHERE "FeatureId" = BulkESDeduplicationFeatureId AND rownum =1;
      IF (DeduplicationFeatureId IS NULL) THEN
       INSERT INTO "Feature" ("Id", "Name", "Code") VALUES (DeduplicationFeatureId_GUID, DeduplicationFeature, DeduplicationFeature);
       INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState", "FeatureId") VALUES (allEmployeesId, '1', DeduplicationFeatureId_GUID);
       ELSE
       IF (State_Deduplication IS NOT NULL) THEN
       UPDATE "AdminUnitFeatureState" SET "FeatureState" = 1 WHERE "FeatureId" = DeduplicationFeatureId;
       ELSE
       INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState", "FeatureId") VALUES (allEmployeesId, '1', DeduplicationFeatureId_GUID);
       END IF;
END IF;
IF (ESDeduplicationFeatureId IS NULL) THEN
       INSERT INTO "Feature" ("Id", "Name", "Code") VALUES (ESDeduplicationFeatureId_GUID, ESDeduplicationFeature, ESDeduplicationFeature);
       INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState", "FeatureId") VALUES (allEmployeesId, '1', ESDeduplicationFeatureId_GUID);
       ELSE
       IF (State_ESDeduplication IS NOT NULL) THEN
       UPDATE "AdminUnitFeatureState" SET "FeatureState" = 1 WHERE "FeatureId" = ESDeduplicationFeatureId;
       ELSE
       INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState", "FeatureId") VALUES (allEmployeesId, '1', ESDeduplicationFeatureId_GUID);
       END IF;
END IF;
IF (BulkESDeduplicationFeatureId IS NULL) THEN
       INSERT INTO "Feature" ("Id", "Name", "Code") VALUES(Bulk_ES_DD_GUID, BulkESDeduplicationFeature, BulkESDeduplicationFeature);
       INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState", "FeatureId") VALUES (allEmployeesId, '1', Bulk_ES_DD_GUID);
       ELSE
       IF (State_BulkESDeduplication IS NOT NULL) THEN
       UPDATE "AdminUnitFeatureState" SET "FeatureState" = 1 WHERE "FeatureId" = BulkESDeduplicationFeatureId;

       ELSE
       INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState", "FeatureId") VALUES (allEmployeesId, '1', Bulk_ES_DD_GUID);
       END IF;
      END IF;
END;
DO $$

DECLARE
	DeduplicationFeature VARCHAR(50) := 'Deduplication';
	DeduplicationFeatureId uuid;

	ESDeduplicationFeature VARCHAR(50) := 'ESDeduplication';
	ESDeduplicationFeatureId uuid;

	Bulk_ES_DD_Feature VARCHAR(50) := 'BulkESDeduplication';
	Bulk_ES_DD_FeatureId uuid;

  allEmployeesId uuid := 'A29A3BA5-4B0D-DE11-9A51-005056C00008';

BEGIN

	SELECT "Id" INTO DeduplicationFeatureId FROM "Feature"
	WHERE "Code" = DeduplicationFeature
	LIMIT 1;
	IF (DeduplicationFeatureId IS NOT NULL)
		THEN
			IF EXISTS (SELECT * FROM "AdminUnitFeatureState" WHERE "FeatureId" = DeduplicationFeatureId) THEN
				UPDATE "AdminUnitFeatureState" SET "FeatureState" = 1 WHERE "FeatureId" = DeduplicationFeatureId;
			ELSE
				INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState", "FeatureId") VALUES (allEmployeesId, '1', DeduplicationFeatureId);
			END IF;
	ELSE
		DeduplicationFeatureId := uuid_generate_v4();
		INSERT INTO "Feature" ("Id", "Name", "Code") VALUES (DeduplicationFeatureId, DeduplicationFeature, DeduplicationFeature);
		INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState", "FeatureId") VALUES (allEmployeesId, '1', DeduplicationFeatureId);
	END IF;

	SELECT "Id" INTO ESDeduplicationFeatureId FROM "Feature"
	WHERE "Code" = ESDeduplicationFeature
	LIMIT 1;
	IF (ESDeduplicationFeatureId IS NOT NULL)
		THEN
			IF EXISTS (SELECT * FROM "AdminUnitFeatureState" WHERE "FeatureId" = ESDeduplicationFeatureId) THEN
				UPDATE "AdminUnitFeatureState" SET "FeatureState" = 1 WHERE "FeatureId" = ESDeduplicationFeatureId;
			ELSE
				INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState", "FeatureId") VALUES (allEmployeesId, '1', ESDeduplicationFeatureId);
			END IF;
	ELSE
		ESDeduplicationFeatureId := uuid_generate_v4();
		INSERT INTO "Feature" ("Id", "Name", "Code") VALUES (ESDeduplicationFeatureId, ESDeduplicationFeature, ESDeduplicationFeature);
		INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState", "FeatureId") VALUES (allEmployeesId, '1', ESDeduplicationFeatureId);
	END IF;

	SELECT "Id" INTO Bulk_ES_DD_FeatureId FROM "Feature"
	WHERE "Code" = Bulk_ES_DD_Feature
	LIMIT 1;
	IF (Bulk_ES_DD_FeatureId IS NOT NULL)
		THEN
			IF EXISTS (SELECT * FROM "AdminUnitFeatureState" WHERE "FeatureId" = Bulk_ES_DD_FeatureId) THEN
				UPDATE "AdminUnitFeatureState" SET "FeatureState" = 1 WHERE "FeatureId" = Bulk_ES_DD_FeatureId;
			ELSE
				INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState", "FeatureId") VALUES (allEmployeesId, '1', Bulk_ES_DD_FeatureId);
			END IF;
	ELSE
		Bulk_ES_DD_FeatureId := uuid_generate_v4();
		INSERT INTO "Feature" ("Id", "Name", "Code") VALUES (Bulk_ES_DD_FeatureId, Bulk_ES_DD_Feature, Bulk_ES_DD_Feature);
		INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState", "FeatureId") VALUES (allEmployeesId, '1', Bulk_ES_DD_FeatureId);
	END IF;
END $$;

Перезапустить приложение Creatio 

Очистите redis, перезапустите приложение Creatio и выполните вход в приложение.

Рекомендуемые работы по обслуживанию сервиса 

Для поддержания работоспособности сервиса и возможности быстрого восстановления данных, например, в случае перебоев с электроэнергией, рекомендуется раз в сутки выполнять резервное копирование mongodb.