Cursor
Описание команд всех сервисов, которые входят в состав Cursor.
Список версий
v3.0.0
Прочие изменения
Все сервисы
- Версия verdi v3.0.0
- Обновлены версии "sbt-native-packager" и "sbt-unidoc"
full-text-search
- Доработки сервиса FTS, возможность добавить связанное поле в настройках поиска (настройки FTS)
v2.1.0
Нет изменений по сравнению с v2.0.0, кроме повышения номера версии.
v2.0.0
Прочие изменения
full-text-search
- Добавлен
/readyроут - Изменено значение по умолчанию для
VERDI_KAFKA_TOPIC. Теперь оно равноcommandevents. - Изменено значение по умолчанию в документации для
VERDI_KAFKA_TOPIC. - Добавлен фильтр для поиска по не указанным значениям
- Добавлен
tolka
- Добавлен
/readyроут
- Добавлен
v1.12
Прочие изменения
UI
- На формах создания/редактирования сущности добавлен новый блок "Зависимость полей" с настройками зависимостей между полями.
- Изменено отображение таблиц во время загрузки данных: теперь таблица не скрывается и поверх нее отображается лоадер
- Добавлена страница с ошибкой о необходимости смены пароля
- Исправлен проблема, когда на форме редактирования сущности, после удаления поля с типом "relation", это поле не удалялось при сохранении формы.
DataModel
- Исправлено сравнение JSON полей с NULL, если в настройках поля указано "multiple = true"
- Исправлена проверка в Search запросе содержащим
nullпри работе с массивами
Indexation
- Индексации, вызванные событиями в data-model, теперь имеют correlationId = "event"+UUID. Это же id записывается в журнал. Ожидание завершения такой индексации(для того, чтобы зажурналировать результат) происходит в файбере.
- В Kafka message для плагинов добавлен флаг needBacklinks (для событий, которые изначально пришли из плагинов, в плагинах еще раз backlinks не запрашиваются)
- Добавлены события журналирования IndexationBegin, IndexationEnd, IndexationStop, IndexationFixBegin, IndexationDescriptionCreate, IndexationDescriptionUpdate, IndexationDescriptionDelete
- Добавлена переменная окружения APP_JOURNAL_REQUIRED_STEPS
- Исправлен баг обработки ответов от Lamp2: теперь protobuf сообщения от внутреннего сервиса Lamp2
extractionраспаковываются перед отправкой в datamodel
plagiarism-plugin
- Добавлено получение entityObject из data-model и отправка их в сервис indexation в случае ошибки при получении результатов из Lamp для backlinks в Flow2
- Добавлены переменные окружения
- LAMP_USE_VERSION_2
- LAMP_CACHEABLE_SERVICES
- LAMP_PARAMETERS_OPERATION
similarity-plugin
- Изменения аналогичны plagiarism-plugin
v1.11.7
Нет изменений по сравнению с v1.11.6, кроме повышение номера версии.
v1.11.6
Нет изменений по сравнению с v1.11.5, кроме повышение номера версии.
v1.11.5
Прочие изменения
- UI
- Изменен текст об отправке уведомления на почту при восстановлении пароля.
- Добавлена ошибка во время регистрации пользователя для случая, когда введенный email уже используется.
- Добавлена проверка прав в разделе "Управление - Технический справочник".
v1.11.4
Нет изменений по сравнению с v1.11.3, кроме повышение номера версии.
v1.11.3
Ломающие изменения
- UI
- В разделе "Журнал" для колонки "Описание/Объект" теперь используется поле "renderedData". Из-за этого для записей, созданных до обновления, колонка не будет ничего содержать.
Прочие изменения
- UI
- Теперь в разделе "Журнал" поиск работает по колонке "Описание/Объект".
- Добавлена настройка для выбора режима поиска событий в журнале.
- Название переменной в конфиге AppUI: "journalEventSearchKind".
- Возможные значения: "LikeQuery" (поиск по подстроке) или "TsQuery" (полнотекстовый поиск).
- Значение по умолчанию: "LikeQuery".
v1.11.2
Прочие изменения
- Теперь клиент сервиса DataModel поддерживает все команды сервиса DataModel.
v1.11.1
Прочие изменения
- UI
- На странице "Управление" добавлен новый раздел "Лицензия" с информацией о текущей лицензии.
- Исправлен поиск групп по частичному совпадению с полем "Код" в разделе "Права доступа" на вкладке "Группы пользователей".
- Теперь отображение столбца "Плановая деакцивация" регулируется правами в разделе "Пользователи".
- Исправлен порядок переключения элементов при использовании Tab в модальном окне.
v1.11
Ломающие изменения
- full-text-search
- В классе "SearchRequestDSLV2" изменилось поле "entityTypes" (удалено) на "entityTypeFields" (добавлено), поведение для прежнего значения поля, например
["type1","type2"]теперь идентично поведению со значением{"type1":null,"type2":null}. - Изменение повлияло на входные данные для команд: "fullTextSearchDSLV2", "fullTextSearchDSLGraphV2".
- В классе "SearchRequestDSLV2" изменилось поле "entityTypes" (удалено) на "entityTypeFields" (добавлено), поведение для прежнего значения поля, например
Прочие изменения
UI
- На странице полнотекстового поиска реализован переход к web-просмотру из фрагмента найденного текста
- На странице полнотекстового поиска добавлены фильтры с выбором атрибутов сущностей по которым будет производиться поиска
- В конструкторе форм появилась возможность выбрать в настройке "Связанный объект" любую из связей объекта для фильтрации по связанным объектам.
DataModel
- Добавлены команды "softDeleteObjectBatch" и "softDeleteObjectSearch".
- Добавлена обработка фильтров с множественным выбором (InSetQuery, AllInSetQuery) для полей которые являются массивами.
v1.10.1
Нет изменений по сравнению с v1.10, кроме повышение номера версии.
v1.10
UI
- Поле ввода "Шаг" в настройках индексации теперь растягивается/сжимается только по высоте (CURS-670)
- Исправленны мелкие баги элементов типа "лейаут" в конструкторе форм (CURS-672)
- Теперь компонент "Таблица пересечений" учитывает тип связи при запросе связей (CURS-701)
- Если в командах МД со входными данными они не указаны, теперь возвращается стандартная ошибка (CURS-719)
- Выпадающий список теперь не заходит на шапку системы при скролле страницы (CURS-731)
- Для полей ввода в конструкторе теперь недоступено системное поле "Идентификатор" (CURS-739)
- В разделе "Группы пользователей" высота модальных окон теперь не ограничена высотой тела модального окна. Ограничение теперь "100% - 40px" (по 20px сверху и снизу) (CURS-2173)
- Длинное предложение исправления поискового запроса теперь переносится на следующую строку (CURS-2216)
- В выпадающем списке компонента "Табы" добавлен вертикальный скролл (CURS-2224)
- Вид формы "Панель информации в графе" в конструкторе и в графе теперь не отличается (CURS-2226)
- При наведении курсора на нижнюю часть объекта в графе теперь не происходит мерцания всплывающего окна (CURS-2227)
- Исправлена ошибка в "Настройках темы" при попытке применить изменения, если указать в поле файл, а затем текст (CURS-2311)
- Модальные окна в разделах "Управления" теперь не закрываются при отжатии кнопки вне окна (CURS-2322)
- Исправлены мелкие баги элемента "Ключевые слова" конструктора форм (CURS-2402)
- Исправлена проблема, когда подсказка с кнопкой не отображается, если в "Реестре" нет объектов (CURS-2413)
- При переходе на страницу или при обновлении страницы "Конструктор форм" в селекторе размера (ширины) формы теперь оображается значение, заданное по умолчанию - 1280 (CURS-2414)
- Исправлена проблема при переходе на страницу с предпросмотром из конструктора форм и возвращении обратно в конструктор, то останется отображение предпросмотра (CURS-2432)
- Исправлена проблема при изменении масштаба окна браузера, когда нижний сниппет интеллектуального поиска отображался не полностью (CURS-2453)
- Если дважды выйти из системы и перейти "Назад", то теперь разделы управления не отображаются (CURS-2502)
- В полях с выпадающим списком иконка сброса всех значений теперь не зависит от состояния списка (открыт/свернут) (CURS-2528)
- Теперь при переходе из графа на карточку объекта и обратно в граф, статистика по фильтрам не пропадает (CURS-2578)
- Теперь вместо текста-ссылки для кода сущности (entityType) в разделе "Модель данных" отображается кнопка (CURS-2595)
- В таблице описания шагов идексации теперь работает изменение количества строк на странице (CURS-2614)
- Исправлена проблема, когда при повторном обновлении объекта отправлялся предыдущий номер версии (CURS-2616)
- Исправлена проблема, когда при переходе в Управление отображается 404, если не все разделы доступны (CURS-2617)
- Исправлена проблема, когда отображалась кнопка перехода в подраздел "Настройка темы" при отсутствии прав на подраздел (CURS-2618)
- Исправлено отображение компонентов Input, Radio Button, Single Select в соответствии с макетами (CURS-2618)
- Исправлена проблема в настройках расширения, когда, при клике на выбранный вариант расширения, расширения с одинаковой степенью близости менялись местами (CURS-2638)
- Исправлена проблема с отображением содержимого страницы 404, если нет прав на команду UIStorage_http_ListKeys (CURS-2648)
- Теперь список автодополнений поиска скрывается, если кликнуть в рабочую область Графа (CURS-2667)
- При скролле страницы панель выбора расширений поискового запроса теперь не скрывается (CURS-2677)
- Исправлены проблемы с отображением фильтров при переходе из объектно-ориентированного графа в общий граф (CURS-2687)
- Теперь во время загрузки поисковой выдачи для каждого значения из выпадающего списка по полю сущности не отображается количество объектов, а только наименование (CURS-2691)
- Теперь в конструкторе форм "Поля ввода" доступны для взаимодействия только в области своего отображения (CURS-2745)
- Теперь в конструкторе форм в настройке элемента "Поле ввода" селекторы "Размер" и "Тип" раскрываются при клике на них (CURS-2747)
- Исправлены проблемы с отображением значени в полях связей на формах, если значение не из первых 10 вариантов (CURS-2765)
- Добавлена колонка со сроком действия учетной записи в общий список пользователей (CURS-2768)
- Теперь в разделе "Журнал" для поиска по фильтру "Автор" используется полнотекстовый поиск (CURS-2247)
- Добавлены стрелки для навигации по типам связей в легенде графа (CURS-2279)
- В веб-просмотре пересечений больше не отображается общий процент пересечений в тексте просматриваемого файла со всеми остальными файлами системы (CURS-2347)
- Добавлена настройка "Текст для пустого поля" для компонента "Ключевые слова" (CURS-2389)
- Реализовано автоматическое переключение на первую страницу при применении фильтров и поиска к таблице (CURS-2427)
- Добавлен индикатор цвета статусам в разделе "Индексация" (CURS-2448)
- Актуализирован сторибук для TABLE (CURS-2504)
- Актуализирован сторибук для COMPONENTS (Dropdown, Filter Sidebar, Cor Loader, Dropdown Menu) (CURS-2505)
- Актуализирован сторибук для COMPONENTS (Svg Icon, Cor Tabs, Upload Area) (CURS-2506)
- Актуализирован сторибук для CONTROLS (Slider, Switch, Textarea, Multiselect, Radio list) (CURS-2507)
- Актуализирован сторибук для MODAL (CURS-2508)
- Исправлено поведение при использования клавиши Tab на страницах системы. Фокус для поля "Чекбокс" (CURS-2568)
- Исправлено поведение при использования клавиши Tab на страницах системы. Фокус для поля "Кнопка" (CURS-2569)
- Исправлено поведение при использования клавиши Tab на страницах системы. Фокус для поля "Файл" (CURS-2570)
- Исправлено поведение при использования клавиши Tab на страницах системы. Фокус для поля "Текст" (CURS-2571)
- Исправлено поведение при использования клавиши Tab на страницах системы. Фокус для "Выпадающий список" и "Выпадающий список с поисковой строкой" (CURS-2609)
- Доработка компонента выбора диапазона дат (CURS-127)
- Убраны сокращения текста в карточке индексации (CURS-162)
- В поиске по тексту команда для контекстных расширений заменена с lampQuery на lampQueryJson (CURS-119)
- Добавлено регулирование правами отображение раздела "Иерархии" в меню (CURS-2805)
- Переход в "Поиске по документу" на использование команды plagiarismSearchV2 для "Пересечений", что позволяет обрабатывать больше, чем один файл за вызов (CURS-2602)
- Теперь возможно скрывать кнопку "Редактировать список групп" в разделе "Пользователи" с помощью настройки прав (CURS-2632)
- Удалена зависимость "moment-range" из библиотек Verdi и Cursor (CURS-2646)
- На форму создания/редактирования справочника добавлено поле "Доп.данные" (CURS-2690)
- Реализована возможность опционального отображения компонента "cor-error-message" (CURS-2724)
Документация
- Исправлены форматирование и навигация в Slate Cursor (CURS-2746)
- Добавлена общая документация по конфигурации логов. Ссылка добавлена в раздел каждого сервиса (CURS-2581)
Все сервисы
- Добавлен вывод в лог сообщения, что сервис не здоров (CURS-80)
- Убрано логирование конфига на старте микросервисов (CURS-2540)
- Добавлена возможность записи логов в syslog (CURS-2596)
- Исправлены настройки соединения с БД в конфигурационных файлах (CURS-2716)
- добавлены настройки: autoCommit, schema, isolateInternalQueries, initializationFailTimeout
- добавлены комментарий по поводу initializationFailFast (Deprecated in slick 3.3.0)
- Исправлены проблемы с фазами выключения сервиса при использовании TerminationCoordinator (CURS-2750)
DataModel
- Теперь команда richListObjects возвращать файлы связанных сущностей (CURS-2651)
- Исправлена фильтрация по связанным сущностям в команде UpdateObjectFieldsList (CURS-2727)
- Исправлена проблема, когда у объекта сущности обязательные поля могли быть пустым массивом, если поле имеет тип string/text и настройку multiple (CURS-2735)
v1.9.1
- Исправлена логика работы health-роутов в большинстве сервисов
v1.9
В данном релизе есть ломающие изменения (смотри ниже)
UI
- Автоматический скролл таблицы вверх при переключении страниц (CURS-2426)
- Регулировать отображение кнопок на UI с помощью Actions на выполнение команд Mon (CURS-2628)
- Исправлены баги:
- При вводе или удалении символов в значении в поисковой строке не отображается список автодополнений (CURS-2324)
- При использовании клавиши Tab - устанавливается фокус на задизейбленное поле и есть возможность редактирования (CURS-2517)
- Баги по отображению компонентов на стенде после рефакторинга button (CURS-2522)
- В панели настроек расширений запроса при поиске по новому запросу не обновляются варианты расширений (CURS-2530)
- В конструкторе форм табы, которые не помещаются на странице, не скрываются в "Ещё" (CURS-2532)
- При переходе "Назад" с карточки в результаты поиска по тексту - во всех фильтрах в вариантах 0 объектов (CURS-2556)
- Компонент "Кнопка" кликабельный в состоянии disable (CURS-2642)
- В поиске по тексту на панели настроек расширений при изменении настроек выбора части речи или количества слов не обновляется список вариантов расширения (CURS-2673)
DataModel
- Добавлена Команда listNonExistingFileId для фильтрации существующих объектов в сервисе МД (CURS-2301)
- В сервисе data-model заменен валидатор схем модели данных с snowy-json на json-schema-validator (networknt) (CURS-2657)
- Исправлены баги:
- Баги команд DeleteObjectBatch и DeleteObjectSearch (CURS-2235)
Indexation
- Подключение к Lamp сделали опциональным в Indexation (CURS-2559)
Ломающие изменения:
1.Изменён интерфейс DataModelClient (может быть переопределён в тестах). Добавлены:
listNonExistingFileId getFile
2.Добавлена поддержку массивов в Search (CURS-2440)
В некоторых сервисах Cursor был применен новый формат фильтров (Search.context). Более подробно смотри документацию Verdi (PatchNotes 1.9). Ниже список сервисов и измененных команд.
Сервис data-model: listFilesInfoWithTags listTagsWithFilesCount listObjectTitles listObjectTitlesV2 listKeywords listObjects listObjectsMeta richListObjects deleteObjectSearch
Для команды "deleteObjectSearch" из data-model также был изменен текст события для журнала, т.к. в событие записываются данные из "Search" (см. поле "context" в событии). Часть шаблона сообщения, где встречаются данные из "Search": "По поисковому запросу {{data.query}} с контекстом {{data.context}}"
Сервис full-text-search: fullTextSearchDSLV2 (поле numberFacets + применяются фильтры, если были указаны в политике авторизации) fullTextSearchDSLGraphV2 (поле numberFacets + применяются фильтры, если были указаны в политике авторизации)
Сервис indexation: listIndexationDescriptionPages indexationRowsList
Сервис tolka: tolka_ListAnalyticsEntity
v1.8
Важные изменения
- Актуализирован Storybook (CURS-153)
Исправлено множество багов в компонентах UI
Data-model
- В объект GetObjectLinksList добавить указание типа сущности, с которой нужно искать связь объекта (CURS-77)
v1.7.1
Важные изменения
- Data-model
- Реализован Soft delete объектов модели данных (CURS-154, SUP-18)
v1.7
Важные изменения
В целом по системе были подняты версии библиотек, чтобы избавиться от некоторых уязвимостей
Data-model
- Добавлен различный функционал связанный с хранением "Ключевых слов"
v1.6.1
Важные изменения
Различные сервисы
- Добавлена возможность разделить учётные данные кафки для доступов producer и consumer (SUP-132, CURS-2307)
- Реализованы доработки позволяющие работать в системе без развернутого authzforce
AppUi
- Возможность завершить сеанс пользователя (SUP-135, CURS-2342)
v1.6
Важные изменения
Full-text-search
- В обработку команды fullTextSearchDSLV2 добавлен вариант поиска по строгой фразе (CURS-2146)
- При поиске в поле с типом keyword теперь применяется WildcardQuery (CURS-2222)
Indexation
- Добавлен прототип поддержка OCR в индексации (шаг Erika) (CURS-2236)
UI
- Реализована вкладка "Виджеты" (CURS-1054)
- Angular обновлен до 16 версии в Cursor в webclients, graph, ui-plugins и vespa (CURS-1124)
- Добавлены кастомные типы связи в элемент "Таблица пересечений" (CURS-2204) и в документоцентричный граф (CURS-2218)
- Добавлена поисковая строка в реестры (CURS-2205)
- Установка по умолчанию типа поиска по тексту "Строгая фраза" (CURS-2255)
Добавлены логи в формате CEF в сервисы Cursor/Verdi (CURS-36)
В Slate внесены множественные изменения и исправления
Полный список задач релиза зафиксирован в Confluence
v1.5.3
service-common
- Убрана зависимость от fs-client (SUP-66)
Tolka
- Исправлено: Не работает сортировка по умолчанию по проценту пересечений (CUR-2025)
В нескольких сервисах выставлено дефолтное значение allowInternalCommands=true (SUP-77)
v1.5.2
Версия от 04.07.2023. Список изменений:
- DataModel:
- Исправлен HealthCheck роут (SUP-48)
v1.5.1
Версия от 27.06.2023. Список изменений:
- AppUI
- Исправлено: В поиске с исп. документа не работает фильтр по проценту содержательных пересечений
v1.5
Версия от 06.06.2023. Список изменений:
Общее
- Исправлена и дополнена документация в различных разделах Cursor
- Исправлены различные баги в рамках исправлений по 9 этапу
DataModel:
- Добавлен фильтр RangeQuery по полям сущности (SUP-57)
- Исправлено: при указании фильтра по полю created - фильтрация работает некорректно если указана комбинация фильтров
DataModelClient:
- Добавлена команда listFilesInfoWithTags (SUP-14)
UI
- Исправлено: Некорректно работает компонент ввода даты из двух полей
- Исправлено: На странице настройки стартового экрана при нажатии отмены не сбрасываются изменения настроек
- Исправлено: Различается отображение длинных текстовых/ссылочных наименований/ID в таблицах системы
Indexation (+DataModel)
- Добавлена постраничная обработка файлов при индексации сущностей
Tolka
- Создан сервис аналитики
- Виджеты (хранение, вычисление данных)
- Настройки порогов
- Страница аналитики (виджеты и поисковая выдача) в appui (проект @corund/analytics)
v1.4.1
Версия от 03.05.2023. Список изменений:
Appui
- Исправлено:
- В поиске с использованием документа напротив сниппетов не отображается процент пересечения
Integration:
- Добавлен http-route для проверки жизни сервиса с помощью ServiceHealthApi
UI-Storage:
- Добавлен http-route для проверки жизни сервиса с помощью ServiceHealthApi
Marker-Service
- Добавлен http-route для проверки жизни сервиса с помощью ServiceHealthApi
v1.4
Версия от 22.03.2023. Список изменений:
- Integration:
- Доработано внешнее API для работы с отношениями
- Full-text-search:
- Доработана обработка ошибок при неверном формате входных данных
- Исправлена документация
- Добавлена авторизация на все команды сервиса с публикацией всех нужных констант
- Добавлена поддержка числовых фасетов во всех видах поиска в поле
numberFacets
- DataModel:
- Доработана обработка ошибок при неверном формате входных данных у команд для работы с тегами файлов,
getFile,deleteObject - В команды
listObjectsиrichListObjectsдобавлена сортировка поcreated - В командах, работающих по
externalIdдля отношений возвращаются такжеexternalId, а не внутренниеid - Добавлена команда установки новых отношений по
externalId - Исправлены ошибки команд для получения списков объектов
- Служебные поля (
id,entityType,created, и т.д.) теперь передаются с подчеркиванием в начале (_id,_entityType,_created, и т.д.) в результатах RichGet команд - Исправлена фильтрация по
idфайла в командахListFilesInfoWithTagsиListTagsWithFilesCount - Добавлены команды для удаления нескольких объектов
DeleteObjectBatchиDeleteObjectSearch - Добавлена генерация событий при удалении/изменении файлов у объектов
- Исправлены ошибки сортировки команды
richListObjects
- Доработана обработка ошибок при неверном формате входных данных у команд для работы с тегами файлов,
- Indexation:
- Исправлена ошибка, из-за которой не удалялись шаги удаленных индексаций
- Добавлено удаление данных из LAMP при получении события об удалении файлов у объекта
- UI-Storage:
- Добавлена публикация авторизационных констант в сервисе Attila
Общие типы данных
Search
Для некоторых команд предусматривается фильтрация, сортировка и пагинация результата. Для этих целей был добавлен объект Search, который передается в качестве параметров к команде. Также в этот объект можно преобразовать фильтры из ответа авторизации AuthorizationResult.
Search - универсальный тип параметров списочного запроса. Он состоит из полей
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| query | string | да | Строка с запросом, в котором указывается комбинация фильтров. Для запросов без фильтрации - пустая строка | Значения в строке должны быть указаны в поле context |
| context | json object | да | Контекст фильтров запроса. Объект, в котором ключ - это название фильтра, а значение - это значение фильтра. Для запросов без фильтрации - пустой объект | |
| sorting | Sorting | нет | Параметры сортировки данных | |
| paging | Paging | нет | Параметры пейджинга. В случае отсутствия данного поля, считается что пейджинг указан как "Номер страницы - 1, число элементов - 10". |
Filter query
Является строкой с запросом для фильтрации при выполнении команды. Запрос состоит из названий атрибутов фильтруемого ресурса и способов их комбинирования:
- "фильтр для поля" = название атрибута у ресурса, по которому предполагается поиск. Обычно это ресурс из результата команды.
- "комбинация фильтров" = бинарные операции
||и&&с возможностью группировки через круглые скобки(и).
Filter context
С помощью контекста передаются параметры для фильтрации полей из query.
Контекст является JSON объектом, который представляет собой тип Map[String, Json], где
- поле JSON объекта является ключом для
Map[String, Json]и должно быть упомянуто в поле query (т.е. иметь название атрибута ресурса). - значение поля JSON объекта является контекстом для фильтра FilterQueryContext. Каждый фильтр имеет свой формат.
FilterQueryContext
Общий тип для всех видов фильтров. Существует несколько реализаций, у которых может поддерживаться несколько форматов для записи условия. Рекомендуется передавать все условия фильтрации в виде JSON объекта, как более очевидный формат.
InSetQuery
Фильтрация атрибута ресурса по списку значений.
Если значение атрибута ресурса является массивом, то условие фильтрации возвращает TRUE, если этот массив и список значений для условия фильтрации пересекаются хотя бы по одному элементу.
Иначе условие фильтрации возвращает TRUE, если одиночное значение из атрибута соответствует хотя бы одному значению из фильтра.
| Поле | Тип | Обязательное | Описание | Значение по умолчанию | Ограничения |
|---|---|---|---|---|---|
| values | List[string] | да | Список значений для условия фильтрации. | ||
| kind | "any" | да | Тип фильтра. Может принимать только значение "any". | ||
| negation | bool | нет | Необходимость отрицания результата фильтрации: FALSE -> TRUE. |
false |
Возможные форматы:
"some value"- строка из одного значения, которая преобразуется в объект{"values": ["some value"], "kind": "any", "negation": false}.- JSON объект, который содержит, как минимум, обязательные поля. Необязательные поля могут принимать значение null.
В формат с одной строкой нельзя добавить отрицание (negation), т.к. вся строка является значением для фильтра. Например, "not some value" будет преобразовано в {"values": ["not some value"], "kind": "any", "negation": false}.
AllInSetQuery
Фильтрация массива из атрибута ресурса по списку значений. Условие фильтрации возвращает TRUE, если массив из атрибута содержит все значения из фильтра.
Работает только для полей, являющихся массивом.
| Поле | Тип | Обязательное | Описание | Значение по умолчанию | Ограничения |
|---|---|---|---|---|---|
| values | List[string] | да | Список значений для условия фильтрации. | ||
| kind | "all" | да | Тип фильтра. Может принимать только значение "all". | ||
| negation | bool | нет | Необходимость отрицания результата фильтрации: FALSE -> TRUE. |
false |
Возможные форматы:
- JSON объект, который содержит, как минимум, обязательные поля. Необязательные поля могут принимать значение null.
LikeQuery
Фильтрация атрибута ресурса по шаблону. Условие фильтрации возвращает TRUE, если значение из атрибута соотвествует шаблону.
Данный фильтр соответствует фильтру like из SQL. Например, like в PostgreSQL.
| Поле | Тип | Обязательное | Описание | Значение по умолчанию | Ограничения |
|---|---|---|---|---|---|
| likequery | string | да | Шаблон для условия фильтрации. | ||
| kind | "like" | да | Тип фильтра. Может принимать только значение "like". | ||
| negation | bool | нет | Необходимость отрицания результата фильтрации: FALSE -> TRUE. |
false |
В поле likequery, помимо слов для условия, поддерживаются символы % - неограниченное кол-во любых символов, _ - только один любой символ, которые можно использовать несколько раз подряд. Например, "%s_me thi__%".
Возможные форматы:
"like %some%value%"- строка из одного значения с указанием типа фильтра, которая преобразуется в объект{"likequery": "%some%value%", "kind": "like", "negation": false}.- JSON объект, который содержит, как минимум, обязательные поля. Необязательные поля могут принимать значение null.
Чтобы добавить отрицание (negation) в формат со строкой, нужно перед условием фильтрации добавить not, разделив условие и отрицание пробелом. Например, "not like %anything%".
TsQuery
Фильтрация атрибута ресурса по условие для полнотекстового поиска PostgreSQL. Условие фильтрации возвращает TRUE, если значение из атрибута соотвествует условию.
Операторы: '&' - И, '|' - ИЛИ, ':*' - начало слова, также возможно отрицание через добавление '!'. Допустимо использование логического объединения с помощью скобок '(' и ')'.
| Поле | Тип | Обязательное | Описание | Значение по умолчанию | Ограничения |
|---|---|---|---|---|---|
| tsquery | string | да | Условия полнотекстового поиска для фильтрации. | ||
| kind | "ts" | да | Тип фильтра. Может принимать только значение "ts". | ||
| negation | bool | нет | Необходимость отрицания результата фильтрации: FALSE -> TRUE. |
false |
В поле tsquery, помимо слов для условия, поддерживаются следующие операторы: & - И, | - ИЛИ, :* - начало слова, также возможно отрицание через добавление ! перед словом.
Допустимо использование логического объединения с помощью скобок ( и ).
Возможные форматы:
"ts (Олег | Ольга | Wolfg:*) & !Игорь"- строка из одного значения с указанием типа фильтра, которая преобразуется в объект{"tsquery": "(Олег | Ольга | Wolfg:*) & !Игорь", "kind": "ts", "negation": false}.- JSON объект, который содержит, как минимум, обязательные поля. Необязательные поля могут принимать значение null.
Чтобы добавить отрицание (negation) в формат со строкой, нужно перед условием фильтрации добавить not, разделив условие и отрицание пробелом. Например, "not ts !Митя".
RangeQuery
Фильтрация атрибута ресурса по условию вхождения в интервал из значения фильтра. Условие фильтрации: from <= targetValue <= to.
| Поле | Тип | Обязательное | Описание | Значение по умолчанию | Ограничения |
|---|---|---|---|---|---|
| from | long | нет | Значение, с которого начинается интервал для фильтрации (входит в интервал). | ||
| to | long | нет | Значение, с которым заканчивается интервал для фильтрации (входит в интервал). | ||
| kind | "range" | да | Тип фильтра. Может принимать только значение "range". | ||
| negation | bool | нет | Необходимость отрицания результата фильтрации: FALSE -> TRUE. |
false |
Если поля from и to не указаны, то условие всегда вернет true.
Возможные форматы:
"10_20"- строка с двумя значениями интервала, которая преобразуется в объект{"from": 10, "to": 20, "kind": "range", "negation": false}."10_"- строка только с началом интервала, которая преобразуется в объект{"from": 10, "to": null, "kind": "range", "negation": false}."_20"- строка только с окончанием интервала, которая преобразуется в объект{"from": null, "to": 20, "kind": "range", "negation": false}."_"- строка без значений интервала, которая преобразуется в объект{"from": null, "to": null, "kind": "range", "negation": false}.- JSON объект, который содержит, как минимум, обязательные поля. Необязательные поля могут принимать значение null.
Чтобы добавить отрицание (negation) в формат со строкой, нужно перед условием фильтрации добавить not, разделив условие и отрицание пробелом. Например, "not _12".
Sorting
Sorting - параметры сортировки
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| fieldName | string | да | Название поля для сортировки | |
| order | string | да | Направление сортировки. Допустимые значения: asc и desc для сортировки по возрастанию и убыванию соответственно |
Paging
Paging - параметры пейджинга
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| page | integer | да | Номер запрашиваемой страницы. Страницы нумеруются с 1 | |
| count | integer | да | Количество элементов на странице |
Page
Страница списка элементов (часть списка с примененным пейджингом)
| Поле | Тип | Описание | Ограничения |
|---|---|---|---|
| items | array of objects | Список элементов на запрошенной странице | |
| total | integer | Общее количество объектов в БД |
AuthorizationResult
Результат выполнения запроса авторизации
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| allow | Bool | Да | Разрешен ли доступ |
| entityFilters | String | Нет | Фильтры для сущности, которые нужно применить если "allow = true". Формат фильтров описан на странице Condition |
PositionInList
Позиция объекта в списке
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| position | number | да | Номер объекта в списке, начиная с 0 | |
| total | number | да | Длина списка |
EntityObjectIdentity
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| entityType | EntityTypeId | да | Номер объекта в списке, начиная с 0 | |
| objectId | ObjectId | да | Длина списка |
EntityTypeId
Соответствует типу String. Содержит идентификатор, который, чаще всего, имеет формат UUID, но это не является обязательным требованием.
StepProgress
| Поле | Тип | Обязательное | Значение по умолчанию | Описание | Ограничения |
|---|---|---|---|---|---|
| step | Step c payload Plugin | Шаг сервиса индексации | |||
| entityObject | EntityObject | Сущность сервиса data-model, обработка полей которой происходит | |||
| files | Map[FieldId, Seq[ObjectFile]] | Соответствие между полем в entityObject, которое нужно обработать, и описанием файла, который хранится в этом поле. | StepProgress, попадающий в plugin, содержит в files только те поля, которые содержатся в step.payload.fields | ||
| generated | Map[AdditionalFieldName\, Seq[GeneratedFile]] | Соответствие между полем, сгенерированным предыдущими шагами, и описанием сгенерированного файла, который хранится в этом поле. | StepProgress, попадающий в plugin, содержит в generated только те поля, которые содержатся в step.payload.fields | ||
| attempts | Int | Количество попыток, которое было сделано для обработки данного шага индексации. | Всегда меньше APP_MAX_STEP_ATTEMPTS (переменная окружения сервиса indexation) | ||
| correlationId | String | Id индексации, породившей этот StepProgress: UUID в виде строки(массовая индексация) или строка "event"+UUID(индексация события из data-model) | |||
| level | Int | Уровень, на котором находится step в индексации. Для индексации события из data-model всегда равен 0. | |||
| skipped | Seq[ObjectFile] | Описание файлов, которые были исключены из обработки с помощью ExtensionFilter. Сюда будут добавлены все файлы с неподходящим расширением, даже те, которые не содержатся в step.payload.fields. При это файлы с верным расширением, которые исключены из обработки плагинами, потому что их нет в step.payload.fields сюда включены не будут. |
FailedStepProgress
| Поле | Тип | Обязательное | Значение по умолчанию | Описание | Ограничения |
|---|---|---|---|---|---|
| indexationProgress | StepProgress | Да | Нет | StepProgress, который завершился ошибкой | |
| message | String | Да | Нет | Message ошибки, произошедшей во время обработки StepProgress | |
| stackTrace | String | Нет | Нет | StackTrace ошибки, произошедшей во время обработки StepProgress |
ObjectId
Соответствует типу UUID.
ObjectFileId
Соответствует типу UUID.
FieldId
Соответствует типу String.
AdditionalFieldName
Соответствует типу String.
ObjectFile
| Поле | Тип | Обязательное | Значение по умолчанию | Описание | Ограничения |
|---|---|---|---|---|---|
| fileId | ObjectFileId | Да | Нет | Идентификатор файла | |
| additional | JsonObject | Нет | Нет | Дополнительная информация по файлу. Сейчас здесь хранится JsonObject, представляющий из себя Map[additionalFileFieldName, url], где хранятся ссылки на файлы, сгенерированные в результате индексации. Сохраняется эта информация с помощью команды saveFilesAdditionalInfo | |
| name | String | Да | Нет | Имя файла с расширением | |
| url | String | Да | Нет | Url, по которому можно найти этот файл в s3 |
GeneratedFile
| Поле | Тип | Обязательное | Значение по умолчанию | Описание | Ограничения |
|---|---|---|---|---|---|
| originField | FieldId | Да | Нет | Название файлового поля сущности, в котором хранится файл, на основе которого был сгенерирован текущий | |
| originFileId | ObjectFileId | Да | Нет | Id файла на основе которого был сгенерирован текущий(описание сгенерированного файла хранится в объекте оригинального файла в поле additional, не additionalData) | |
| file | String | Нет | Нет | Url в s3 для содержимого сгенерированного файла |
EntityObjectEvent
| Поле | Тип | Обязательное | Значение по умолчанию | Описание | Ограничения |
|---|---|---|---|---|---|
| entityObject | EntityObject | Да | Нет | Передаваемая сущность из data-model | |
| additionalData | Option[EntityObjectEventAdditionalData] | Нет | нет | Дополнительные данные, передаваемые с событием |
EntityObjectEventAdditionalData
Один из нескольких вариантов:
- UpdateAdditionalData - данные передаваемые при обновлении сущности в data-model
- PluginBackLinksAdditionalData - данные передаваемые при запросе на переиндексацию объектов без поиска backlinks
PluginBackLinksAdditionalData
| Поле | Тип | Обязательное | Значение по умолчанию | Описание | Ограничения |
|---|---|---|---|---|---|
| topic | String | Да | Нет | Топик для шага Plugin | |
| fieldId | String | Да | Нет | Поле сущности, где хранится файл для индексации |
EntityObject
Данные объекта сущности
| Поле | Тип | Описание |
|---|---|---|
| id | uuid | ID объекта |
| externalId | string | Внешний ID объекта |
| entityType | string | Тип сущности объекта |
| title | string | Название объекта. Может быть пустой строкой, если нет необходимых полей в "data". |
| source | string | Источник данных для объекта |
| created | timestamp | Дата и время создания объекта |
| modified | timestamp | Дата и время последнего изменения объекта |
| data | Json object | Json с полями объекта |
| additionalData | Json object | Json с дополнительными полями объекта |
| version | integer | Версия объекта для оптимистичных блокировок. Передается назад на бэкэнд при модификации данных |
| removed | boolean | Признак того, считается ли объект удаленным. |
Типы данных из verdi-libs
Описание типов данных дублирует документацию из Verdi. Добавлено для более удобной навигации.
CommandStatus
Описывает статус выполнения команды.
| Возможные значения | Описание | Дополнительно |
|---|---|---|
| Created | Команда создана | Обязательный начальный статус |
| InProcess | Началась обработка команды | Необязательный промежуточный статус |
| Completed | Команда завершена | Конечный статус. Считается успешным. |
| Failed | Команда завершена с ошибкой | Конечный статус. Считается неуспешным. |
| TimedOut | Команда не завершилась за заданное время. Выполнение прекращено. | Конечный статус. Считается неуспешным. |
ErrorResponse
Ответ команды с ошибкой в качестве результата.
| Название поля | Тип | Обязательное | Описание |
|---|---|---|---|
| code | ErrorResponseCode | да | Тип ошибки |
| message | String | нет | Сообщение об ошибке (см. https://confluence.dev.embedika.ru/pages/viewpage.action?pageId=889782432) |
| stackTrace | String | нет | Информация о стеке вызовов во время ошибки |
| businessError | Json | нет | Константа описывающая бизнес-ошибку (контекстно-специфичный код ошибки) |
| data | Json | нет | Данные, которые необходимо передавать клиенту вместе с ошибкой |
| cause | Throwable | нет | Поле не участвует в сериализации. Содержит исключение, которое является причиной ошибки. |
ErrorResponseCode
Код обозначающий тип ошибки в ответе.
| Возможные значения | Тип | Описание |
|---|---|---|
| InvalidParameters | String | Для команды переданы неверные параметры. |
| NotAvailableDestinations | String | Нет ни одного доступного получателя для данной команды. |
| NotValidResponse | String | Некорректный HTTP ответ по команде. |
| CannotWaitCommandCompletion | String | Async команда не успела завершится за определенное время. |
| CannotSend | String | Невозможно отправить команду или результат ее работы. Содержит описание причины. |
| Exception | String | Необработанный exception. Может содержать Throwable и его сообщение, являющийся причиной ошибки. |
| HttpError(statusCode: Int) | Json | Результат команды следует интерпретировать как HttpResponse с определенным статусом. |
FSConfigRep (FSClient)
Отображение FSConfig в "плоской форме", как он выглядит в конфиге приложения application.conf.
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| uri | String | Да | Адрес файлового хранилища для подключения. | Не пустое |
| uploadParallelism | Int | Да | Параллелизм загрузки файлов в файловое хранилище. | > 0 |
| accessKeyId | String | Да, если authMode=Static | ID для подключения (не зависит от бакета). | Не пустое |
| secretAccessKey | String | Да, если authMode=Static | Key для подключения (не зависит от бакета). | Не пустое |
| authMode | String | Нет | Режим аутентификации клиента: Static - данные для подключения не зависят от бакета, Mapping - данные зависят от бакета. По-умолчанию Static. | "Static", "Mapping" |
| authConfig | String | Да, если authMode=Mapping | Настройки для выбранного режима аутентификации. Если authMode=Mapping, то ожидается Seq[FSBucketConfig] в формате JSON. | |
| clientsCache | VerdiCacheConfig | Нет | Настройки кеша для клиентов файлового хранилища. |
FSConfig (FSClient)
Конфигурация клиента файлового хранилища.
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| uri | String | Да | Адрес файлового хранилища для подключения | Не пустое |
| uploadParallelism | Int | Да | Параллелизм загрузки файлов в файловое хранилище | > 0 |
| credentials | Seq[FSBucketConfig] | Да | Список данных для учетных записей для подключения к бакетам | |
| clientsCache | VerdiCacheConfig | Да | Настройки кеша для клиентов файлового хранилища |
FSBucketConfig (FSClient)
Данные для аутентификации, которые привязаны к конкретному бакету.
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| bucketName | String | Да | Название бакета. Если значение пустое, то данные подходят для любого бакета. | |
| bucketAlias | List[String] | Нет | Список альтернативных названий бакета. | Не пустое |
| credentials | FSCredentials | Да | Данные учетной записи для подключения к бакету. |
FSCredentials (FSClient)
Данные для аутентификации.
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| accessKeyId | String | Да | ID для подключения | Не пустое |
| secretAccessKey | String | Да | Key для подключения | Не пустое |
VerdiCacheConfig (Verdi-cache)
Настройки кеширования
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| maxSize | int | Нет | Максимальное количество элементов в кеше, при превышении которого элементы начнут удаляться (LRU). | |
| elementTTL | duration string | Нет | Максимальное время жизни элемента. |
KafkaAuthConfig (senderlib)
Параметры для авторизации kafka-клиента (доступ к топикам).
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| passwordBased | PasswordBasedCredentials | Нет | Реквизиты для аутентификации в kafka с помощью пароля | Должно быть заполнено, если не заполнено kerberosBased |
| kerberosBased | KerberosBasedCredentials | Нет | Реквизиты для аутентификации в kafka с помощью kerberos | Должно быть заполнено, если не заполнено passwordBased |
| truststore | TrustStoreConfig | Нет | Параметры для хранилища сертификатов | |
| topic | string | Нет | Название топика, к которому привязаны данные | |
| kind | string | Нет | Тип сущности, к которой привязаны данные | "producer" или "consumer" или "both"(равнозначно параметрам, валидным для "producer" и "consumer") или "admin"(не входит в "both") |
PasswordBasedCredentials (senderlib)
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| user | string | Да | Имя пользователя | |
| password | string | Да | Пароль пользователя |
KerberosBasedCredentials (senderlib)
NB! Для успешной работы авторизации в kafka с помощью kerberos нужно, чтобы kerberos мог найти файл krb5.conf. По умолчанию он ищет в /etc/krb5.conf, поэтому на стендах файл всегда должен лежать в /etc/krb5.conf. Для локальной работы поменять это поведение можно, установив переменную System.setProperty("java.security.krb5.conf", "желаемый путь до krb5.conf")
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| principal | string | Да | Kerberos principal, соответствующий пользователю | |
| keytabPath | string | Да | Путь до файла keytab |
TrustStoreConfig (senderlib)
Параметры для хранилища сертификатов (Java key store)
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| location | string | Да | Путь до хранилища сертификатов | |
| password | string | Нет | Пароль к хранилищу сертификатов |
KafkaAuthSettings (senderlib)
Параметры для авторизации kafka-клиента (доступ к топикам).
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| staticAuth | KafkaAuthConfig | Нет | Данные для статической аутентификации (не зависит от топика) | |
| authMode | string | Нет | Режим аутентификации | "Static"(одна учетная запись на все запросы) или "Mapping"(учетная запись зависит от запроса) |
| authConfig | string | Нет | Данные для аутентификации в указанном режиме, если он отличается от KafkaAuthMode.Static | Строка в формате JSON с типом List[KafkaAuthConfig] |
| clientsCache | VerdiCacheConfig | Нет | Настройки кеширования Kafka-клиентов |
RetrySettings (senderlib)
Настойки для повтороного вызова функций
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| attempts | string | Да | Максимальное количество повторных вызовов. Чтобы исключить возможность повторного вызова, нужно установить значение 0. | |
| delay | duration string | Да | Константная задержка перед повторным вызовом |
CommandResultRetryConditionKind (senderlib)
Вид условия, по которому результат команды будет считаться неуспешным и команду следует вызвать повторно. Соответствует типу String.
| Возможные значения | Описание |
|---|---|
| OnFailStatuses | Если результат команды ErrorResponse или результат имеет CommandStatus, который является неуспешным |
| OnAllExceptions | Если результат команды ErrorResponse и имеет ErrorResponseCode = Exception |
| OnSomeExceptions(Name1, Name2, ..) | Содержит список значений с разделителем , (запятая). Если результат команды ErrorResponse, имеет ErrorResponseCode = Exception. Значения в полях message или cause должны содержать одно из значений. |
Функционал фильтров и сортировки
Для некоторых команд можно передавать параметры запроса в виде объекта Search, который содержит информацию о том как нужно отфильтровать, отсортировать запрос и как разделить его на страницы.
Фильтрация
{
"query": "count && (created || modified)",
"context": {
"count": "1_1000",
"created": "1630326000_",
"modified": "_1630327000"
}
}
Фильтрация состоит из двух полей:
queryописывает условие для фильтрации с использованием названий полейcontextописывает значение для полей, указанных вquery
Query поддерживает операторы && и || + скобки.
В Context-е можно описать несколько видов проверок для полей:
1) Условие равенства переданному значению.
{
"context": {
"fieldName": "какое-то значение"
}
}
2) Условие равенства какому-то одному значению из предоставленного списка.
{
"context": {
"fieldName": "[первое значение, второе, другое]"
}
}
или
{
"context": {
"fieldName": "any[первое значение, второе, другое]"
}
}
3) Условие наличия всех значений из предоставленного списка в массиве всех значений objectFieldName, которые присутствуют в объектах поля arrayFieldName.
Работает только для полей arrayFieldName, содержащих массив.
Предоставленный в запросе список должен содержать не менее двух значений.
{
"context": {
"arrayFieldName.objectFieldName": "all[первое значение, второе, другое]"
}
}
4) Условие соответствия паттерну
Значение поля обязательно должно начинаться со слова like.
{
"context": {
"fieldName": "like какое%значен__"
}
}
5) Условие вхождения значения в заданный диапазон. В данный момент, поддерживаются только целые числа.
Начало и конец диапазона разделяются знаком _. Оба конца диапазона опциональны и они включаются в диапазон.
Если передать просто _, то результатом будет пустой диапазон, в который не входит ни один элемент и ответ тоже будет пустой.
6) Условие текствого поиска PGSQL
Значение поля обязательно должно начинаться со слова ts.
{
"context": {
"fieldName": "ts (this | that) & the:*"
}
}
Сортировка
{
"sorting": {
"fieldName": "number",
"order": "desc"
}
}
Сортировка определяется двумя полями:
fieldNameназвание поля, по которому будет производиться сортировкаorderнаправление сортировки. Бывает двух видов:asc,desc.
Настройки логеров
Конфигурация для логера указывается в файле src/main/resources/logback.xml (или logback-test.xml). Если такого файла нет, то будет использована "базовая" конфигурация с выводом лога в консоль (stdout) в следующем формате:
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n.
Некоторые параметры из файла конфигурации можно задать через переменные окружения. Ниже приведен список общих переменных окружения, которые есть почти в каждом сервисе, но конфигурация не ограничивается только ими.
У каждого сервиса свой набор переменных и может присутствовать префикс у каждой переменной (например, MON_ или TOLKA_). В таком случае, префикс должен быть добавлен и к переменным окружения для логеров.
Пример:
В документации приведена общая переменная окружения для уровня логирования LOG_LEVEL, но у сервиса "Oberto" для всех переменных окружения используется префикс OBERTO_. Поэтому, чтобы настроить общий уровень логирования для сервиса "Oberto", нужно использовать переменную OBERTO_LOG_LEVEL вместо LOG_LEVEL.
Чтобы узнать, используется ли какой-то префикс в сервисе, можно посмотреть на список переменных в документации к сервису.
LOG_OUTPUT
Задает, куда будет выводиться сообщения лога. Может принимать следующие значения:
STDOUT - обычный лог в консоль.
STDOUT_CEF - лог в формате CEF в консоль.
STDOUT_CEF_JSON - лог в формате JSON в консоль, но со структурой сообщений CEF.
FILE - обычный лог в файл.
FILE_CEF - лог в формате CEF в файл.
FILE_CEF_JSON - лог в формате JSON в файл, но со структурой сообщений CEF.
SYSLOG - обычный лог в SYSLOG.
SYSLOG_CEF - лог в формате CEF в SYSLOG.
SYSLOG_CEF_JSON - лог в формате JSON в SYSLOG, но со структурой сообщений CEF.
Данный параметр может принимать несколько значений через любой разделитель (например, через пробел "STDOUT FILE_CEF"). Если указано несколько значений с одним типом вывода, то будет учитываться только вывод в формате CEF.
Например: если присутствуют "STDOUT" + "STDOUT_CEF", то учитывается только "STDOUT_CEF"; "FILE" + "FILE_CEF" = "FILE_CEF"; "SYSLOG" + "SYSLOG_CEF" = "SYSLOG_CEF".
LOG_LEVEL
Стандартный уровень логирования, который будет считаться значением по умолчанию для логеров, у которых уровень логирования не задается в отдельной переменной.
Значения в переменной характеризуют, насколько детальными будут сообщения в логе.
Может принимать следующие значения:
TRACE - максимально подробные сообщения.
DEBUG - менее подробные сообщения, чем в TRACE, но достаточные для debug-а.
INFO - логирование основных событий во время работы приложения. Считается стандартным уровнем логирования.
WARN - логирование только важных событий.
ERROR - логирование только сообщений об ошибках.
OFF - отключение лога.
Каждый уровень включает в себя все последующие, поэтому TRACE наиболее подробный, т.к. содержит все возможные сообщения, а WARN менее подробный, т.к. содержит только сообщения об ошибках и других важных событиях, но не содержит "стандартные" события из уровня INFO.
Если у конкретного логера есть отдельная настройка для уровня логирования, то она будет перекрывать общую настройку из LOG_LEVEL.
Переменные для указания уровня логирования конкретных логеров
В каждом сервисе/приложении по своему настроены логеры, которые будут привязаны к какой-то из переменных. Далее будут описаны лишь общий смысл переменных и какого вида сообщения можно ожидать от привязанных логеров.
LOG_LEVEL_HTTP - логер для HTTP сервера/клиента, отображающий события во время обработки HTTP вызова. Значение по умолчанию "INFO".
LOG_LEVEL_NIOSOCKET - логер для бекенда HTTP сервера/клиента, отображающий низкоуровневые события во время обработки HTTP вызова. Значение по умолчанию "WARN".
LOG_LEVEL_AKKA - логер для системы акторов, отображающий специфичные для Akka сообщения (из тред пула, из стримов, из акторов). Значение по умолчанию "INFO".
LOG_LEVEL_LIQUIBASE - логер для liquibase (миграции БД). Почти не используются, только если миграции не вызываются во время работы сервиса (как в data-model). Значение по умолчанию "INFO".
LOG_LEVEL_SLICK_STATEMENT - логер для slick (вывод sql запросов). Значение по умолчанию "WARN".
LOG_LEVEL_SLICK_BENCHMARK - логер для slick (вывод времени подготовки sql запросов). Значение по умолчанию "OFF".
LOG_LEVEL_SLICK_QUERY_COMPILER - логер для slick (вывод времени подготовки sql запросов с разделением по стадиям). Значение по умолчанию "OFF".
Обычно, в Kafka логерах отображается низкоуровневая информация о полученных или отправленных сообщениях, текущее состояние и настройки клиентов, логирование протокола общения между клиентом и брокером.
LOG_LEVEL_KAFKA, LOG_LEVEL_KAFKA_PRODUCER, LOG_LEVEL_KAFKA_CONSUMER - логер для Kafka клиентов (продюсер и консьюмер). Обычно используется или общая переменная, или по одной для консьюмера и продюсера. Значение по умолчанию "WARN".
LOG_LEVEL_KAFKA_HTTP - логер для HTTP бекенда Kafka клиентов. Значение по умолчанию "WARN".
LOG_LEVEL_KAFKA_INTERNAL - логер для внутренних сообщений Kafka клиентов (metadata). Значение по умолчанию "INFO".
LOG_LEVEL_KAFKA_SELECTOR - логер для общего сетевой библиотеки всех клиента Kafka (логирует SSL handshake). Значение по умолчанию "INFO".
LOG_LEVEL_KAFKA_NETWORK_CLIENT - логер для общего сетевой библиотеки всех клиента Kafka (низкоуровневый клиент). Значение по умолчанию "INFO".
LOG_LEVEL_KAFKA_STREAMING_PRODUCER - логер для Kafka producer. Значение по умолчанию "INFO".
LOG_LEVEL_ZIO_KAFKA - логер для ZIO версии Kafka producer. Значение по умолчанию "INFO".
LOG_LEVEL_AKKAHTTPSENDER - логер для отправки команд по HTTP. Значение по умолчанию "WARN".
LOG_LEVEL_KAFKASENDER - логер для отправки команд по Kafka. Значение по умолчанию "TRACE".
LOG_LEVEL_COMMANDSTATUS_CLIENT - логер для клиента CommandStatus. Значение по умолчанию "WARN".
LOG_LEVEL_AUTHZCLIENT - логер для клиента авторизации (к authzfroce или oberto). Значение по умолчанию "ERROR".
LOG_JSON_SPACES - определяет форматирование JSON-а в сообщениях логера:
noSpaces - без переносов строк и отступов,
spaces2 - с переносами строк и с отступами в два пробела.
Значение по умолчанию "noSpaces".
Параметры для настройки логирования в формате CEF.
У логов есть возможность включить формат CEF для логирования по следующему шаблону:
2022-12-14T16:56:31+0500 CEF:Version|Device Vendor|Device Product|Device Version|EventClassId|Message|Severity|src=? dst=? shost=? suid=? suser=? msg=? end=currentTimeMillis|.
Чтобы включить логирование в формате CEF, нужно задать в переменной LOG_OUTPUT значение с постфиксом, который содержит _CEF (например, LOG_OUTPUT = STDOUT_CEF или LOG_OUTPUT = FILE_CEF_JSON).
В каждом logback.xml файле есть свойство, которое задает "main class" всего приложения. Этот класс нужен для получения параметров записи сообщений в формате CEF.
У данного свойства нет переменной окружения, но его можно поменять прямо в файле.
Значение (value) свойства зависит от сервиса, но обычно оно задано как
<property scope="context" name="projectMainClassPath" value="com.embedika.Main"/>
В каждом application.conf файле указаны параметры для логирования в формате CEF, которые по умолчанию не заданы.
Если логи пишутся в формате CEF, то необходимо задать следующие переменные:
LOGGING_SRC_IP Параметр
SRC(источник/source, на который ссылается событие) для логов в формате CEF. Если не установлена,src=notFound. Требуемый формат: IPv4, например "192.168.10.1".LOGGING_SRC_HOST Параметр
SHOST(источник/source, на который ссылается событие) для логов в формате CEF. Если не установлена,shost=notFound. Требуемый формат: fully qualified domain name (FQDN), например "host" или "host.domain.com".LOGGING_DST_IP Параметр
DST(получатель/destination, на который ссылается событие) для логов в формате CEF. Если не установлена,dst=notFound. Требуемый формат: IPv4, например "192.168.10.1".LOGGING_CEF_VER Версия формата CEF: либо
0, либо1. Рекомендуется использовать0.
Значение по умолчанию "0".
Параметры для настройки логирования в формате SYSLOG
В конфиге есть возможность настроить отправку логов в какой-нибудь SYSLOG сервер. Для отправки логов используется Syslog4j.
Чтобы включить логирование в SYSLOG, нужно задать в переменной LOG_OUTPUT значение с префиксом SYSLOG_ (например, LOG_OUTPUT = SYSLOG_CEF).
LOG_SYSLOG_TYPE Протокол взаимодействия с SYSLOG сервером. Может принимать значения "UDP", "TCP" или "TLS".
Значение по умолчанию "UDP".
Значения из переменнойLOG_SYSLOG_TYPEконвертируются в классы Syslog4j:
TSL ->org.productivity.java.syslog4j.impl.net.tcp.ssl.SSLTCPNetSyslogConfig
TCP ->org.productivity.java.syslog4j.impl.net.tcp.TCPNetSyslogConfig
UDP ->org.productivity.java.syslog4j.impl.net.udp.UDPNetSyslogConfig
Если задано значение TLS, то необходимо еще настроить и параметры для SSL
Документацию по Java KeyStore и Truststore https://docs.oracle.com/cd/E19509-01/820-3503/ggffo/index.html
LOG_SYSLOG_KEYSTORE
Путь до файла KEYSTORE
LOG_SYSLOG_KEYSTORE_PASS
Пароль для файла в LOG_SYSLOG_KEYSTORE
LOG_SYSLOG_TRUSTSTORE
Путь до файла TRUSTSTORE
LOG_SYSLOG_TRUSTSTORE_PASS
Пароль для файла в LOG_SYSLOG_TRUSTSTORELOG_SYSLOG_PATTERN
Шаблон для сообщений. Не учитывается для "LOG_OUTPUT = SYSLOG_CEF", т.к. используется шаблон для CEF.
Документация по шаблонам https://logback.qos.ch/manual/layouts.html#ClassicPatternLayout.
Значение по умолчанию[%level] [%logger] [%thread] - %msg%n.LOG_SYSLOG_HOST
Хост SYSLOG сервиса в формате IPv4. Требуемый формат: IPv4.
Значение по умолчанию "127.0.0.1".LOG_SYSLOG_PORT
Порт SYSLOG сервиса. Может принимать любое положительное число.
Значение по умолчанию "514".LOG_SYSLOG_FACILITY
К сожалению, LOG_SYSLOG_FACILITY задается только через int код, а не string.
Список кодов для переменной:
KERN= 0
USER= 8
MAIL= 16
DAEMON= 24
AUTH= 32
SYSLOG= 40
LPR= 48
NEWS= 56
UUCP= 64
CRON= 72
AUTHPRIV= 80
FTP= 88
LOCAL0= 128
LOCAL1= 136
LOCAL2= 144
LOCAL3= 152
LOCAL4= 160
LOCAL5= 168
LOCAL6= 176
LOCAL7= 184
Значение по умолчанию "8".LOG_SYSLOG_IDENT
Идентификатор SYSLOG клиента. Может принимать любую строку.
Значение по умолчанию зависит от сервиса и обычно является названием сервиса ("mon", "oberto" и т.п.).LOG_SYSLOG_MAX_MSG_SIZE
Максимальны размер одного сообщения лога в байтах. Может принимать любое число.
Значение по умолчанию "65536".
Скрипт для формирования ROOT logger-а для logback.xml
В репозитории сервисов Verdi был добавлен скрипт "logback_config_generation.sc" для формирования ROOT логера. Этот скрипт можно запустить, например, в scala worksheet.
Объявление root логера в конфиге может быть достаточно большим, если количество уникальных вариантов вывода лога больше трех или четырех, т.к. мы должны учитывать все способы вывода из переменной LOG_OUTPUT.
В таком случае, добавление новых опций для вывода становится проблематичным (требует какого-то времени), тогда и может пригодиться данный скрипт.
В конце выполнения, скрипт делает println с получившимся XML-ом, который можно просто вставить в файл с конфигом.
Сервис ограниченных контекстов - ОК
В сервисе реализованы следующие команды
- Агрегирующий поиск в ограниченном контексте
- Поиск по ветке куста ограниченного контексте
- Создание ограниченного контекста
- Получение ограниченного контекста
- Получение списка ограниченных контекстов
- Удаление ограниченного контекста
- Обновление ограниченного контекста
Общее описание архитектуры сервиса ОК
Конфигурирование сервиса ОК
Требование к запуску сервиса ОК
Запуск сервиса осуществляется локально через sbt, на стенде в docker на jvm. Для корректной минимальной работы сервиса требуется обязательное подключение к Kafka, Consul, PostrgeSQL. Для нормальной работы сервису дополнительно требуется окружение Verdi: CommandStatus и ApiGateway.
Список переменных окружения сервиса ОК
| Переменная | Тип | Обязательная | Значение по умолчанию | Описание |
|---|---|---|---|---|
| SERVER_PORT | int | нет | 8080 | Порт, на котором слушает HTTP-сервер |
| VERDI_CONSUL | string | да | http://localhost:8500 | Адрес Consul |
| VERDI_CONSUL_AUTH_USER | string | нет | "" | Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены. |
| VERDI_CONSUL_AUTH_PASSWORD | string | нет | "" | Пароль учетной записи Сonsul. |
| VERDI_KAFKA_ADDRESS | string | да | localhost:9092 | Адрес брокера Kafka. |
| VERDI_KAFKA_TOPIC | string | нет | eventStatus | Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд. |
| VERDI_KAFKA_AUTH_USER | string | нет | "" | Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены. |
| VERDI_KAFKA_AUTH_PASSWORD | string | нет | "" | Пароль учетной записи Kafka. |
| VERDI_KAFKA_AUTH_PRINCIPAL | string | нет | "" | Principal учетной записи Kafka в Kerberos(в случае соединения с kafka через Kerberos). |
| VERDI_KAFKA_AUTH_KEYTAB_PATH | string | нет | "" | Путь до keytab-файла(в случае соединения с kafka через Kerberos). |
| VERDI_KAFKA_AUTH_TRUSTSTORE_LOCATION | string | нет | "" | Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применяться не будет. |
| VERDI_KAFKA_AUTH_TRUSTSTORE_PASSWORD | string | нет | "" | Пароль к хранилищу сертификатов. |
| VERDI_HOST | string | да | localhost | Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service |
| VERDI_TTL | duration string | нет | 30 seconds | Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым. |
| VERDI_HEALTH_CHECK | duration string | нет | 10 seconds | Периодичность отправки health check в ServiceDiscovery |
| VERDI_COMMAND_STORAGE_UPDATE_PERIOD | duration string | нет | 1 minutes | Время кэширования данных по командам из CommandDiscovery |
| VERDI_SERVICE_DISCOVERY_UPDATE_PERIOD | duration string | нет | 30 seconds | Время кэширования данных по сервисам из ServiceDiscovery |
| VERDI_ALLOW_INTERNAL_COMMANDS | bool | нет | true | Можно ли сервису отправлять внутрисистемные команды |
| VERDI_CONSUL_CONNECTION_MAX_RETRY | int | нет | 5 | Максимальное количество попыток подключений к Consul |
| VERDI_CONSUL_CONNECTION_RETRY_DELAY | duration string | нет | 1 seconds | Таймаут между неудачными попытками подключения к Consul |
| VERDI_KAFKA_SYNC_POLLING_PERIOD | duration string | нет | 1 seconds | Периодичность запроса статуса verdi команд в sender-lib |
| VERDI_KAFKA_SYNC_POLLING_TIMEOUT | duration string | нет | 1 seconds | Максимальное время ожидания выполнения verdi команды в sender-lib |
| DB_JDBC_URL | jdbc url string | да | jdbc:postgresql://127.0.0.1:5432/bushcraft | JDBC-url для соединения с БД |
| DB_USER | string | да | Пользователь БД | |
| DB_PASSWORD | string | да | Пароль пользователя БД | |
| DB_THREADS | int | нет | 10 | Количество потоков в пуле потоков для соединения с БД |
| DB_QUEUE_SIZE | int | нет | 300 | Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей |
| DB_CONN_MAX | int | нет | 10 | Максимальное количество одновременных подключений к БД |
| DB_CONN_TIMEOUT | duration string | нет | 20 second | Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение. |
| DB_ISOLATION | string | нет | "READ_COMMITTED" | Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE. |
| DB_READONLY | boolean | нет | false | Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции. |
| DB_CONN_MIN | int | нет | = DB_THREADS | Минимальное количество одновременных подключений к БД |
| DB_VALIDATION_TIMEOUT | duration string | нет | 1 seconds | Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение. |
| DB_IDLE_TIMEOUT | duration string | нет | 10 minutes | Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула. |
| DB_MAX_LIFETIME | duration string | нет | 30 minutes | Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы. |
| DB_INITIALIZATION_FAIL_FAST | string | нет | false | Deprecated, начиная с версии Slick 3.3.0. Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0. |
| DB_LEAK_DETECTION_THRESHOLD | int | нет | 0 | Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с. |
| DB_CONNECTION_TEST_QUERY | string | нет | "SELECT 1" | Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid(). |
| DB_REGISTER_MBEANS | boolean | нет | false | Зарегистрированы ли JMX Management Beans («MBeans») |
| VERDI_COMMANDS_HTTP_RETRY_ATTEMPTS | int | нет | 5 | Поле attempts из RetrySettings |
| VERDI_COMMANDS_HTTP_RETRY_DELAY | duration string | нет | "5 seconds" | Поле delay из RetrySettings |
| VERDI_COMMANDS_HTTP_RETRY_KIND | string | нет | "OnSomeExceptions(ConnectException)" | CommandResultRetryConditionKind |
Модель сервиса ОК
Bush
Ограниченный контекст
| Название поля | Тип | Описание |
|---|---|---|
| id | String | Идентификатор контекста |
| relations | Map[String, relations] | Иерархия типов сущностей |
| version | Int | Версия контекста. Используется для optimistic lock |
BushcraftSearchRequest
Форма агрегирующего поиска в ограниченном контексте
| Название поля | Тип | Описание |
|---|---|---|
| bushId | String | Идентификатор контекста |
| query | String | Поисковая строка |
| paging | Paging | Пагинация |
EntityObjectIdentity
Полный идентификатор объекта
| Название поля | Тип | Описание |
|---|---|---|
| entityType | String | Тип объекта |
| objectId | UUID | Идентификатор объекта |
BranchUnfoldRequest
Форма агрегирующего поиска в отдельной ветке ограниченного контекста
| Название поля | Тип | Описание |
|---|---|---|
| bushId | String | Идентификатор контекста |
| query | String | Поисковая строка |
| paging | Paging | Пагинация |
| root | EntityObjectIdentity | Идентификатор корня ветки |
| branchType | String | Тип фильтруемых сущностей в корне |
BushCreateDTO
Форма создание ограниченного контекста
| Название поля | Тип | Описание |
|---|---|---|
| id | String | Идентификатор контекста |
| relations | Map[String, relations] | Иерархия типов сущностей |
Команды сервиса ОК
bushSearch
Агрегирующий поиск в ограниченном контексте
На входе поисковый запрос
{
"query": "электроконтактная",
"paging": {
"page": 1,
"count": 40
},
"bushId": "fixedBush"
}
В результате куст объектов
{
"status": "Completed",
"timestamp": 1651387723970,
"value": {
"documents": [
{
"document": {
"id": "508d1853-1648-4558-a9f9-e590876018b4",
"entityType": "links",
"highlight": {},
"data": ... // doc data
},
"matchedChildren": {
"Patent": 2
}
},
{
"document": {
"id": "eaeda9a3-5454-4cc0-902a-a7f854a2bd96",
"entityType": "1thesis",
"highlight": {},
"data": ... // doc data
},
"matchedChildren": {
"RfbrDocument": 4
}
},
... // others docs
],
"total": 25
}
}
Поддерживается только синхронный вызов
- На входе: BushcraftSearchRequest
- На выходе: AggregationSearchResult
branchUnfold
Поиск по ветке куста ограниченного контексте
На входе поисковый запрос
{
"query": "электроконтактная",
"paging": {
"page": 1,
"count": 40
},
"bushId": "fixedBush",
"root": {
"entityType": "Patent",
"objectId": "c7feabde-09cd-463c-ab4e-968178e7ab37"
},
"branchType": "RfbrDocument"
}
В результате ветка куста объектов
{
"status": "Completed",
"timestamp": 1651388234581,
"value": {
"documents": [
{
"id": "975975bb-ece6-4aca-80fc-5f227e982582",
"entityType": "RfbrDocument",
"highlight": {
"newFileContent": [
"И, действительно, !!!HL!!электроконтактная!!HL!!! методика, о которой я здесь\nрассказываю, в скором времени сыграла",
"Результаты\nизмерений, полученные с помощью !!!HL!!электроконтактной!!HL!!! методики (в\nсочетании с другими), позволили",
"С помощью !!!HL!!электроконтактной!!HL!!! методики уже в 1948 году были\nполучены первые экспериментальные данные о",
"моей сохранилось чувство признательности и даже\nгордости от того, что в этой нашей работе по созданию !!!HL!!электроконтактной!!HL!!!",
"Опыты намечалось проводить с применением !!!HL!!электроконтактной!!HL!!! методики измерения скоростей."
]
},
"data": ... // doc data
},
{
"id": "1f398276-efb3-41c9-994d-6680681d59f5",
"entityType": "RfbrDocument",
"highlight": {
"newFileContent": [
"камера; 2 — пьезокварцевый датчик давления; З капсюльвоспламенитель; 4 — метаемое тело с полостью; 5 !!!HL!!электроконтактное!!HL!!!"
]
},
"data": ... // doc data
}
],
"total": 2
}
}
Поддерживается только синхронный вызов
- На входе: BranchUnfoldRequest
- На выходе: AggregationSearchResult если найденные документы сами являются корнями или ByParentSearchResult если документы являются листьями
createBush
Создание ограниченного контекста
На входе форма создания
{
"id": "fixedBush",
"relations": {
"links": {"Patent": {"RfbrDocument": {}}},
"1thesis": {"RfbrDocument": {}},
"poems": {"kate": {}}
}
}
В результате идентификатор успешно созданного контекста
"fixedBush"
Поддерживается только синхронный вызов
- На входе: BushCreateDTO
- На выходе: String
getBush
Получение ограниченного контекста
На входе идентификатор ограниченного контекста
"fixedBush"
В результате ограниченный контекст
{
"id": "fixedBush",
"relations": {
"links": {"Patent": {"RfbrDocument": {}}},
"1thesis": {"RfbrDocument": {}},
"poems": {"kate": {}}
}
}
Поддерживается только синхронный вызов
- На входе: String
- На выходе: BushCreateDTO
listBush
Получение списка ограниченных контекстов
Входных данных нет
В результате список ограниченных контекстов
[
{
"id": "fixedBush",
"relations": {
"links": {
"Patent": {
"RfbrDocument": {}
}
},
"poems": {
"kate": {}
},
"1thesis": {
"RfbrDocument": {}
}
},
"version": 1
}
]
Поддерживается только синхронный вызов
- Команда не принимает параметров
- На выходе: Seq[Bush]
deleteBush
Удаление ограниченного контекста
На входе идентификатор контекста
"fixedBush"
В результате кол-во удаленных записей
Поддерживается только синхронный вызов
- На входе: String
- На выходе: Integer
updateBush
Обновление ограниченного контекста
На входе описание контекста
{
"id": "fixedBush",
"relations": {
"links": {"Patent": {"RfbrDocument": {}}},
"1thesis": {"RfbrDocument": {}},
"newRoot": {"newLeaf": {}}
},
"version": 1
}
В результате кол-во обновленных записей
Поддерживается только синхронный вызов
- На входе: Bush
- На выходе: Integer
Exporter: сервис для экспорта данных
Сервис принимает команды для работы с игроками и командами. Состояние хранится в PostgreSQL.
Команды могут приходить как по HTTP, так и через Kafka в топик exporter_commands.
Сервис разбит на несколько модулей, в виде sbt проектов:
domain, в котором содержатся все доменные модели и их различные представления.commands, в котором содержатся все? что связано с командами, их описанием и обработчиками.infrastructure, в котором содержится описание взаимодействия с другими сервисами.storage, содержит сервисы для сохранения и чтения их разных хранилищ доменных моделей.service, содержит сервисы бизнес логики, которые определяют правила взаимодействия компонентов между собой.boot, содержит зависимости и описание для сборки и запуска сервиса.
Информация по добавлению команд можно прочитать в описании шаблона
Локальный запуск
При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:
- PostgreSQL база по адресу
localhost:5432/exporter_db - Kafka по адресу
localhost:9092 - Consul по адресу
localhost:8500 - Адрес Kafka будет указан в
application.conf - Добавлены необходимые переменные окружения:
- EXPORTER_DB_HOST
- EXPORTER_DB_PORT
- EXPORTER_DB_NAME
- EXPORTER_DB_USER
- EXPORTER_DB_PASSWORD
Запуск из консоли с помощью SBT
EXPORTER_DB_HOST=localhost EXPORTER_DB_PORT=5432 EXPORTER_DB_NAME=exporter_db EXPORTER_DB_USER=postgres EXPORTER_DB_PASSWORD=12345 sbt boot/run
Список переменных окружения сервиса Exporter
Все доступные переменные окружения для настройки сервиса.
| Переменная | Тип | Обязательная | Значение по умолчанию | Описание |
|---|---|---|---|---|
EXPORTER_HTTP_HOST |
string | нет | 0.0.0.0 |
Хост, на котором слушает HTTP-сервер |
EXPORTER_HTTP_PORT |
int | нет | 8192 |
Порт, на котором слушает HTTP-сервер |
EXPORTER_KAFKA_SERVERS |
string | да | localhost:9092 |
Адрес Kafka |
EXPORTER_KAFKA_TOPIC |
string | нет | exporter_commands |
Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery. |
EXPORTER_KAFKA_CONSUMER_GROUP |
string | нет | exporter_consumer_group |
Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске. |
EXPORTER_KAFKA_PARTITIONS |
int | нет | 10 |
Число читаемых партиций из кафка-топика команд. |
EXPORTER_KAFKA_CONSUMER_RESTART_MIN_BACKOFF |
duration string | нет | 1 second |
Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта) |
EXPORTER_KAFKA_CONSUMER_RESTART_MAX_BACKOFF |
duration string | нет | 30 seconds |
Максимальное задержка до рестарта консьюмера после падения |
EXPORTER_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR |
double | нет | 0.2 |
Рандомный фактор для вычисления задержки перед следующим рестратом консьюмера (При значении 0.2 задержка может быть до 20% больше, чем при 0) |
EXPORTER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS |
int | нет | 5 |
Максимальное число рестартов консьюмера после падения (в пределах EXPORTER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN) |
EXPORTER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN |
duration string | нет | 5 minutes |
Временной отрезок, в который EXPORTER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов |
EXPORTER_KAFKA_COMMANDEVENT_TOPIC |
string | да | commandevents |
Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд. |
EXPORTER_KAFKA_AUTH_USER |
string | нет | Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены. | |
EXPORTER_KAFKA_AUTH_PASSWORD |
string | нет | Пароль учетной записи Kafka. | |
EXPORTER_KAFKA_AUTH_TRUSTSTORE_LOCATION |
string | нет | Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет. | |
EXPORTER_KAFKA_AUTH_TRUSTSTORE_PASSWORD |
string | нет | Пароль к харнилищу сертификатов. | |
EXPORTER_CONSUL_ADDR |
url string | нет | http://localhost:8500 |
Адрес Сonsul. |
EXPORTER_CONSUL_AUTH_USER |
string | нет | Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены. | |
EXPORTER_CONSUL_AUTH_PASSWORD |
string | нет | Пароль учетной записи Сonsul. | |
EXPORTER_TRACE_DURATION |
boolean | нет | false |
Признак необходимости трассировки выполнения команд |
EXPORTER_DISCOVERABLE_ID |
string | нет | another_EXPORTER_service_instance |
ID сервиса в ServiceDiscovery |
EXPORTER_DISCOVERABLE_NAME |
string | нет | exporter |
Имя сервиса в ServiceDiscovery |
EXPORTER_DISCOVERABLE_HOST |
string | да | localhost |
Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service |
EXPORTER_DISCOVERABLE_PORT |
int | нет | Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер. | |
EXPORTER_DISCOVERABLE_LIVETIME |
duration string | нет | 2 minutes |
Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым. |
EXPORTER_DISCOVERABLE_HEALTHPASS |
string | нет | 1 minute |
Периодичность отправки health check в ServiceDiscovery |
EXPORTER_SERVICE_TITLE |
string | нет | Exporter |
Название сервиса для отображения |
EXPORTER_SERVICE_DESCRIPTION |
string | нет | Service EXPORTER |
Описание сервиса для отображения |
EXPORTER_AKKA_HTTP_CLIENT_MAXCON |
int | нет | 512 |
Максимальное число одновременных исходящих HTTP-соединений |
EXPORTER_AKKA_HTTP_CLIENT_MAXREQ |
int | нет | 1024 |
Максимальное число одновременных исходящих HTTP-запросов |
EXPORTER_AKKA_HTTP_SERVER_MAXCON |
int | нет | 1024 |
Максимальное число одновременных входящих HTTP-соединений |
EXPORTER_INTERNALCMD_ALLOW |
bool | нет | false |
Можно ли сервису отправлять внутрисистемные команды |
EXPORTER_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD |
duration string | нет | 10 minutes |
Время кэширования данных по командам из CommandDiscovery |
EXPORTER_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD |
duration string | нет | 30 seconds |
Время кэширования данных по сервисам из ServiceDiscovery |
EXPORTER_DB_HOST |
string | да | Хост БД | |
EXPORTER_DB_PORT |
int | да | Порт БД | |
EXPORTER_DB_NAME |
string | да | Имя базы в БД | |
EXPORTER_DB_URL |
jdbc url string | нет | JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы. | |
EXPORTER_DB_USER |
string | да | Пользователь БД | |
EXPORTER_DB_PASSWORD |
string | да | Пароль пользователя БД | |
EXPORTER_DB_THREADS |
int | нет | 10 |
Количество потоков в пуле потоков для соединения с БД |
EXPORTER_DB_QUEUE_SIZE |
int | нет | 300 |
Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей |
EXPORTER_DB_CONN_MAX |
int | нет | 10 |
Максимальное количество одновременных подключений к БД |
EXPORTER_DB_CONN_TIMEOUT |
duration string | нет | 20 second |
Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение. |
EXPORTER_DB_ISOLATION |
string | нет | READ_COMMITTED |
Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE. |
EXPORTER_DB_READONLY |
boolean | нет | false |
Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции. |
EXPORTER_DB_CONN_MIN |
int | нет | = DB_THREADS | Минимальное количество одновременных подключений к БД |
EXPORTER_DB_VALIDATION_TIMEOUT |
duration string | нет | 1 seconds |
Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение. |
EXPORTER_DB_IDLE_TIMEOUT |
duration string | нет | 10 minutes |
Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула. |
EXPORTER_DB_MAX_LIFETIME |
duration string | нет | 30 minutes |
Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы. |
EXPORTER_DB_INITIALIZATION_FAIL_FAST |
string | нет | false |
Deprecated, начиная с версии Slick 3.3.0. Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0. |
EXPORTER_DB_LEAK_DETECTION_THRESHOLD |
int | нет | 0 |
Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с. |
EXPORTER_DB_CONNECTION_TEST_QUERY |
string | нет | SELECT 1 |
Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid(). |
EXPORTER_DB_REGISTER_MBEANS |
boolean | нет | false |
Зарегистрированы ли JMX Management Beans («MBeans») |
EXPORTER_DB_AUTO_COMMIT |
boolean | нет | true |
Это свойство определяет то, как будут вести себя по умолчанию возвращаемые соединения относительно autocommit-а. |
EXPORTER_DB_SCHEMA |
string | нет | public |
Устанавливает schema по умолчанию |
EXPORTER_DB_ISOLATE_INTERNAL_QUERIES |
boolean | нет | false |
Определяет то, изолируются ли с помощью транзакций внутренние запросы пула(например запрос connection alive test). Свойство применяется только если autoCommit выключен. |
EXPORTER_DB_INITIALIZATION_FAIL_TIMEOUT |
int | нет | 1 |
Работает, начиная с версии Slick 3.3.0. Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Любое положительное число считается числом миллисекунд для попытки получить начальное соединение;поток приложения будет заблокирован в течение этого периода. Если соединение не может быть получено до истечения этого времени,будет брошено исключение. Данный таймаут применяется после периода connectionTimeout. Если значение равно нулю (0),HikariCP попытается получить и проверить подключение. Если соединение получено,но проверка не пройдена, будет брошено исключение, и пул не будет запущен. Однако,если соединение не может быть получено, пул запустится,но последующие попытки получить соединение могут потерпеть неудачу.Значение меньше нуля пройдет любую первоначальную попытку подключения, и пул немедленно запустится,пытаясь получить соединения в фоновом режиме.Следовательно, последующие попытки получить соединение могут потерпеть неудачу. |
EXPORTER_LOG_LEVEL |
string | нет | INFO |
Общий уровень логирования в сервисе |
EXPORTER_LOG_LEVEL_AKKA |
string | нет | INFO |
Уровень логирования для akka |
EXPORTER_LOG_LEVEL_LIQUIBASE |
string | нет | INFO |
Уровень логирования для liquibase (миграции) |
EXPORTER_LOG_LEVEL_APPLICATION |
string | нет | DEBUG |
Уровень логирования для application |
EXPORTER_LOG_LEVEL_SLICK_STATEMENT |
string | нет | DEBUG |
Уровень логирования запросов, отправляемых slick в БД |
EXPORTER_LOG_LEVEL_SLICK_BENCHMARK |
string | нет | OFF |
Уровень логирование бенчмарков выполнения запросов slick |
EXPORTER_LOG_LEVEL_KAFKA_PRODUCER |
string | нет | WARN |
Уровень логирования конфига kafka-producer |
EXPORTER_LOG_LEVEL_KAFKA_CONSUMER |
string | нет | WARN |
Уровень логирования конфига kafka-consumer |
EXPORTER_LOG_LEVEL_AKKAHTTPSENDER |
string | нет | TRACE |
Уровень логирования для отправки команд через HTTP. На уровне INFO логируется трассировка, если она включена |
EXPORTER_LOG_LEVEL_KAFKASENDER |
string | нет | TRACE |
Уровень логирования для отправки команд через Kafka. На уровне INFO логируется трассировка, если она включена |
EXPORTER_LOG_LEVEL_COMMANDSTATUSCLI |
string | нет | TRACE |
Уровень логирования для проверки состояний команд в сервисе статусов |
EXPORTER_LOG_LEVEL_TEAM_ROUTES |
string | нет | TRACE |
Уровень логирования для роутов /team |
EXPORTER_REPORT_BUCKET |
string | да | exporter |
Название ведра для отчётов экспорта в S3-подобном файлом хранилище |
EXPORTER_REPORT_PATH |
string | да | report |
Префикс для названия отчётов экспорта в S3-подобном файлом хранилище (выступает в роли поддиректории в ведре S3) |
EXPORTER_EXPORT_BUCKET |
string | да | exporter |
Название ведра для пользовательских файлов экспорта в S3-подобном файлом хранилище |
EXPORTER_EXPORT_PATH |
string | да | export |
Префикс для названия пользовательских файлов экспорта в S3-подобном файлом хранилище (выступает в роли поддиректории в ведре S3) |
EXPORTER_FILL_WARNINGS |
boolean | да | false |
Флаг для включения возможности добавлять предупреждения при получении данных для экспорта в модель данных |
EXPORTER_JOURNAL_MODE |
string | нет | WriteToJournal |
Режим журналирования Nestor. Допустимые значения: WriteToJournal (Отправка в сервис журналирования), WriteToTopic (Отправка события в очередь) |
EXPORTER_JOURNAL_TOPIC |
string | да, если переменная EXPORTER_JOURNAL_MODE = WriteToTopic |
"" | Название очереди журналирования. Для режима WriteToJournal значение игнорируется. |
EXPORTER_RICH_LIST_OBJECTS_PAGING_COUNT |
int | нет | 10000 |
Количество строк в одной странице ответа richListObjects из datamodel |
EXPORTER_EXPORT_ADDRESS |
string | да | http://localhost:{app.http.port} |
Адрес обращения к datamodel для конструирования гиперссылки |
Список команд сервиса Exporter
Список реализованных в сервисе команд, моделей EntityType и действий Actions, которые можно использовать при настройке авторизации.
| Название команды | EntityType | Actions |
|---|---|---|
| Список всех заданий экспорта | ExportProcess |
ListExportProcess |
| Получить задание экспорта по ID | ExportProcess |
GetExportProcess |
| Создать задание экспорта | ExportProcess |
CreateExportProcess |
| Отредактировать задание экспорта | ExportProcess |
UpdateExportProcess |
| Удалить задание экспорта | ExportProcess |
DeleteExportProcess |
| Запуск процесса экспорта данных | ExportProcess |
ExecuteExportProcess |
| Остановка процесса экспорта данных | ExportProcess |
ExecuteExportProcess |
| Получить прогресс процесса экспорта данных | ExportProcess |
GetExportProgress |
| Создание и запуск процесса экспорта данных | ExportProcess |
CreateExportProcess, ExecuteExportProcess |
| Список всех шаблонов заданий экспорта | ExportTemplate |
ListExportTemplate |
| Получить щаблон задания экспорта по ID | ExportTemplate |
GetExportTemplate |
| Создать шаблон задания экспорта | ExportTemplate |
CreateExportTemplate |
| Отредактировать шаблон задания экспорта | ExportTemplate |
UpdateExportTemplate |
| Удалить шаблон задания экспорта | ExportTemplate |
DeleteExportTemplate |
В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.
ListExportProcess
Payload для команды
{
"query": "",
"context": {},
"sorting": {
"fieldName": "entityType",
"order": "desc"
},
"paging": {
"page": 1,
"count": 10
}
}
Результат выполнения команды
{
"items": [
{
"id": "b251c2e5-e12c-4792-b6f4-6578bfd4d6cd",
"entityType": "abc",
"status": "DRAFT",
"exportConfig": {
"title": "Sample Project Title"
},
"exportFile": "some file",
"resultFile": null,
"info": {},
"created": 1723809067603,
"createdBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"modified": 1723809067603,
"modifiedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"executed": null,
"executedBy": null,
"version": 1
}
],
"total": 1
}
Возвращает список всех задач экспорта.
Поддерживается только синхронный вызов.
- На входе: Option[Search]
- На выходе: Page[ExportProcess]
| Команда | Путь |
|---|---|
exporter_ListExportProcess |
HTTP POST /v1/exportProcess/exporter_ListExportProcess |
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
id |
InSetQuery |
entityType |
InSetQuery, LikeQuery, TsQuery |
status |
InSetQuery |
created |
RangeQuery |
createdBy |
InSetQuery |
modified |
RangeQuery |
modifiedBy |
InSetQuery |
executed |
RangeQuery |
executedBy |
InSetQuery |
Доступные поля для сортировки:
| Поле |
|---|
entityType |
status |
created |
modified |
executed |
GetExportProcess
Payload для команды
"f283aac5-88e0-43b5-8dab-56c22d91acc7"
Результат выполнения команды
{
"id": "b251c2e5-e12c-4792-b6f4-6578bfd4d6cd",
"entityType": "abc",
"status": "DRAFT",
"exportConfig": {
"title": "Sample Project Title"
},
"exportFile": "some file",
"resultFile": null,
"info": {},
"created": 1723809067603,
"createdBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"modified": 1723809067603,
"modifiedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"executed": null,
"executedBy": null,
"version": 1
}
Поиск задачи экспорта с заданным идентификатором.
Поддерживается только синхронный вызов.
- На входе: ExportProcessId (UUID)
- На выходе: ExportProcess
| Команда | Путь |
|---|---|
exporter_GetExportProcess |
HTTP POST /v1/exportProcess/exporter_GetExportProcess |
CreateExportProcess
Payload для команды
{
"entityType": "abc",
"exportConfig": {
"title": "Sample Project Title"
},
"exportFile": "some file",
"exportFileName": "export"
}
Результат выполнения команды
"f283aac5-88e0-43b5-8dab-56c22d91acc7"
Добавляет новую задачу экспорта с заданными параметрами.
exportFileName - поле, указывающее название файла. Если оно указано, так и запишется в таблицу ExportProcess. Если не указано - попытается взять из таблицы ExportTemplate по переданному exportTemplateId. Иначе поле будет пустое и файл будет иметь дефолтное название.
Отправляет событие о создании задачи экспорта.
Поддерживается асинхронный и синхронный вызов.
- На входе: ExportProcessCreateDto
- На выходе: ExportProcessId (UUID)
| Команда | Путь |
|---|---|
exporter_CreateExportProcess |
- |
UpdateExportProcess
Payload для команды
{
"id": "f283aac5-88e0-43b5-8dab-56c22d91acc7",
"entityType": "abc",
"exportConfig": {
"startRow": 3,
"columnMapping": [
{
"property": "title",
"columnLabel": "A"
}
]
},
"exportFile": "bucket/file_id",
"version": 1
}
Результат выполнения команды
true
Обновляет данные задачи экспорта. Отправляет событие об обновлении задачи экспорта.
Поддерживается асинхронный и синхронный вызов.
- На входе: ExportProcessUpdateDto
- На выходе: Boolean
| Команда | Путь |
|---|---|
exporter_UpdateExportProcess |
- |
DeleteExportProcess
Payload для команды
"f283aac5-88e0-43b5-8dab-56c22d91acc7"
Результат выполнения команды
true
Удаляет задачу экспорта с заданным идентификатором. Отправляет событие об удалении задачи экспорта.
Поддерживается асинхронный и синхронный вызов.
- На входе: ExportProcessId (UUID)
- На выходе: Boolean
| Команда | Путь |
|---|---|
exporter_DeleteExportProcess |
- |
ExecuteExportProcess
Payload для команды
"f283aac5-88e0-43b5-8dab-56c22d91acc7"
Результат выполнения команды
true
Запускает задачу экспорта с заданным идентификатором. Отправляет событие о результатах выполнения задачи экспорта.
Поддерживается асинхронный и синхронный вызов.
- На входе: ExportProcessId (UUID)
- На выходе: Boolean
| Команда | Путь |
|---|---|
exporter_ExecuteExportProcess |
- |
CancelExportProcess
Payload для команды
"f283aac5-88e0-43b5-8dab-56c22d91acc7"
Результат выполнения команды
true
Останавливает запущенную задачу экспорта с заданным идентификатором.
Поддерживается асинхронный и синхронный вызов.
- На входе: ExportProcessId (UUID)
- На выходе: Boolean
| Команда | Путь |
|---|---|
exporter_CancelExportProcess |
- |
GetExportProgress
Payload для команды
{
"id": "b251c2e5-e12c-4792-b6f4-6578bfd4d6cd"
}
Результат выполнения команды
{
"b251c2e5-e12c-4792-b6f4-6578bfd4d6cd": {
"estimateTime": "PT12H54M5.02S",
"percent": 0.3368487274760384,
"stats": [
{
"name": "?",
"processed": {
"succeed": 0,
"skipped": 1723,
"total": 1723
},
"errors": 0
}
]
}
}
Прогресс задач экспорта. Можно отфильтровать по идентификатору конкретной задачи. Поддерживается только синхронный вызов.
- На входе: GetExportProgressDto
- На выходе: Map[ExportProcessId, [EstimateProgressStats]]
| Команда | Путь |
|---|---|
| exporter_GetExportProgress | - |
CreateAndExecuteExportProcess
CreateAndExecuteExportProcessViaHttp
Payload для команд
{
"entityType": "Tag",
"exportConfig": {
"columnMapping": [
{
"columnLabel": "C",
"columnHeader": "Заголовок",
"attributePath": [
{
"fieldCode": "title",
"fieldType": "string"
}
]
},
{
"columnLabel": "A",
"columnHeader": "Код",
"attributePath": [
{
"fieldCode": "code",
"fieldType": "string"
}
]
},
{
"columnLabel": "D",
"columnHeader": "Диаметр",
"attributePath": [
{
"fieldCode": "diametr",
"fieldType": "number"
}
]
},
{
"columnLabel": "E",
"columnHeader": "subType",
"attributePath": [
{
"fieldCode": "subType",
"fieldType": "catalogItem",
"catalogCode": "TagSubType"
},
{
"fieldCode": "tagTypeTitle",
"fieldType": "string"
}
]
},
{
"columnLabel": "F",
"columnHeader": "complex code",
"attributePath": [
{
"fieldCode": "complex",
"fieldType": "entityObject",
"entityType": "complex"
},
{
"fieldCode": "code",
"fieldType": "string"
}
]
},
{
"columnLabel": "G",
"columnHeader": "complex title",
"attributePath": [
{
"fieldCode": "complex",
"fieldType": "entityObject",
"entityType": "complex"
},
{
"fieldCode": "title",
"fieldType": "string"
}
]
}
]
},
"search": {
"query": "",
"context": {
}
},
"hierarchy": [],
"exportFileName": "export"
}
Результат выполнения команд
"f283aac5-88e0-43b5-8dab-56c22d91acc7"
Добавляет новую задачу экспорта с заданными параметрами, а затем ее запускает.
Реализованно через последовательное выполнение команд CreateExportProcess и ExecuteExportProcess.
exporter_CreateAndExecuteExportProcess: Поддерживается асинхронный и синхронный вызов.
exporter_http_CreateAndExecuteExportProcess: Поддерживается синхронный вызов.
- На входе: ExportProcessCreateDto
- На выходе: ExportProcessId (UUID)
| Команда | Путь |
|---|---|
exporter_CreateAndExecuteExportProcess |
- |
exporter_http_CreateAndExecuteExportProcess |
HTTP POST /v1/exportProcess/exporter_http_CreateAndExecuteExportProcess |
ListExportTemplate
Payload для команды
{
"query": "",
"context": {},
"sorting": {
"fieldName": "entityType",
"order": "desc"
},
"paging": {
"page": 1,
"count": 10
}
}
Результат выполнения команды
{
"items": [
{
"id": "b251c2e5-e12c-4792-b6f4-6578bfd4d6cd",
"entityType": "abc",
"title": "Наименование шаблона",
"description": "Описание которое на которое никто не смотрит",
"exportConfig": {
"title": "Sample Project Title"
},
"created": 1723809067603,
"createdBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"modified": 1723809067603,
"modifiedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"version": 1
}
],
"total": 1
}
Возвращает список всех шаблонов экспорта.
Поддерживается только синхронный вызов.
- На входе: Option[Search]
- На выходе: Page[ExportTemplate]
| Команда | Путь |
|---|---|
exporter_ListExportTemplate |
HTTP POST /v1/exportTemplate/exporter_ListExportTemplate |
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
id |
InSetQuery |
entityType |
InSetQuery, LikeQuery, TsQuery |
createdBy |
InSetQuery |
title |
LikeQuery |
description |
LikeQuery |
Доступные поля для сортировки:
| Поле |
|---|
entityType |
created |
modified |
GetExportTemplate
Payload для команды
"b251c2e5-e12c-4792-b6f4-6578bfd4d6cd"
Результат выполнения команды
{
"id": "b251c2e5-e12c-4792-b6f4-6578bfd4d6cd",
"entityType": "abc",
"title": "Наименование шаблона",
"description": "Описание которое на которое никто не смотрит",
"exportConfig": {
"title": "Sample Project Title"
},
"created": 1723809067603,
"createdBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"modified": 1723809067603,
"modifiedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"version": 1
}
Поиск задачи экспорта с заданным идентификатором.
Поддерживается только синхронный вызов.
- На входе: ExportTemplateId (UUID)
- На выходе: ExportTemplate
| Команда | Путь |
|---|---|
exporter_GetExportTemplate |
HTTP POST /v1/exportTemplate/exporter_GetExportTemplate |
CreateExportTemplate
Payload для команды
{
"entityType": "abc",
"title": "Шаблон всего",
"description": "Описание шаблона на которое никто не смотрит",
"exportConfig": {
"title": "Sample Project Title"
}
}
Результат выполнения команды
"f283aac5-88e0-43b5-8dab-56c22d91acc7"
Добавляет новый шаблон экспорта с заданными параметрами. Отправляет событие о создании шаблона экспорта.
Поддерживается асинхронный и синхронный вызов.
- На входе: ExportTemplateCreateDto
- На выходе: ExportTemplateId (UUID)
| Команда | Путь |
|---|---|
exporter_CreateExportTemplate |
- |
UpdateExportTemplate
Payload для команды
{
"id": "f283aac5-88e0-43b5-8dab-56c22d91acc7",
"entityType": "abc",
"title": "Шаблон всего",
"description": "Описание шаблона на которое никто не смотрит",
"exportConfig": {
"startRow": 3,
"columnMapping": [
{
"property": "title",
"columnLabel": "A"
}
]
},
"version": 1
}
Результат выполнения команды
true
Обновляет данные шаблона экспорта. Отправляет событие об обновлении шаблона экспорта.
Поддерживается асинхронный и синхронный вызов.
- На входе: ExportTemplateUpdateDto
- На выходе: Boolean
| Команда | Путь |
|---|---|
exporter_UpdateExportTemplate |
- |
DeleteExportTemplate
Payload для команды
"f283aac5-88e0-43b5-8dab-56c22d91acc7"
Результат выполнения команды
true
Удаляет шаблон экспорта с заданным идентификатором. Отправляет событие об удалении шаблона экспорта.
Поддерживается асинхронный и синхронный вызов.
- На входе: ExportTemplateId (UUID)
- На выходе: Boolean
| Команда | Путь |
|---|---|
exporter_DeleteExportTemplate |
- |
Модели сервиса Exporter
ExportProcessCreateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
entityType |
EntityTypeId (String) | Да | Тип экспортируемой сущности |
exportTemplateId |
ExportTemplateId (UUID) | Нет | Уникальный идентификатор шаблона |
exportConfig |
ExportConfig | Нет | Конфигурация экспорта |
search |
Search | Нет | Параметры поиска для выбора элементов |
hierarchyId |
HierarchyId (UUID) | Нет | Уникальный идентификатор иерархии |
hierarchy |
Json (Object) | Нет | Параметры иерархической структуры выгрузки файлов |
processFileFields |
Boolean | Да | Флаг при снятии которого процесс выгрузки не должен выгружать связанные файлы, даже если в конфиге указано поле с файлом |
processHierarchy |
Boolean | Да | Флаг при снятии которого процесс выгрузки не должен выгружать файлы в иерархическом порядке, даже если прокинута иерархия |
preserveEmptyFolders |
Boolean | Да | Флаг, указывающий на то надо ли добавлять в иерархию пустые папки (без выгружаемых файлов) |
exportFileName |
String | Нет | Имя создаваемого файла |
ExportProcessUpdateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
ExportProcessId (UUID) | Да | Уникальный идентификатор задачи |
entityType |
EntityTypeId (String) | Да | Тип экспортируемой сущности |
exportConfig |
ExportConfig | Да | Конфигурация экспорта |
exportFileName |
String | Нет | Имя создаваемого файла |
search |
Search | Нет | Параметры поиска для выбора элементов |
hierarchy |
Json (Object) | Нет | Параметры иерархической структуры выгрузки файлов |
version |
Int | Да | Индекс оптимистической блокировки |
ExportProcess
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
ExportProcessId (UUID) | Да | Уникальный идентификатор задачи |
entityType |
EntityTypeId (String) | Да | Тип экспортируемой сущности |
status |
ExportProcessStatus (String) | Да | Состояние задачи (DRAFT, IN PROGRESS, IN PROGRESS ARCHIVE, SUCCESS, ERROR, CANCELED) |
exportConfig |
ExportConfig | Да | Конфигурация экспорта |
exportFile |
ExportFileInformation[] | Да | URI и имя файла |
info |
ExportInfo | Да | Статистика по экспорту (summary) |
search |
Search | Нет | Параметры поиска для выбора элементов |
hierarchy |
Json (Object) | Нет | Параметры иерархической структуры выгрузки файлов |
processFileFields |
Boolean | Да | Флаг при снятии которого процесс выгрузки не должен выгружать связанные файлы, даже если в конфиге указано поле с файлом |
processHierarchy |
Boolean | Да | Флаг при снятии которого процесс выгрузки не должен выгружать файлы в иерархическом порядке, даже если прокинута иерархия |
preserveEmptyFolders |
Boolean | Да | Флаг, указывающий на то надо ли добавлять в иерархию пустые папки (без выгружаемых файлов) |
exportFileName |
String | Нет | Имя создаваемого файла |
created |
Timestamp (Long) | Да | Дата создания записи |
createdBy |
UserId (UUID) | Да | ID пользователя создавшего запись |
modified |
Timestamp (Long) | Да | Дата изменения записи |
modifiedBy |
UserId (UUID) | Да | ID пользователя изменившего запись |
executed |
Timestamp (Long) | Нет | Дата запуска экспорта |
executedBy |
UserId (UUID) | Нет | ID пользователя запустившего экспорт |
version |
Int | Да | Индекс оптимистической блокировки |
ExportTemplateCreateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
entityType |
EntityTypeId (String) | Да | Тип экспортируемой сущности |
title |
Title (String) | Да | Наименование шаблона |
description |
String | Нет | Описание шаблона |
exportConfig |
ExportConfig | Да | Конфигурация экспорта |
exportFileName |
String | Нет | Имя создаваемого файла |
ExportTemplateUpdateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
ExportTemplateId (UUID) | Да | Уникальный идентификатор шаблона |
entityType |
EntityTypeId (String) | Да | Тип экспортируемой сущности |
title |
Title (String) | Да | Наименование шаблона |
description |
String | Нет | Описание шаблона |
exportConfig |
ExportConfig | Да | Конфигурация экспорта |
exportFileName |
String | Нет | Имя создаваемого файла |
version |
Int | Да | Индекс оптимистической блокировки |
ExportTemplate
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
ExportTemplateId (UUID) | Да | Уникальный идентификатор шаблона |
entityType |
EntityTypeId (String) | Да | Тип экспортируемой сущности |
title |
Title (String) | Да | Наименование шаблона |
description |
String | Нет | Описание шаблона |
exportConfig |
ExportConfig | Да | Конфигурация экспорта |
created |
Timestamp (Long) | Да | Дата создания записи |
createdBy |
UserId (UUID) | Да | ID пользователя создавшего запись |
modified |
Timestamp (Long) | Да | Дата изменения записи |
modifiedBy |
UserId (UUID) | Да | ID пользователя изменившего запись |
version |
Int | Да | Индекс оптимистической блокировки |
ExportConfig
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
columnMapping |
ColumnMapping[] | Да | Информация о сопоставлении столбцов из файла и данных сущности |
ColumnMapping
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
columnLabel |
String | Да | Наименование колонки для экспорта данных |
columnHeader |
String | Да | Название колонки |
attributePath |
FieldAttribute[] | Да | Описание пути для получения данных поля |
FieldAttribute
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
fieldType |
String | Да | Тип ожидаемых данных (допустимые значения: string, number, entityObject, catalogItem, file) |
fieldCode |
String | Да | Поле из которого берутся данные |
entityType |
String | Нет | Тип сущности по которое происходит переход для типа данных entityObject |
catalogCode |
String | Нет | Каталог по которому происходит переход для типа данных catalogItem |
ExportFileInformation
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
fileName |
String | Да | Имя файла загруженного для экспорта |
url |
String | Да | URI файла экспорта (стандартная FS загрузка) |
ExportInfo
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
progress |
ProgressInfo | Да | Статистика процесса обработки |
error |
String | Нет | Ошибка, если был неуспешный запуск |
warnings |
List[(Int, String)] | Нет | Предупреждения загрузки данных |
ProgressInfo
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
percent |
Double | Да | Процент выполненного прогресса загрузки (от 0.0 до 100.0) |
progress |
Int | Нет | Кол-во выполненных шагов |
total |
Int | Нет | Общее кол-во шагов |
GetExportProgressDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | ExportProcessId (UUID) | Нет | Получить статистику только для указанной задачи |
EstimateProgressStats
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| estimateTime | Duration ISO8601 | Да | Время до конца в таком формате PT12H54M5.02S |
| percent | Double | Да | Процент выполнения (уже рассчитанные цифры из stats) |
| stats | SheetExportTotalStatistic[] | Да | Числа статистики по листам |
SheetExportTotalStatistic
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| name | String | Да | Название листа |
| processed | StatFraction | Да | Количество обработанных строк |
| errors | Int | Да | Количество ошибок |
StatFraction
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| succeed | Int | Да | Успешно обработано |
| skipped | Int | Нет | Пропущено |
| total | Int | Да | Всего операций |
Сервис полнотекстового поиска - ПП
В сервисе реализованы следующие команды
- Индексация объекта
- Получение правила индексации
- Получение правила индексации (v2)
- Создание правила индексации
- Создание правила индексации (v2)
- Обновление правила индексации
- Обновление правила индексации (v2)
- Удаление правила индексации
- Список всех правил индексации
- Список всех правил индексации (v2)
- Полнотекстовый поиск (v1)
- Полнотекстовый поиск (v2)
- Полнотекстовый поиск (v3)
- Полнотекстовый поиск для графа (v1)
- Полнотекстовый поиск для графа (v2)
- Поиск по идентификаторам (LAMP, v1)
- Поиск по plagiarism (LAMP, v1)
- Поиск по similarity (LAMP, v2)
- Поиск по plagiarism (LAMP, v2)
- Список всех ES анализаторов
- Автодополнение поисковой строки
- Индексация фраз в индексе для автодополнений
- Агрегированный полнотекстовый поиск
- Полнотекстовый поиск внутри родительского документа
- Агрегация документов (внутренняя команда)
Общее описание архитектуры сервиса ПП
Сервис делает доступными для полнотекстового поиска объекты сервиса модели данных. Для каждого типа объектов должно существовать правило индексации в ES. Все поля объекта разделяются на 3 категории:
- поля для фасетного поиска
- поля для полнотекстового поиска
- поля для отображения Сервис обеспечивает полнотекстовый и фасетный поиск
Конфигурирование сервиса ПП
Требования к запуску сервиса ПП
Запуск сервиса осуществляется локально через sbt, на стенде в docker на jvm. Для корректной минимальной работы сервиса требуется обязательное подключение к Kafka, Consul, ElasticSearch. Для нормальной работы сервису дополнительно требуется окружение Verdi: CommandStatus и ApiGateway.
Список переменных окружения сервиса ПП
| Переменная | Тип | Обязательная | Значение по умолчанию | Описание |
|---|---|---|---|---|
| SERVER_PORT | int | нет | 8080 | Порт, на котором слушает HTTP-сервер |
| SERVER_AUTHORIZER_KIND | string | нет | "authzforce" | Вид авторизатора, который используется в сервисе. Допустимые значения: "authzforce", "oberto". При указании неизвестного значения будет использовано значение по-умолчанию. |
| CONSUMER_INDEXATION_TOPIC | string | нет | document | Название кафка-топика для команд индексации объектов |
| CONSUMER_EVENT_TOPIC | string | нет | entityObjectEvent | Название кафка-топика для ожидания событий по объектам. ОБЯЗАТЕЛЬНО должно соответствовать названиям в сервисе моделей данных и в сервисе индексаций |
| CONSUMER_COMPLETION_TOPIC | string | нет | completion | Название кафка-топика для команд работы с индексом автодополнений |
| CONSUMER_GROUP | string | нет | document | Имя группы-консьюмеров сервиса ПП |
| ELASTIC_HOST | string | да | localhost | Адрес ES |
| ELASTIC_PORT | int | да | 9200 | Порт ES |
| ELASTIC_USER | string | нет | "" | Пользователь Elasticsearch для basic-аутентификации |
| ELASTIC_PASSWORD | string | нет | "" | Пароль пользователя Elasticsearch для basic-аутентификации |
| ELASTIC_USE_SSL | boolean | нет | false | Использовать ssl при подключении к Elasticsearch. Если используется корректный сертификат, подписанный УЦ, тогда одного этого флага должно хватить для настройки ssl. Если используется самоподписанный сертификат, тогда нужно добавить корневые сертификаты в ELASTIC_TRUST_STORE_LOCATION |
| ELASTIC_TRUST_STORE_TYPE | string | нет | pem | Тип хранилища сертификата. Настраивается при подключении к Elasticsearch через ssl с использованием самоподписанного сертификата. Пока поддерживается только pem. |
| ELASTIC_TRUST_STORE_LOCATION | string | нет | "" | Место хранения сертификата. Используется для самоподписанных сертификатов при подключении через ssl. |
| ELASTIC_TRUST_STORE_PASSWORD | string | нет | "" | Пароль от сертификата и/или ключа. Используется для самоподписанных сертификатов при подключении через ssl. В текущей реализации с pem-сертификатами не используется. |
| ELASTIC_SCROLL_BATCH_SIZE | int | нет | 100 | Количество записей из индекса эластика, запрашиваемое постранично. |
| ELASTIC_ELASTIC_SCROLL_DURATION | duration string | нет | 30 seconds | Время ожидания во время постраничного запроса записей из эластика. |
| VERDI_CONSUL | string | да | http://localhost:8500 | Адрес Consul |
| VERDI_CONSUL_AUTH_USER | string | нет | "" | Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены. |
| VERDI_CONSUL_AUTH_PASSWORD | string | нет | "" | Пароль учетной записи Сonsul. |
| VERDI_KAFKA_ADDRESS | string | да | localhost:9092 | Адрес брокера Kafka. |
| VERDI_KAFKA_TOPIC | string | нет | "commandevents" | Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд. |
| VERDI_KAFKA_AUTH_USER | string | нет | "" | Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены. |
| VERDI_KAFKA_AUTH_PASSWORD | string | нет | "" | Пароль учетной записи Kafka. |
| VERDI_KAFKA_AUTH_PRINCIPAL | string | нет | "" | Principal учетной записи Kafka в Kerberos(в случае соединения с kafka через Kerberos). |
| VERDI_KAFKA_AUTH_KEYTAB_PATH | string | нет | "" | Путь до keytab-файла(в случае соединения с kafka через Kerberos). |
| VERDI_KAFKA_AUTH_TRUSTSTORE_LOCATION | string | нет | "" | Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применяться не будет. |
| VERDI_KAFKA_AUTH_TRUSTSTORE_PASSWORD | string | нет | "" | Пароль к хранилищу сертификатов. |
| VERDI_KAFKA_AUTH_MODE | string | нет | "" | Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса |
| VERDI_KAFKA_AUTH_CONFIG | string | нет | "" | Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig]. Переменная соответствует полю authConfig из KafkaAuthSettings. |
| VERDI_KAFKA_AUTH_CACHE_SIZE | int | нет | Максимальный размер кеша для Kafka producer (количество активных соединений). | |
| VERDI_KAFKA_AUTH_CACHE_TTL | duration string | нет | Время жизни Kafka producer в кеше. | |
| VERDI_KAFKA_CONNECTION_CHECK_TEST_MESSAGES_INTERVAL | duration string | нет | 4 minutes | Применяется только для producer-ов со способом аутентификации kerberos. Интервал отправки тестовых сообщений кафки в топик connectionCheck.testMessagesTopicName. Тестовые сообщения (null, service producer test) отправляются регулярно с этим интервалом. |
| VERDI_KAFKA_CONNECTION_CHECK_INTERVAL | duration string | нет | 60 seconds | Применяется только для producer-ов со способом аутентификации kerberos. Интервал проверки того, сколько тестовых сообщений было отправлено за данный период. Если количество сообщений за этот период равно количеству сообщений за прошлый период, то начинается отсчет периода без сообщений. |
| VERDI_KAFKA_CONNECTION_CHECK_FAILED_AFTER_INTERVAL | duration string | нет | 5 minutes | Применяется только для producer-ов со способом аутентификации kerberos. Максимальная продолжительность периода без успешно отправленных тестовых сообщений. По ее достижении сервис будет объявлен больным. |
| VERDI_KAFKA_PRODUCER_PROPS | string | нет | "max.request.size=1048576" | Дополнительные параметры для Kafka producer. Заполняются по шаблону "key1=value1;key2=value2". |
| VERDI_HOST | string | да | localhost | Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service |
| VERDI_TTL | duration string | нет | 30 seconds | Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым. |
| VERDI_HEALTH_CHECK | duration string | нет | 10 seconds | Периодичность отправки health check в ServiceDiscovery |
| VERDI_COMMAND_STORAGE_UPDATE_PERIOD | duration string | нет | 1 minutes | Время кэширования данных по командам из CommandDiscovery |
| VERDI_SERVICE_DISCOVERY_UPDATE_PERIOD | duration string | нет | 30 seconds | Время кэширования данных по сервисам из ServiceDiscovery |
| VERDI_ALLOW_INTERNAL_COMMANDS | bool | нет | true | Можно ли сервису отправлять внутрисистемные команды |
| VERDI_CONSUL_CONNECTION_MAX_RETRY | int | нет | 5 | Максимальное количество попыток подключений к Consul |
| VERDI_CONSUL_CONNECTION_RETRY_DELAY | duration string | нет | 1 seconds | Таймаут между неудачными попытками подключения к Consul |
| AUTOCOMPLETE_SIZE | int | нет | 10 | Максимальное количество выдаваемых подсказок для автодополнения поисковой строки |
| AUTOCOMPLETE_FUZZINESS | string | нет | AUTO | На сколько искомая строка для автодополнения может отличаться от выдаваемых подсказок. Допустимые значения: AUTO, 0, 1 или 2. Значение AUTO подбирает количество опечаток под длину исправляемой строки: 0-2 символа - без опечаток, 3-5 символов - 1 опечатка, >5 символов - 2 опечатки. |
| FTS_READABLE_NAME | string | нет | AUTO | Читаемое название сервиса |
| FTS_DESCRIPTION | string | нет | AUTO | Читаемое описание сервиса |
| FTS_AUTHZFORCE_ADDR | url string | нет | http://localhost:8080/authzforce-ce | Адрес сервиса authzforce |
| FTS_AUTHZFORCE_DOMAIN | string | нет | "" | Доступный DomainID в Authzforce server |
| FTS_AUTHZFORCE_CONNECT_TIMEOUT | duration string | нет | 5 seconds | Максимальное время ожидания ответа от Authzforce |
| DM_SCHEMA_CACHE_SIZE | int | нет | 128 | Максимальный размер кэша для json schema |
| DM_SCHEMA_CACHE_TTL | duration string | нет | 5 minutes | Время жизни элементов в кэше для json schema |
| FS_URI | url string | нет | http://localhost:9002 | Адрес S3 файлового хранилища minio |
| FS_ACCESS_KEY_ID | string | нет | admin | Идентификатор доступа к minio |
| FS_SECRET_ACCESS_KEY | string | нет | admin | Секретный ключ доступа к minio |
| FS_UPLOAD_PARALLELISM | int | нет | 1 | Параллелизм загрузки файлов в minio |
| FS_AUTH_MODE | string | нет | static | Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса |
| FS_AUTH_CONFIG | string | нет | "" | Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[FSBucketConfig] соответствует полю authConfig FSConfigRep |
| FS_CACHE_SIZE | int | нет | 1 | Максимальный размер кеша клиентов для хранилища файлов (количество активных соединений). |
| FS_CACHE_TTL | duration string | нет | Время жизни клиента в кеше | |
| FS_RETRY_ATTEMPTS | int | нет | 5 | Количество ретраев, которое будет произведено в случае Exception-а в операции FSClient-а и при вычитывании стрима в get операциях FSClient-а. |
| FS_RETRY_DELAY | duration string | нет | 10 millis | Задержка между ретраями операций FSClient-а. |
| VERDI_COMMANDS_HTTP_RETRY_ATTEMPTS | int | нет | 5 | Поле attempts из RetrySettings |
| VERDI_COMMANDS_HTTP_RETRY_DELAY | duration string | нет | "5 seconds" | Поле delay из RetrySettings |
| VERDI_COMMANDS_HTTP_RETRY_KIND | string | нет | "OnSomeExceptions(ConnectException)" | CommandResultRetryConditionKind |
| FTS_DEFAULT_MAPPING_VERSION | int | нет | 1 | Индексация новых объектов по правилам Mapping(если = 1) или MappingV2(если = 2) |
| FTS_PLUGIN_CONSUMER_TOPIC | string | Нет | ftsPlugin | Основной топик плагина, в который поступает StepProgress на обработку |
| FTS_PLUGIN_PROGRESS_TOPIC | string | Нет | progress | Топик, в который плагин пишет об окончании обработки |
| FTS_PLUGIN_CONSUMER_GROUP | string | Нет | fts_plugin_consumer_group | Имя группы-консьюмеров плагина индексации документов |
| FTS_PLUGIN_CONSUMER_TOPIC_PARTITIONS | int | Нет | 10 | Число читаемых партиций из кафка-топика команд |
| FTS_PLUGIN_INFO_READABLE_NAME | string | Нет | Плагин для индексации текста документа | Значение в поле name у тех. константы плагина |
| FTS_PLUGIN_INFO_DESCRIPTION | string | Нет | Передает тесты документов в indexation-service | Значение в поле description у тех. константы плагина |
| FTS_PLUGIN_INFO_VERSION | int | Нет | 1 | Значение в поле serviceVersion у тех. константы плагина |
Команды для сервиса full-text-search
Список реализованных в сервисе команд, моделей EntityType и действий Actions, которые можно использовать при настройке авторизации.
| Название команды | EntityType | Actions |
|---|---|---|
| fullTextSearchIndexDocument | - | - |
| createMappingFullTextSearch | System | full-text-search_System_CreateMappingFullTextSearch |
| createMappingFullTextSearchV2 | System | full-text-search_System_CreateMappingFullTextSearch |
| updateMappingFullTextSearch | System | full-text-search_System_UpdateMappingFullTextSearch |
| updateMappingFullTextSearchV2 | System | full-text-search_System_UpdateMappingFullTextSearch |
| getMappingFullTextSearch | System | full-text-search_System_GetMappingFullTextSearch |
| getMappingFullTextSearchV2 | System | full-text-search_System_GetMappingFullTextSearch |
| deleteMappingFullTextSearch | System | full-text-search_System_DeleteMappingFullTextSearch |
| listMappingFullTextSearch | System | full-text-search_System_ListMappingFullTextSearch |
| fullTextSearchDSLV2 | Произвольный EntityType | full-text-search_RequestDependent_FullTextSearchDSLV2 |
| fullTextSearchDSLV3 | Произвольный EntityType | full-text-search_RequestDependent_FullTextSearchDSL |
| fullTextSearchDSLGraphV2 | Произвольный EntityType | full-text-search_RequestDependent_FullTextSearchDSLGraphV2 |
| identificationSearch | Произвольный EntityType | full-text-search_RequestDependent_IdentificationSearch |
| plagiarismSearch | Произвольный EntityType | full-text-search_RequestDependent_PlagiarismSearch |
| similaritySearchV2 | Произвольный EntityType | full-text-search_RequestDependent_SimilaritySearch ИЛИ full-text-search_RequestDependent_IdentificationSearch (action для первой версии) |
| plagiarismSearchV2 | Произвольный EntityType | full-text-search_RequestDependent_PlagiarismSearch |
| fullTextSearchAnalyzers | System | full-text-search_System_FullTextSearchAnalyzers |
| fullTextAutocomplete | Произвольный EntityType | full-text-search_RequestDependent_FullTextAutocomplete |
| fullTextSearchIndexCompletionPhrase | - | - |
| fullTextAggregationSearch | Произвольный EntityType | full-text-search_RequestDependent_FullTextAggregationSearch |
| searchByParent | Произвольный EntityType | full-text-search_RequestDependent_SearchByParent |
fullTextSearchIndexDocument
Индексация объекта
На входе объект и связанные файлы
{
"entityObject": {
"id": "62b5b85f-5962-407d-89f1-adbdb49cca85",
"entityType": "Document",
"title": "Документ",
"source": "test",
"created": 1674060753,
"modified": 1674060753,
"data": {
"content": "someContent",
"title": "someTitle",
"author": "someAuthor",
"city": "someCity"
},
"additionalData": {
"extracted": "someAdditionalContent"
},
"version": 1,
"removed": false
},
"files": {
"file1": [
"/temp/55497df9-bf03-4364-bada-881bbd5531f8"
]
}
}
Команда не возвращает никаких данных после выполнения
Поддерживается асинхронный и синхронный вызов.
- На входе: EntityWithFiles
- Команда не возвращает данных
getMappingFullTextSearch
Получение правила индексации
На входе идентификатор правила, по сути тип объекта
"Document"
В результате описания индексации
{
"entityType": "Document",
"fullText": [
{
"name": "content"
},
{
"name": "title"
}
],
"stringFacets": [
"author",
"city"
],
"numberFacets": [],
"seqNo": 31,
"primaryTerm": 1
}
Поддерживается только синхронный вызов. При пустом entityType в теле вернет Bad Request
- На входе: String
- На выходе: Mapping
getMappingFullTextSearchV2
Получение правила индексации (вер. 2)
На входе идентификатор правила, по сути тип объекта
"Document"
В результате описания индексации
{
"entityType": "Document",
"fullText": [
{
"name": "documents",
"analyzer": "russian",
"boost": null,
"isNestedFile": true
},
{
"name": "name",
"analyzer": "russian",
"boost": 0.8,
"isNestedFile": false
}
],
"sorts": [
{
"field": "isActual",
"isDefault": true,
"sortingType": "string"
}
],
"stringFacets": [
"author",
"city"
],
"numberFacets": [],
"booleanFacets": [],
"seqNo": 31,
"primaryTerm": 1
}
Поддерживается только синхронный вызов. При пустом entityType в теле вернет Bad Request
- На входе: String
- На выходе: Mapping
createMappingFullTextSearch
Создание правила индексации
На входе описание индексации
{
"entityType": "Document",
"fullText": [
{
"name": "content"
},
{
"name": "title"
}
],
"stringFacets": [
"author",
"city"
],
"numberFacets": []
}
В результате идентификатор правила, по сути тип объекта
"Document"
Или ошибка, если правило для такого
entityTypeуже существует
{
"businessError": null,
"message": "ERROR: duplicate value - entityType=Document already exists",
"stackTrace": null,
"data": null
}
Или ошибка, если указанный
entityTypeне зарегистрирован в системе
{
"businessError": null,
"message": "ERROR: entityType should be present in datamodel",
"stackTrace": null,
"data": null
}
Поддерживается только синхронный вызов. При пустом entityType в [MappingDTO] вернет Bad Request
- На входе: MappingDTO
- На выходе: String
deleteMappingFullTextSearch
Удаление правила индексации. Пока команда существует только для отладки, после удаления правила не будет работать поиск
по удаленному типу. При пустом entityType в теле вернет Bad Request
На входе идентификатор правила
"Document"
В результате кол-во удаленных записей
1
Или ошибка, если правило с таким
entityTypeне существует
{
"businessError": null,
"message": "Mapping Document not found",
"stackTrace": null,
"data": null
}
Поддерживается только синхронный вызов
- На входе: String
- На выходе: Integer
createMappingFullTextSearchV2
Создание правила индексации (вер. 2)
На входе описание индексации
{
"entityType": "Document",
"fullText": [
{
"name": "documents",
"analyzer": "russian",
"boost": null,
"sourceExclude": true,
"isNestedFile": true
},
{
"name": "name",
"analyzer": "russian",
"boost": 0.8,
"sourceExclude": false
}
],
"sorts": [
{
"field": "catalogItem",
"catalogField": null,
"isDefault": false,
"defaultOrder": null,
"sortingType": "catalog"
},
{
"field": "diameter",
"catalogField": null,
"isDefault": true,
"defaultOrder": "asc",
"sortingType": "number"
}
],
"stringFacets": [
"author",
"city"
],
"numberFacets": [],
"booleanFacets": []
}
В результате идентификатор правила, по сути тип объекта
"Document"
Или ошибка, если правило для такого
entityTypeуже существует
{
"businessError": null,
"message": "ERROR: duplicate value - entityType=Document already exists",
"stackTrace": null,
"data": null
}
Или ошибка, если указанный
entityTypeне зарегистрирован в системе
{
"businessError": null,
"message": "ERROR: entityType should be present in datamodel",
"stackTrace": null,
"data": null
}
Поддерживается только синхронный вызов. При пустом entityType в MappingDtoV2 вернет Bad Request.
Подробнее о сортировке смотри SortingMapping
- На входе: MappingDtoV2
- На выходе: String
updateMappingFullTextSearch
Обновление правила индексации. Пока команда существует только для отладки, после обновления правила уже проиндексированные записи никак не будут обновляться, поэтому на них новый поиск может работать некорректно.
На входе описание индексации
{
"entityType": "Document",
"fullText": [
{
"name": "content"
},
{
"name": "title"
}
],
"sorts": [
{
"field": "isActual",
"isDefault": true,
"sortingType": "?"
}
],
"stringFacets": [
"author",
"city"
],
"numberFacets": [],
"booleanFacets": [],
"seqNo": 14,
"primaryTerm": 1
}
В результате кол-во обновленных записей
Поддерживается только синхронный вызов. При пустом entityType в [Mapping] вернет Bad Request
- На входе: Mapping
- На выходе: Integer
updateMappingFullTextSearchV2
Обновление правила индексации (вер.2). Пока команда существует только для отладки, после обновления правила уже проиндексированные записи никак не будут обновляться, поэтому на них новый поиск может работать некорректно.
На входе описание индексации
{
"entityType": "Document",
"fullText": [
{
"name": "documents",
"analyzer": "russian",
"boost": null,
"isNestedFile": true
},
{
"name": "name",
"analyzer": "russian",
"boost": 0.8,
"isNestedFile": false
}
],
"sorts": [
{
"field": "isActual",
"isDefault": true,
"sortingType": "boolean"
}
],
"stringFacets": [
"author",
"city"
],
"numberFacets": [],
"booleanFacets": [],
"seqNo": 14,
"primaryTerm": 1
}
В результате кол-во обновленных записей
Поддерживается только синхронный вызов. При пустом entityType в [MappingV2] вернет Bad Request
- На входе: MappingV2
- На выходе: Integer
listMappingFullTextSearch
Список всех правил индексации
Входных данных нет
В результате список правил индексаций
[
{
"entityType": "Document",
"fullText": [
{
"name": "content",
"analyzer": null,
"boost": null
}
],
"stringFacets": [],
"numberFacets": [],
"seqNo": 0,
"primaryTerm": 0
},
{
"entityType": "agreement",
"fullText": [
{
"name": "content",
"analyzer": null,
"boost": null
},
{
"name": "title",
"analyzer": null,
"boost": null
}
],
"stringFacets": [
"author",
"city"
],
"numberFacets": [],
"seqNo": 0,
"primaryTerm": 0
}
]
Поддерживается только синхронный вызов
- Команда не принимает параметров
- На выходе: List[Mapping]
listMappingFullTextSearchV2
Список всех правил индексации (вер.2)
Входных данных нет
В результате список правил индексаций
[
{
"entityType": "Document",
"fullText": [
{
"name": "content",
"analyzer": null,
"boost": null
}
],
"sorts": [],
"stringFacets": [],
"numberFacets": [],
"booleanFacets": [],
"seqNo": 0,
"primaryTerm": 0
},
{
"entityType": "agreement",
"fullText": [
{
"name": "content",
"analyzer": null,
"boost": null
},
{
"name": "title",
"analyzer": null,
"boost": null
}
],
"sorts": [
{
"field": "isActual",
"isDefault": true,
"sortingType": "boolean"
}
],
"stringFacets": [
"author",
"city"
],
"numberFacets": [],
"booleanFacets": [],
"seqNo": 0,
"primaryTerm": 0
}
]
Поддерживается только синхронный вызов
- Команда не принимает параметров
- На выходе: List[MappingV2]
fullTextSearchDSL (FT) V1
Полнотекстовый поиск
На входе поисковый запрос
{
"query": "(бензин^0.1 || керосин^0.2) && нефть",
"originQuery": "нефть",
"facetsQuery": "agreement:author && agreement:city",
"stringFacets": [
{
"facetName": "agreement:author",
"facetValue": [
"someAuthor"
]
},
{
"facetName": "agreement:city",
"facetValue": [
"someCity"
]
}
],
"paging": {
"page": 1,
"count": 10
},
"entityTypes": [
"agreement"
]
}
В результате найденные документы приведенные к плоскому объекту
{
"documents": [
{
"author": [
"someAuthor"
],
"city": [
"someCity"
],
"entityType": "agreement",
"content": "someContent",
"title": "someTitle",
"id": "62b5b85f-5962-407d-89f1-adbdb49cca85"
},
{
"author": [
"someAuthor"
],
"city": [
"someCity1"
],
"entityType": "agreement",
"content": "someContent",
"title": "someTitle",
"id": "02a193f7-07cf-4d84-aa10-059a89836955"
}
],
"facetsAggregations": [
{
"key": "agreement:author",
"count": 2,
"nested": [
{
"key": "someAuthor",
"count": 2,
"nested": []
}
]
},
{
"key": "agreement:city",
"count": 2,
"nested": [
{
"key": "someCity",
"count": 1,
"nested": []
},
{
"key": "someCity1",
"count": 1,
"nested": []
}
]
}
],
"statistics": [
{
"key": "agreement:author",
"count": 2,
"nested": [
{
"key": "someAuthor",
"count": 2,
"nested": []
}
]
},
{
"key": "agreement:city",
"count": 2,
"nested": [
{
"key": "someCity",
"count": 1,
"nested": []
},
{
"key": "someCity1",
"count": 1,
"nested": []
}
]
}
],
"total": 2
}
Имя команды для вызова: fullTextSearchDSL. Поддерживается только синхронный вызов
- На входе: SearchRequestDSLV1
- На выходе: FTSearchResult
fullTextSearchDSL (FT) V2
Полнотекстовый поиск
На входе поисковый запрос
{
"query": "нефть",
"searchType": "Words",
"extensions": [
{
"item": "керосин",
"boost": 0.2
},
{
"item": "бензин",
"boost": 0.1
}
],
"facetsQuery": "agreement:author && agreement:city && agreement:year",
"stringFacets": [
{
"facetName": "agreement:author",
"facetValue": [
"someAuthor"
]
},
{
"facetName": "agreement:city",
"facetValue": [
"someCity"
]
}
],
"numberFacets": {
"agreement:year": "2020"
},
"paging": {
"page": 1,
"count": 10
},
"entityTypeFields": {
"agreement": [
"author",
"city",
"year"
]
}
}
В результате найденные документы приведенные к плоскому объекту
{
"documents": [
{
"author": [
"someAuthor"
],
"city": [
"someCity"
],
"entityType": "agreement",
"content": "someContent",
"title": "someTitle",
"id": "62b5b85f-5962-407d-89f1-adbdb49cca85"
},
{
"author": [
"someAuthor"
],
"city": [
"someCity1"
],
"entityType": "agreement",
"content": "someContent",
"title": "someTitle",
"id": "02a193f7-07cf-4d84-aa10-059a89836955"
}
],
"facetsAggregations": [
{
"key": "agreement:author",
"count": 2,
"nested": [
{
"key": "someAuthor",
"count": 2,
"nested": []
}
]
},
{
"key": "agreement:city",
"count": 2,
"nested": [
{
"key": "someCity",
"count": 1,
"nested": []
},
{
"key": "someCity1",
"count": 1,
"nested": []
}
]
},
{
"key": "agreement:year",
"count": 2,
"nested": [
{
"key": "2020.0",
"count": 2,
"nested": []
}
]
}
],
"statistics": [
{
"key": "agreement:author",
"count": 2,
"nested": [
{
"key": "someAuthor",
"count": 2,
"nested": []
}
]
},
{
"key": "agreement:city",
"count": 2,
"nested": [
{
"key": "someCity",
"count": 1,
"nested": []
},
{
"key": "someCity1",
"count": 1,
"nested": []
}
]
},
{
"key": "agreement:year",
"count": 2,
"nested": [
{
"key": "2020.0",
"count": 2,
"nested": []
}
]
}
],
"total": 2
}
Имя команды для вызова: fullTextSearchDSLV2. Поддерживается только синхронный вызов
- На входе: SearchRequestDSLV2
- На выходе: FTSearchResult
fullTextSearchDSL (FT) V3
Полнотекстовый поиск (вер. 3) Для корректной работы необходимо предварительно конфигурировать индекс методами работающими с MappingV2
На входе поисковый запрос
{
"search": [
{
"query": "нефть",
"searchType": "Words"
},
{
"query": "переработка",
"searchType": "Strict"
}
],
"extensions": [
{
"item": "керосин",
"boost": 0.2
},
{
"item": "бензин",
"boost": 0.1
}
],
"facetsQuery": "agreement:author && agreement:city && agreement:year",
"stringFacets": [
{
"facetName": "agreement:author",
"facetValue": [
"someAuthor"
]
},
{
"facetName": "agreement:city",
"facetValue": [
"someCity"
]
}
],
"numberFacets": {
"agreement:year": "2020"
},
"booleanFacets": [],
"sorting": {
"fieldName": "massa",
"order": "asc"
},
"paging": {
"page": 1,
"count": 10
},
"entityTypeFields": {
"agreement": [
"author",
"city",
"year"
]
}
}
В результате найденные документы приведенные к плоскому объекту
{
"documents": [
{
"author": [
"someAuthor"
],
"city": [
"someCity"
],
"entityType": "agreement",
"content": "someContent",
"title": "someTitle",
"id": "62b5b85f-5962-407d-89f1-adbdb49cca85"
},
{
"author": [
"someAuthor"
],
"city": [
"someCity1"
],
"entityType": "agreement",
"content": "someContent",
"title": "someTitle",
"id": "02a193f7-07cf-4d84-aa10-059a89836955"
}
],
"facetsAggregations": [
{
"key": "agreement:author",
"count": 2,
"nested": [
{
"key": "someAuthor",
"count": 2,
"nested": []
}
]
},
{
"key": "agreement:city",
"count": 2,
"nested": [
{
"key": "someCity",
"count": 1,
"nested": []
},
{
"key": "someCity1",
"count": 1,
"nested": []
}
]
},
{
"key": "agreement:year",
"count": 2,
"nested": [
{
"key": "2020.0",
"count": 2,
"nested": []
}
]
}
],
"statistics": [
{
"key": "agreement:author",
"count": 2,
"nested": [
{
"key": "someAuthor",
"count": 2,
"nested": []
}
]
},
{
"key": "agreement:city",
"count": 2,
"nested": [
{
"key": "someCity",
"count": 1,
"nested": []
},
{
"key": "someCity1",
"count": 1,
"nested": []
}
]
},
{
"key": "agreement:year",
"count": 2,
"nested": [
{
"key": "2020.0",
"count": 2,
"nested": []
}
]
}
],
"total": 2
}
Имя команды для вызова: fullTextSearchDSLV3. Поддерживается только синхронный вызов
- На входе: SearchRequestDslV3
- На выходе: FtSearchResultV2
fullTextSearchDSL Graph (FT) V1
На входе поисковый запрос
{
"query": "нефть",
"originQuery": "нефть",
"facetsQuery": "",
"stringFacets": [
],
"paging": {
"page": 1,
"count": 10
},
"entityTypes": [
"RfbrDocument"
]
}
В результате найденные документы в упрощенной форме
{
"status": "Completed",
"timestamp": 1648043225394,
"value": {
"documents": [
{
"id": "2c8fd498-4f28-4af5-a55e-fa3810daca35",
"entityType": "RfbrDocument"
},
{
"id": "a51bd74a-ad9d-47d5-a077-86b6e7fb71b0",
"entityType": "RfbrDocument"
}
],
"facetsAggregations": [
{
"key": "RfbrDocument:documentType",
"count": 605,
"nested": [
{
"key": "f31ed82c-9fb2-4eb4-973c-70b09b24bcda",
"count": 549,
"nested": []
},
{
"key": "b4b6e695-9fcb-4f38-a5c6-1ff8e0ab8002",
"count": 34,
"nested": []
}
]
}
],
"statistics": [
{
"key": "RfbrDocument:documentType",
"count": 605,
"nested": [
{
"key": "f31ed82c-9fb2-4eb4-973c-70b09b24bcda",
"count": 549,
"nested": []
},
{
"key": "b4b6e695-9fcb-4f38-a5c6-1ff8e0ab8002",
"count": 34,
"nested": []
}
]
}
],
"total": 605
}
}
Имя команды для вызова: fullTextSearchDSLGraph. Поддерживается только синхронный вызов
- На входе: SearchRequestDSLV1
- На выходе: FTSearchResultGraph
fullTextSearchDSL Graph (FT) V2
На входе поисковый запрос
{
"query": "нефть",
"searchType": "Words",
"extensions": [
{
"item": "керосин",
"boost": 0.2
},
{
"item": "бензин",
"boost": 0.1
}
],
"facetsQuery": "",
"stringFacets": [
],
"numberFacets": {},
"paging": {
"page": 1,
"count": 10
},
"entityTypeFields": {
"RfbrDocument": [
"documentType"
]
}
}
В результате найденные документы в упрощенной форме
{
"status": "Completed",
"timestamp": 1648043225394,
"value": {
"documents": [
{
"id": "2c8fd498-4f28-4af5-a55e-fa3810daca35",
"entityType": "RfbrDocument"
},
{
"id": "a51bd74a-ad9d-47d5-a077-86b6e7fb71b0",
"entityType": "RfbrDocument"
}
],
"facetsAggregations": [
{
"key": "RfbrDocument:documentType",
"count": 605,
"nested": [
{
"key": "f31ed82c-9fb2-4eb4-973c-70b09b24bcda",
"count": 549,
"nested": []
},
{
"key": "b4b6e695-9fcb-4f38-a5c6-1ff8e0ab8002",
"count": 34,
"nested": []
}
]
}
],
"statistics": [
{
"key": "RfbrDocument:documentType",
"count": 605,
"nested": [
{
"key": "f31ed82c-9fb2-4eb4-973c-70b09b24bcda",
"count": 549,
"nested": []
},
{
"key": "b4b6e695-9fcb-4f38-a5c6-1ff8e0ab8002",
"count": 34,
"nested": []
}
]
}
],
"total": 605
}
}
Имя команды для вызова: fullTextSearchDSLGraphV2. Поддерживается только синхронный вызов
- На входе: SearchRequestDSLV2
- На выходе: FTSearchResultGraph
identificationSearch
Поиск документов в поисковом индексе по идентификаторам из результата Lamp-Similarity
На входе поисковый запрос
{
"storedFile": "processing/9ddcc29f-31e1-4001-beeb-f0708594850b",
"entityTypes": [
"agreement"
],
"facetsQuery": "agreement:author && agreement:year",
"percentageRange": [
60.3,
90.5
],
"stringFacets": [
{
"facetName": "agreement:author",
"facetValue": [
"someAuthor"
]
}
],
"numberFacets": {
"agreement:year": "2010_2022"
},
"paging": {
"page": 1,
"count": 10
}
}
В результате найденные документы приведенные к плоскому объекту
{
"documents": [
{
"author": [
"someAuthor"
],
"city": [
"someCity"
],
"similarity": 0.8102,
"entityType": "agreement",
"content": "someContent",
"title": "someTitle",
"id": "62b5b85f-5962-407d-89f1-adbdb49cca85"
}
],
"facetsAggregations": [
{
"key": "agreement:author",
"count": 2,
"nested": [
{
"key": "someAuthor",
"count": 2,
"nested": []
}
]
},
{
"key": "agreement:city",
"count": 2,
"nested": [
{
"key": "someCity",
"count": 1,
"nested": []
},
{
"key": "someCity1",
"count": 1,
"nested": []
}
]
},
{
"key": "agreement:year",
"count": 2,
"nested": [
{
"key": "2020.0",
"count": 2,
"nested": []
}
]
}
],
"statistics": [
{
"key": "agreement:author",
"count": 2,
"nested": [
{
"key": "someAuthor",
"count": 2,
"nested": []
}
]
},
{
"key": "agreement:city",
"count": 2,
"nested": [
{
"key": "someCity",
"count": 1,
"nested": []
},
{
"key": "someCity1",
"count": 1,
"nested": []
}
]
},
{
"key": "agreement:year",
"count": 2,
"nested": [
{
"key": "2020.0",
"count": 2,
"nested": []
}
]
}
],
"total": 1
}
Поддерживается только синхронный вызов
- На входе: SearchByLampResultRequest
- На выходе: FTSearchResultShort
plagiarismSearch
Поиск документов в поисковом индексе по идентификаторам из результата Lamp-Plagiarism
На входе поисковый запрос
{
"storedFile": "processing/9ddcc29f-31e1-4001-beeb-f0708594850b",
"entityTypes": [
"agreement"
],
"facetsQuery": "agreement:author && agreement:year",
"percentageRange": [
60.3,
90.5
],
"stringFacets": [
{
"facetName": "agreement:author",
"facetValue": [
"someAuthor"
]
}
],
"numberFacets": {
"agreement:year": "2010_2022"
},
"paging": {
"page": 1,
"count": 10
}
}
В результате найденные документы приведенные к плоскому объекту
{
"documents": [
{
"author": [
"someAuthor"
],
"city": [
"someCity"
],
"originality": 0.8102,
"entityType": "agreement",
"content": "someContent",
"title": "someTitle",
"id": "62b5b85f-5962-407d-89f1-adbdb49cca85"
}
],
"facetsAggregations": [
{
"key": "agreement:author",
"count": 2,
"nested": [
{
"key": "someAuthor",
"count": 2,
"nested": []
}
]
},
{
"key": "agreement:city",
"count": 2,
"nested": [
{
"key": "someCity",
"count": 1,
"nested": []
},
{
"key": "someCity1",
"count": 1,
"nested": []
}
]
},
{
"key": "agreement:year",
"count": 2,
"nested": [
{
"key": "2020.0",
"count": 2,
"nested": []
}
]
}
],
"statistics": [
{
"key": "agreement:author",
"count": 2,
"nested": [
{
"key": "someAuthor",
"count": 2,
"nested": []
}
]
},
{
"key": "agreement:city",
"count": 2,
"nested": [
{
"key": "someCity",
"count": 1,
"nested": []
},
{
"key": "someCity1",
"count": 1,
"nested": []
}
]
},
{
"key": "agreement:year",
"count": 2,
"nested": [
{
"key": "2020.0",
"count": 2,
"nested": []
}
]
}
],
"total": 1
}
Поддерживается только синхронный вызов
- На входе: SearchByLampResultRequest
- На выходе: FTSearchResultShort
similaritySearch v2
Вторая версия поиска документов в поисковом индексе по идентификаторам из результата Lamp-Similarity
Данные полученные из результатов обработки lampQuery фильтруются исключением удаленных файлов
(вызов listNonExistingFileId сервиса datamodel)
На входе поисковый запрос
{
"storedFiles": [
"processing/9ddcc29f-31e1-4001-beeb-f0708594850b"
],
"requiredIds": {
"agreement": null
},
"mergeOps": "max",
"facetsQuery": "agreement:author && agreement:year",
"percentageRange": [
60.3,
90.5
],
"stringFacets": [
{
"facetName": "agreement:author",
"facetValue": [
"someAuthor"
]
}
],
"numberFacets": {
"agreement:year": "2010_2022"
},
"paging": {
"page": 1,
"count": 10
}
}
В результате найденные документы приведенные к плоскому объекту
{
"documents": [
{
"author": [
"someAuthor"
],
"city": [
"someCity"
],
"similarity": 0.8102,
"entityType": "agreement",
"content": "someContent",
"title": "someTitle",
"id": "62b5b85f-5962-407d-89f1-adbdb49cca85"
}
],
"facetsAggregations": [
{
"key": "agreement:author",
"count": 2,
"nested": [
{
"key": "someAuthor",
"count": 2,
"nested": []
}
]
},
{
"key": "agreement:city",
"count": 2,
"nested": [
{
"key": "someCity",
"count": 1,
"nested": []
},
{
"key": "someCity1",
"count": 1,
"nested": []
}
]
},
{
"key": "agreement:year",
"count": 2,
"nested": [
{
"key": "2020.0",
"count": 2,
"nested": []
}
]
}
],
"statistics": [
{
"key": "agreement:author",
"count": 2,
"nested": [
{
"key": "someAuthor",
"count": 2,
"nested": []
}
]
},
{
"key": "agreement:city",
"count": 2,
"nested": [
{
"key": "someCity",
"count": 1,
"nested": []
},
{
"key": "someCity1",
"count": 1,
"nested": []
}
]
},
{
"key": "agreement:year",
"count": 2,
"nested": [
{
"key": "2020.0",
"count": 2,
"nested": []
}
]
}
],
"total": 1
}
Поддерживается только синхронный вызов.
- На входе: SearchByLampResultRequestV2
- На выходе: FTSearchResultShort
plagiarismSearch v2
Вторая версия поиска документов в поисковом индексе по идентификаторам из результата Lamp-Plagiarism
Данные полученные из результатов обработки lampQuery фильтруются исключением удаленных файлов
(вызов listNonExistingFileId сервиса datamodel)
На входе поисковый запрос
{
"storedFiles": [
"processing/9ddcc29f-31e1-4001-beeb-f0708594850b"
],
"requiredIds": {
"agreement": null
},
"mergeOps": "max",
"facetsQuery": "agreement:author && agreement:year",
"percentageRange": [
60.3,
90.5
],
"stringFacets": [
{
"facetName": "agreement:author",
"facetValue": [
"someAuthor"
]
}
],
"numberFacets": {
"agreement:year": "2010_2022"
},
"paging": {
"page": 1,
"count": 10
}
}
В результате найденные документы приведенные к плоскому объекту
{
"documents": [
{
"author": [
"someAuthor"
],
"city": [
"someCity"
],
"originality": 0.8102,
"entityType": "agreement",
"content": "someContent",
"title": "someTitle",
"id": "62b5b85f-5962-407d-89f1-adbdb49cca85"
}
],
"facetsAggregations": [
{
"key": "agreement:author",
"count": 2,
"nested": [
{
"key": "someAuthor",
"count": 2,
"nested": []
}
]
},
{
"key": "agreement:city",
"count": 2,
"nested": [
{
"key": "someCity",
"count": 1,
"nested": []
},
{
"key": "someCity1",
"count": 1,
"nested": []
}
]
},
{
"key": "agreement:year",
"count": 2,
"nested": [
{
"key": "2020.0",
"count": 2,
"nested": []
}
]
}
],
"statistics": [
{
"key": "agreement:author",
"count": 2,
"nested": [
{
"key": "someAuthor",
"count": 2,
"nested": []
}
]
},
{
"key": "agreement:city",
"count": 2,
"nested": [
{
"key": "someCity",
"count": 1,
"nested": []
},
{
"key": "someCity1",
"count": 1,
"nested": []
}
]
},
{
"key": "agreement:year",
"count": 2,
"nested": [
{
"key": "2020.0",
"count": 2,
"nested": []
}
]
}
],
"total": 1
}
Поддерживается только синхронный вызов
- На входе: SearchByLampResultRequestV2
- На выходе: FTSearchResultShort
fullTextSearchAnalyzers
Список всех ES анализаторов
Входных данных нет
В результате список ES анализаторов
[
"my_custom_analyzer",
"standard",
"simple",
"whitespace",
"stop",
"keyword",
"pattern",
"fingerprint",
"russian",
"english"
]
Поддерживается только синхронный вызов
- Команда не принимает параметров
- На выходе: List[String]
fullTextAutocomplete
На входе запрос с поисковой строкой
{
"query": "sol"
}
На выходе результаты с предложениями автодополнений по исходной строке
[
{
"text": "Solution Architect",
"score": 1
},
{
"text": "Software Developer",
"score": 1
}
]
Получение дополнений для поисковой строки. Ищет дополнения в специально сформированном индексе. Учитывает возможные опечатки в исходной строке (до 2), см. пример.
Поддерживается только синхронный вызов.
- На входе: AutocompleteRequest
- На выходе: Seq[AutocompleteResult]
fullTextSearchIndexCompletionPhrase
На входе набор фраз для сохранения в индексе для автодополнения
{
"entityType": "Document",
"objectId": "ba03990e-58d5-40dd-9316-c3257109dc06",
"phrases": [
"Software Architect",
"Software Developer"
]
}
Команда не возвращает данных на выходе
Индексирование фраз для получения их при автодополнении. Фразы привязываются к некоторому объекту, из которого они извлекаются. При удалении этого объекта фразы также будут удалены.
Поддерживается синхронный и асинхронный вызов.
- На входе: Seq[CompletionPhrases]
- Команда не возвращает данных
fullTextAggregationSearch
Агрегированный полнотекстовый поиск. Важно: это команда для взаимодействия между сервисами, в будущем ее нельзя будет вызвать через apiGW
На входе форма агрегирующего поиска
{
"query": "электроконтактная",
"paging": {
"page": 1,
"count": 40
},
"relations": {
"Patent": {
"RfbrDocument": {}
}
},
"entity": {
"entityType": "links",
"objectId": "c62b976e-71f9-4d31-b6ab-45997ba84023"
}
}
На выходе результат агрегированного поиска
{
"documents": [
{
"document": {
"id": "c7feabde-09cd-463c-ab4e-968178e7ab37",
"entityType": "Patent",
"highlight": {},
"data": {
"//doc data": "..."
}
},
"matchedChildren": {
"RfbrDocument": 2
}
},
{
"document": {
"id": "9489f188-d925-4e0f-99a6-7ff4a7f859e7",
"entityType": "Patent",
"highlight": {
"patentFileContent": [
"(57) Формула изобретения\nКонвейерная хлебопекарная !!!HL!!электроконтактная!!HL!!! печь, характеризующаяся тем, что"
]
},
"data": {
"//doc data": "..."
}
},
"matchedChildren": {
"RfbrDocument": 0
}
}
],
"total": 2
}
Поддерживается только синхронный вызов.
- На входе: AggregationSearchRequest
- На выходе: AggregationSearchResult
searchByParent
Полнотекстовый поиск внутри родительского документа. Важно: это команда для взаимодействия между сервисами, в будущем ее нельзя будет вызвать через apiGW
На входе форма поиска внутри родительского документа
{
"query": "электроконтактная",
"paging": {
"page": 1,
"count": 10
},
"leafType": "RfbrDocument",
"entity": {
"entityType": "Patent",
"objectId": "c7feabde-09cd-463c-ab4e-968178e7ab37"
}
}
На выходе результат поиска
{
"documents": [
{
"id": "975975bb-ece6-4aca-80fc-5f227e982582",
"entityType": "RfbrDocument",
"highlight": {
"newFileContent": [
"И, действительно, !!!HL!!электроконтактная!!HL!!! методика, о которой я здесь\nрассказываю, в скором времени сыграла",
"Результаты\nизмерений, полученные с помощью !!!HL!!электроконтактной!!HL!!! методики (в\nсочетании с другими), позволили",
"С помощью !!!HL!!электроконтактной!!HL!!! методики уже в 1948 году были\nполучены первые экспериментальные данные о",
"моей сохранилось чувство признательности и даже\nгордости от того, что в этой нашей работе по созданию !!!HL!!электроконтактной!!HL!!!",
"Опыты намечалось проводить с применением !!!HL!!электроконтактной!!HL!!! методики измерения скоростей."
]
},
"data": {
"//doc data": "..."
}
},
{
"id": "1f398276-efb3-41c9-994d-6680681d59f5",
"entityType": "RfbrDocument",
"highlight": {
"newFileContent": [
"камера; 2 — пьезокварцевый датчик давления; З капсюльвоспламенитель; 4 — метаемое тело с полостью; 5 !!!HL!!электроконтактное!!HL!!!"
]
},
"data": {
"//doc data": "..."
}
}
],
"total": 2
}
Поддерживается только синхронный вызов.
- На входе: ByParentSearchRequest
- На выходе: ByParentSearchResult
aggregateDocuments
Агрегация документов (объектов) из индекса полнотекстового поиска по значениям из переданных полей.
На входе список типов сущностей с полями для агрегации и идентификаторы объектов
[
{
"entityType": "type1",
"aggregationField": "identity",
"ids": [
"00000000-0000-0000-0000-000000000001",
"00000000-0000-0000-0000-000000000002",
"00000000-0000-0000-0000-000000000003"
]
},
{
"entityType": "type2",
"aggregationField": "identity",
"ids": [
"00000000-0000-0000-0000-000000000004"
]
},
{
"entityType": "type3",
"aggregationField": "identity",
"ids": [
"00000000-0000-0000-0000-000000000005"
]
},
{
"entityType": "type4",
"aggregationField": "identity",
"ids": [
"00000000-0000-0000-0000-000000000006"
]
}
]
В результате значения полей с количеством документов
{
"buckets": {
"cb4ca441-8710-4eff-9e4f-746b3d0017be": {
"total": 1,
"entities": [
{
"code": "type1",
"count": 1
}
]
},
"8f9b0cc2-d060-4a2d-9421-c4bc4de1fea3": {
"total": 1,
"entities": [
{
"code": "type4",
"count": 1
}
]
},
"0141f31e-33d8-4218-98f4-a26a19237172": {
"total": 1,
"entities": [
{
"code": "type2",
"count": 1
}
]
},
"ef08cfd6-2c61-4a91-97cb-e59af923260c": {
"total": 1,
"entities": [
{
"code": "type1",
"count": 1
}
]
}
}
}
Команда только внутренняя (нельзя вызвать через Api Gateway). Поддерживается только синхронный вызов. Если поле отсутствует, то этот документ не учитывается в результате.
- На входе: List[DocumentsToAggregate]
- На выходе: AggregateDocumentsResult
checkIdsInIndex
Проверка, проиндексированы ли документы (объекты) с указанными ID
На входе список ID
[
"fef5409d-5dad-431d-928e-ed1fe984aaad",
"def5409d-5dad-431d-928e-ed1fe984aaaa"
]
В результате - JSON-объект, где ключом является ID документа, а значением - признак наличия документа с таким ID в индексе
{
"fef5409d-5dad-431d-928e-ed1fe984aaad": true,
"def5409d-5dad-431d-928e-ed1fe984aaaa": false
}
Команда только внутренняя (нельзя вызвать через Api Gateway). Поддерживается только синхронный вызов.
Модели сервиса ПП
StringFacet
Описание фасетного фильтра со строками
| Название поля | Тип | Обязательное | Описание |
|---|---|---|---|
| facetName | String | да | Имя фильтра. Записывается в формате $entityType:$fieldName |
| facetValue | List[String] | да | Список значений фильтра |
NumberFacet
Описание фасетного фильтра с числовыми значениями
| Название поля | Тип | Описание |
|---|---|---|
| facetName | String | Имя фильтра |
| facetValue | List[Double] | Список значений фильтра |
FullTextMapping
Правило хранения и поиска полей для полнотекстового поиска
| Название поля | Тип | Описание |
|---|---|---|
| name | String | Имя Поля |
| analyzer | Option[String] | ES анализатор |
| boost | Option[Double] | Коэффициент, влияющий на ранжирование в поисковой выдаче |
| sourceExclude | Boolean | Исключить поле из вывода при поисковых запросах |
FullTextMappingV2
Правило хранения и поиска полей для полнотекстового поиска (вер. 2)
| Название поля | Тип | Описание |
|---|---|---|
| name | String | Имя Поля |
| analyzer | Option[String] | ES анализатор |
| boost | Option[Double] | Коэффициент, влияющий на ранжирование в поисковой выдаче |
| sourceExclude | Option[Boolean] | Исключить поле из вывода при поисковых запросах |
| isNestedFile | Option[Boolean] | Использовать особый (вложенный) маппинг для файлов, с фиксированным набором полей |
SortingMapping
Правило сортировки полей для полнотекстового поиска.
Сортировка возможна по индексированным Keyword полям (данная характеристика будет применена автоматически,
если поле ранее не было указано в настройках 'mapping.fullText')
В объекте поле должно иметь тип 'string' или 'number', или быть массивом таких типов. В случае массива для сортировки будет использован первый элемент. Также допустимо указывать название поля содержащего идентификатор каталога. В таком случае нужно отметить поле специальным значением sortingType='catalog', а сервис извлечёт справочные данные из Alexandrina и применит их для упорядочивания выборки. По умолчанию данные справочного элемента будут взяты из поля order в метаданных (CatalogItem.metadata), но это поведение можно переопределить переменной 'catalogField'
| Название поля | Тип | Обязательность | Описание |
|---|---|---|---|
| field | String | да | Имя Поля |
| catalogField, | FieldName(String) | нет | Поле справочника с порядковым значением |
| isDefault | Boolean | да | Является ли поле сортировкой по умолчанию |
| defaultOrder | Order(String) | нет | Порядок сортировки (asc,desc) для поля с признаком isDefault |
| sortingType | SortingType | да | Тип сортировки |
SortingType
Варианты типа полей которые можно указать для пользовательской сортировки документов (объектов) в Elastic. Данное перечисление публикуется в сервисе tech-constants при старте приложения и доступно по фильтру constantType=ftsSortingType
| Перечисление | Описание |
|---|---|
| number | Числовое (эквивалентно elastic4s.ScriptSortType.Number) |
| string | Строковое (эквивалентно elastic4s.ScriptSortType.String) |
| catalog | Поле объекта, которое является идентификатором каталога Alexandrina. Извлеченное справочное значение так же должно соответствовать одному из двух вышеуказанных типов |
| boolean | Булевое (не смотря на поддержку булевых полей эластиком, при работе со ScriptSort будет приведён к числу [0,1] или строке ['false', 'true']) |
Mapping
Правило индексации определенного типа
| Название поля | Тип | Описание |
|---|---|---|
| entityType | String | Тип объекта |
| fullText | Seq[FullTextMapping] | Правила для полнотекстового поиска |
| stringFacets | Seq[String] | Правила для строкового фасетного поиска |
| numberFacets | Seq[String] | Правила для числового фасетного поиска |
| seqNo | Long | Версия правила. Необходима для версионирования, которое используется для optimistic lock |
| primaryTerm | Long | Идентификатор шарды, в которую записано правило. Необходим для версионирования, которое используется для optimistic lock |
MappingV2
Правило индексации определенного типа
| Название поля | Тип | Описание |
|---|---|---|
| entityType | String | Тип объекта |
| fullText | Seq[FullTextMappingV2] | Правила для полнотекстового поиска |
| sorts | Seq[SortingMapping] | Правила настройки сортировки поиска |
| stringFacets | Seq[String] | Правила для строкового фасетного поиска |
| numberFacets | Seq[String] | Правила для числового фасетного поиска |
| booleanFacets | Seq[String] | Правила для булевого фасетного поиска |
| seqNo | Long | Версия правила. Необходима для версионирования, которое используется для optimistic lock |
| primaryTerm | Long | Идентификатор шарды, в которую записано правило. Необходим для версионирования, которое используется для optimistic lock |
MappingDTO
Создание правила индексации определенного типа
| Название поля | Тип | Описание |
|---|---|---|
| entityType | String | Тип объекта |
| fullText | Seq[FullTextMapping] | Правила для полнотекстового поиска |
| stringFacets | Seq[String] | Правила для строкового фасетного поиска |
| numberFacets | Seq[String] | Правила для числового фасетного поиска |
MappingDtoV2
Создание правила индексации определенного типа
| Название поля | Тип | Описание |
|---|---|---|
| entityType | String | Тип объекта |
| fullText | Seq[FullTextMapping] | Правила для полнотекстового поиска |
| sorts | Seq[SortingMapping] | Правила настройки сортировки поиска |
| stringFacets | Seq[String] | Правила для строкового фасетного поиска |
| numberFacets | Seq[String] | Правила для числового фасетного поиска |
| booleanFacets | Seq[String] | Правила для булевого фасетного поиска |
SearchRequestDSLV1
Поисковый запрос
| Название поля | Тип | Описание |
|---|---|---|
| query | String | Поисковая строка. Может быть записана с помощью языка запросов |
| originQuery | String | Оригинальный поисковый запрос от пользователя |
| facetsQuery | String | Поисковый запрос для фасетных фильтров. Может быть записан с помощью языка запросов |
| stringFacets | Seq[StringFacet] | Список строковых фасетов |
| paging | Paging | Пагинация |
| entityTypes | Seq[String] | Список типов |
Сервис поддерживает язык запросов для полнотекстового и фасетного поиска. Язык запросов стандартен для verdi (см. например документацию к сервису журналирования). Поддерживаются операции конъюнкции &&, дизъюнкции || и скобки. Полнотекстовый поиск дополнительно поддерживает бустинг через оператор ^. Например как может выглядеть поисковая строка: (бензин^0.1 || керосин^0.2) && нефть. Здесь предполагается что "бензин^0.1 || керосин^0.2" это контекстные расширения.
SearchRequestDSLV2
Поисковый запрос (вер. 2)
| Название поля | Тип | Обязательное | Описание |
|---|---|---|---|
| query | String | да | Поисковая строка. |
| searchType | String | да | Тип запроса. Words - по словам (по любому из значимых слов), Phrase - по всем словам (каждое значимое слово должно присутствовать в объекте), Strict - по точной фразе (все значимые слова запроса должны присутствовать в искомом объекте в том же порядке, на минимальном расстоянии друг от друга). |
| extensions | Seq[SearchExtension] | да | Контекстное расширение |
| facetsQuery | String | да | Поисковый запрос для фасетных фильтров. Может быть записан с помощью языка запросов |
| stringFacets | Seq[StringFacet] | да | Список строковых фасетов |
| numberFacets | JsonObject | да | Объект с числовыми фасетами. Объект, в котором ключ - это название фильтра, а значение - это значение фильтра (в виде строки). Если числовых фасетов в запросе нет - пустой объект. |
| paging | Paging | да | Пагинация |
| entityTypeFields | Map[String, Option[Seq[String]]] | да | Описание фильтрации по типам и полям. Примеры фильтрации: - {} -> фильтрация не выполняется- {"type": null} -> фильтрация по указанным типам- {"type": ["field"]} -> фильтрация по полям из списка- {"type": []} -> выдает пустой результат |
Возможные форматы значений фильтров числовых фасетов:
- Точное значение (фильтр InSetQuery) - "39"
- Список значений (фильтр InSetQuery) -
{"values": ["25","39"], "kind": "any", "negation": false} - Range (фильтр RangeQuery) - "25_39" или "39" или "25"
SearchRequestDSLV3
Поисковый запрос (вер. 3)
| Название поля | Тип | Обязательное | Описание |
|---|---|---|---|
| search | Seq[SearchRequestDslV3Part] | да | Поисковые строки. Одна строка — обычный поиск V2 с возможностью расширений. Более одной для уточнения выборки |
| extensions | Seq[SearchExtension] | да | Контекстное расширение |
| facetsQuery | String | да | Поисковый запрос для фасетных фильтров. Может быть записан с помощью языка запросов |
| stringFacets | Seq[StringFacet] | да | Список строковых фасетов |
| numberFacets | JsonObject | да | Объект с числовыми фасетами. Объект, в котором ключ - это название фильтра, а значение - это значение фильтра (в виде строки). Если числовых фасетов в запросе нет - пустой объект. |
| booleanFacets | Map[String, Seq[Option[Boolean]]] | да | Список булевых фасетов |
| paging | Paging | да | Пагинация |
| sorting | Sorting | нет | Сортировка |
| entityTypeFields | Map[String, Option[Seq[String]]] | да | Описание фильтрации по типам и полям. Примеры фильтрации: - {} -> фильтрация не выполняется- {"type": null} -> фильтрация по указанным типам- {"type": ["field"]} -> фильтрация по полям из списка- {"type": []} -> выдает пустой результат |
SearchRequestDslV3Part
Дополненный поисковый запрос
| Название поля | Тип | Обязательное | Описание |
|---|---|---|---|
| query | String | да | Поисковая строка. |
| searchType | String | да | Тип запроса. Words - по словам (по любому из значимых слов), Phrase - по всем словам (каждое значимое слово должно присутствовать в объекте), Strict - по точной фразе (все значимые слова запроса должны присутствовать в искомом объекте в том же порядке, на минимальном расстоянии друг от друга). |
SearchExtension
Контекстное расширение
| Название поля | Тип | Обязательное | Описание |
|---|---|---|---|
| item | String | да | Текст поискового расширения (смежные темы, выбранные пользователем из предложенных сервисом интеллектуализации) |
| boost | Double | да | Коэффициент расширения, влияющий на его важность: чем выше коэффициент, тем выше элемент, включающий данное расширение, среди всех результатов поиска. Стандартное значение = 1. |
SearchByLampResultRequest
Запрос на поиск по идентификаторам, полученным от LAMP
| Название поля | Тип | Обязательное | Описание |
|---|---|---|---|
| storedFile | URI StoredFile | да | Ссылка на файл в FileStorage, который содержит список идентификаторов объектов в поисковом индексе (формат файла - FaissMessage) |
| entityTypes | Seq[String] | да | Фильтр по типам объектов (пустой список = нет фильтрации) |
| facetsQuery | String | да | Поисковый запрос для фасетных фильтров. Может быть записан с помощью языка запросов |
| percentageRange | Seq[Float] | нет | Фильтр по процентам целевой метрики. Обязательно должен содержать 2 значения: [начало диапазона, конец диапазона]. "Начало" и "конец" включаются в результирующую выборку. Значения меньше "0.0" не будут участвовать в фильтрации. Если необходим полуоткрытый диапазон, его можно задать как [10.0, -1.0]. |
| stringFacets | Seq[StringFacet] | да | Список строковых фасетов |
| numberFacets | JsonObject | да | Объект с числовыми фасетами. Объект, в котором ключ - это название фильтра, а значение - это значение фильтра (в виде строки). Если числовых фасетов в запросе нет - пустой объект. |
| paging | Paging | да | Пагинация |
| query | String | нет | Поисковая строка. Используется только если указан searchType |
| searchType | String | нет | Тип поиска по поисковой строке. Words - по словам, Phrase - по всей фразе целиком. |
Возможные форматы значений фильтров числовых фасетов:
Точное значение - "39"
Список значений - "[25,39]"
Range - "25_39" или "39" или "25"
Отрицание - "not [39]" или "not [25,39]" или "not 25_39"
SearchByLampResultRequest V2
Запрос на поиск по идентификаторам, полученным от LAMP
| Название поля | Тип | Обязательное | Описание |
|---|---|---|---|
| storedFiles | Seq[URI StoredFile] | да | Список ссылок на файлы в FileStorage, который содержит список идентификаторов объектов в поисковом индексе (формат файла - JSON с FaissMessage или PlagiarismMessage) |
| requiredIds | Option[Map[String, Option[Seq[String]]]] | нет | Фильтр по типам и идентификаторам объектов (подробное описание под таблицей) |
| mergeOps | Option[String] | нет | Поисковый запрос для фасетных фильтров. Может быть записан с помощью языка запросов |
| facetsQuery | String | да | Поисковый запрос для фасетных фильтров. Может быть записан с помощью языка запросов |
| percentageRange | Seq[Float] | нет | Фильтр по процентам целевой метрики. Обязательно должен содержать 2 значения: [начало диапазона, конец диапазона]. "Начало" и "конец" включаются в результирующую выборку. Значения меньше "0.0" не будут участвовать в фильтрации. Если необходим полуоткрытый диапазон, его можно задать как [10.0, -1.0]. |
| stringFacets | Seq[StringFacet] | да | Список строковых фасетов |
| numberFacets | JsonObject | да | Объект с числовыми фасетами. Объект, в котором ключ - это название фильтра, а значение - это значение фильтра (в виде строки). Если числовых фасетов в запросе нет - пустой объект. |
| paging | Paging | да | Пагинация |
| query | String | нет | Поисковая строка. Используется только если указан searchType |
| searchType | String | нет | Тип поиска по поисковой строке. Words - по словам, Phrase - по всей фразе целиком. |
Возможные форматы значений фильтров числовых фасетов:
Точное значение - "39"
Список значений - "[25,39]"
Range - "25_39" или "39" или "25"
Отрицание - "not [39]" или "not [25,39]" или "not 25_39"
Варианты значений поля requiredIds:
- Значение не задано null. Фильтрация не применяется
- Пустая Map {}. Фильтрация включена, но фильтры не указаны. Результат - пустой список.
- Map содержит элементы названия типов, но не заданы идентификаторы объектов { "type1": null, "type2": null }. В результате будут только объекты с типами из фильтра, но т.к. списки ID не указаны, то фильтрации по ID нет.
- Map содержит названия типов, но заданы идентификаторы объектов { "type1": ["1", "2"], "type2": null }. В результате будут только объекты с типами и ID из фильтра.
- Map содержит названия типов, но список идентификаторов пустой { "type1": [], "type2": null }. Объекты с типом, у которого пустой списком ID, в результате отображаться не будут.
FTAggregation
Модель для представления агрегации из ES
| Название поля | Тип | Описание |
|---|---|---|
| key | String | Название агрегации |
| count | Long | Общее кол-во документов по данной агрегации |
| nested | Seq[FTAggregation] | Вложенные агрегации |
SuggestionItem
{
"sourceText": "foo",
"offset": 0,
"length": 3,
"newText": "for"
}
Предложение исправления ошибки в поисковом запросе. Содержит исходное слово из поисковой строки или его лемму,
местонахождение этого слова в исходной строке, а также предлагаемое исправление для этого слова или леммы. Нужно в
исходной строке по указанной в offset позиции убрать length символов и вставить предлагаемую замену. Тогда мы
получим исправленный вариант. При вставке исправленного варианта также можно вставить теги для подсвечивания
исправлений (учесть только, что при вставке тегов поедут последующие offset).
Может быть предложено исправление не самого слова, а его леммы, например, для прилагательных. Для них не будет анализироваться окончание. Соответственно, заменяться будет только основная часть слова без окончания.
| Название поля | Тип | Описание |
|---|---|---|
| sourceText | String | Слово или лемма от слова в исходной поисковой строке, для которой предложено исправление |
| offset | Int | Позиция слова или леммы в исходной поисковой строке |
| length | Int | Длина исправляемого слова или леммы |
| newText | String | Новое значение слова или леммы |
FTResultDocument
Найденный через поиск документ
| Название поля | Тип | Описание |
|---|---|---|
| id | String | Идентификатор документа |
| entityType | String | Тип документа |
| highlight | JsonObject | Подсветка |
| data | JsonObject | Данные документа |
FtResultHit
Данные подсветки
| Название поля | Тип | Описание |
|---|---|---|
| queryIdx | Int | Индекс поисковой строки из запроса |
| field | String | Название поля с найденным текстом |
| fileId | String | Идентификатор файла |
| highlights | String[] | Подсветка |
FtResultDocumentV2
Найденный через поиск документ
| Название поля | Тип | Описание |
|---|---|---|
| id | String | Идентификатор документа |
| entityType | String | Тип документа |
| hits | FtResultHit[] | Расширенные данные подсветки |
| data | JsonObject | Данные документа |
FTResultDocumentGraph
Найденный через поиск в графе документ
| Название поля | Тип | Описание |
|---|---|---|
| id | String | Идентификатор документа |
| entityType | String | Тип документа |
FTSearchResult
Результаты поиска (вер. 1)
| Название поля | Тип | Описание |
|---|---|---|
| documents | Seq[FTResultDocument] | Документы |
| facetsAggregations | Seq[FTAggregation] | Агрегация для фасетных фильтров |
| total | Long | Общее кол-в документов по поиску |
| statistics | Seq[FTAggregation] | Агрегация для статистики |
| suggestions | Seq[SuggestionItem] | Список исправлений ошибок в поисковой строке. Если команда не подразумевает поисковую строку, то значение всегда пустое. |
FtSearchResultV2
Результаты поиска (вер. 2)
| Название поля | Тип | Описание |
|---|---|---|
| documents | Seq[FtResultDocumentV2] | Документы |
| facetsAggregations | Seq[FTAggregation] | Агрегация для фасетных фильтров |
| total | Long | Общее кол-в документов по поиску |
| statistics | Seq[FTAggregation] | Агрегация для статистики |
| suggestions | Seq[SuggestionItem] | Список исправлений ошибок в поисковой строке. Если команда не подразумевает поисковую строку, то значение всегда пустое. |
FTSearchResultShort
Результаты поиска без исправлений
| Название поля | Тип | Описание |
|---|---|---|
| documents | Seq[FTResultDocument] | Документы |
| facetsAggregations | Seq[FTAggregation] | Агрегация для фасетных фильтров |
| total | Long | Общее кол-в документов по поиску |
| statistics | Seq[FTAggregation] | Агрегация для статистики |
FTSearchResultGraph
Результаты поиска в графе
| Название поля | Тип | Описание |
|---|---|---|
| documents | Seq[FTResultDocumentGraph] | Документы |
| facetsAggregations | Seq[FTAggregation] | Агрегация для фасетных фильтров |
| statistics | Seq[FTAggregation] | Агрегация для статистики |
| total | Long | Общее кол-в документов по поиску |
EventType (FT)
Типы событий объекта. Доступные типы: Create, Delete, Update.
EntityWithFiles
Объект и связанные с ним файлы.
| Название поля | Тип | Описание |
|---|---|---|
| entityObject | EntityObject | Объект из модели данных |
| files | Map[String, Seq[StoredFile]] | Ассоциативный массив, из имен ключей и ссылок на файлы |
FaissMessage
Сообщение с результатом LAMP по поиску похожих объектов (similarity)
| Название поля | Тип | Описание |
|---|---|---|
| ids | Seq[EntityIdentifier-Encoded] | Список идентификаторов похожих объектов |
| similarities | Seq[Float] | Список значений similarity. Порядок в списке соответствует порядку в ids |
PlagiarismMessage
Сообщение с результатом LAMP по поиску плагиата (plagiarism)
| Название поля | Тип | Описание |
|---|---|---|
| ids | Seq[EntityIdentifier-Encoded] | Список идентификаторов похожих объектов |
| originalities | Seq[Float] | Список значений originality (= 1 - plagiarism). Порядок в списке соответствует порядку в ids |
| originality | Float | Среднее значение originality для списка объектов |
IdWithSimilarity
Связь идентификатора объекта и процента похожести
| Название поля | Тип | Описание |
|---|---|---|
| id | EntityIdentifier | Идентификатор объекта, хранящийся в faiss |
| similarity | Float | Процент похожести |
EntityIdentifier-Encoded
Соответствует типу String. Закодированная информация о файле, который был анализирован в LAMP. Формат - " EntityTypeId;ObjectId;FieldName;FileId", где ; разделитель для значений полей.
После декодирования, преобразуется в EntityIdentifier.
EntityIdentifier
Идентификатор объекта, полученный из LAMP
| Название поля | Тип | Описание |
|---|---|---|
| entityType | String | Тип объекта |
| entityId | String | Идентификатор объекта (используется для поиска в elasticsearch) |
| fieldName | String | Название поля объекта, которое содержит файл |
| fileId | String | Идентификатор файла |
CompletionPhrases
Набор фраз для добавления в индекс автодополнения
| Название поля | Тип | Описание |
|---|---|---|
| input | String | Индексируемая фраза |
| weight | Int | Вес индексируемой фразы. Нужен для дополнительного ранжирования результатов. По умолчанию равно 1 |
AutocompleteRequest
Запрос на получение автодополнений поисковой строки.
| Название поля | Тип | Описание |
|---|---|---|
| query | String | Поисковая строка для автодополнения |
AutocompleteResult
Результат автодополнений поисковой строки.
| Название поля | Тип | Описание |
|---|---|---|
| text | String | Предлагаемый текст для дополнения |
| score | Double | Оценка предложенного результата |
AggregatedDocument
Найденный через агрегированный поиск документ
| Название поля | Тип | Описание |
|---|---|---|
| document | FTResultDocument | Документ |
| matchedChildren | Map[String, Int] | Информация о дочерних документах в виде "тип_документов":"количество" |
AggregationSearchResult
Результат агрегированного поиска
| Название поля | Тип | Описание |
|---|---|---|
| documents | Seq[AggregatedDocument] | Найденные документы |
| total | Long | Общее кол-во документов по запросу поиска |
ByParentSearchResult
Результат поиска дочерних элементов
| Название поля | Тип | Описание |
|---|---|---|
| documents | Seq[FTResultDocument] | Найденные документы |
| total | Long | Общее кол-во документов по запросу поиска |
AggregationSearchRequest
Форма агрегированного запроса
| Название поля | Тип | Описание |
|---|---|---|
| query | String | Поисковая строка |
| paging | Paging | Пагинация |
| relations | Map[String, relations] | Иерархия типов сущностей |
| entity | EntityObjectIdentity | Опциональный идентификатор родительской ветки |
ByParentSearchRequest
Форма поиска дочерних элементов
| Название поля | Тип | Описание |
|---|---|---|
| query | String | Поисковая строка |
| paging | Paging | Пагинация |
| entity | EntityObjectIdentity | Идентификатор родительского документа |
| leafType | String | Тип дочерних элементов |
DocumentsToAggregate
Список документов одного типа для агрегации по выбранному полю
| Название поля | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| ids | List[UUID] | Да | Идентификаторы документов в поисковом индексе | |
| entityType | String | Да | Тип документа | Не пустое |
| aggregationField | String | Да | Поле, которое содержит значение для агрегации | Не пустое |
AggregateDocumentsResult
Результат агрегации документов по полям
| Название поля | Тип | Обязательное | Описание |
|---|---|---|---|
| buckets | Map[String, AggregateBucketValue] | Да | Список бакетов, которые появляются в результате агрегации объектов по определенному значению (key в Map). В JSON тип Map[Key, Value] представлен в виде объекта, где Key - поле объекта, Value - значение поля. В случае пустой Map, поле buckets будет содержать пустой объект. |
AggregateBucketValue
Информация о бакете в агрегации
| Название поля | Тип | Обязательное | Описание |
|---|---|---|---|
| total | Long | Да | Общее кол-во объектов, попадающих в данный бакет |
| entities | Seq[EntityInBucket] | Да | Информация о сущностях объектов, попадающих в данный бакет |
EntityInBucket
Информация о сущности объектов из бакета агрегации
| Название поля | Тип | Обязательное | Описание |
|---|---|---|---|
| code | EntityTypeId | Да | Идентификатор типа сущности |
| count | Long | Да | Кол-во объектов |
Клиент сервиса иерархии
client.createHierarchyEntity(HierarchyEntityObjectCreateDTO(HierarchyEntityId("he-he"), "title", "description", None))
client.getHierarchyEntity(HierarchyEntityId("he-he"))
Предоставляет удобный способ общения с моделью данных и механизм для применения миграций к модели данных.
Регистрация в distage
В distage сам клиент можно зарегистрировать следующим способом:
make[HierarchyClient].from {
(dispatcher: Dispatcher, ec: ExecutionContext@Id("ec-services")) =>
new HierarchyClientImpl(dispatcher)(ec)
}
Сервиса иерархий: hierarchy-entities
Сервис принимает команды и хранит состояние в PostgreSQL.
Команды могут приходить как по HTTP, так и через Kafka в топик hierarchy_entities_commands.
Сервис разбит на несколько модулей, в виде sbt проектов:
- domain, в котором содержатся все доменные модели и их различные представления.
- commands, в котором содержатся всё, что связано с командами, их описанием и обработчиками.
- storage, содержит сервисы для сохранения и чтения их разных хранилищ доменных моделей.
- service, содержит сервисы бизнес логики, которые определяют правила взаимодействия компонентов между собой.
- boot, содержит зависимости и описание для сборки и запуска сервиса.
В сервисе реализованы следующие команды:
- Создание иерархичной сущности
- Обновление иерархичной сущности
- Удаление иерархичной сущности
- Восстановление иерархичной сущности
- Получение иерархичной сущности по ID
- Список иерархичных сущностей
- Создание объекта иерархий
- Создание объектов иерархий
- Создание объектов иерархий через файл
- Обновление объекта иерархий
- Удаление объекта иерархий
- Восстановление объекта иерархий
- Получение объекта иерархий по ID
- Список объектов иерархий
- Иерархичный список с фильтрацией
Локальный запуск сервиса hierarchy-entities
При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:
- PostgreSQL база по адресу
localhost:5432/hierarchyentities - Kafka по адресу
localhost:9092 - Consul по адресу
localhost:8500 - Адрес Kafka будет указан в
application.conf - Добавлены необходимые переменные окружения:
- HIERARCHY_ENTITIES_DB_HOST
- HIERARCHY_ENTITIES_DB_PORT
- HIERARCHY_ENTITIES_DB_NAME
- HIERARCHY_ENTITIES_DB_USER
- HIERARCHY_ENTITIES_DB_PASSWORD
Запуск из консоли с помощью SBT
HIERARCHY_ENTITIES_DB_HOST=localhost HIERARCHY_ENTITIES_DB_PORT=5432 HIERARCHY_ENTITIES_DB_NAME=hierarchyentities HIERARCHY_ENTITIES_DB_USER=postgres HIERARCHY_ENTITIES_DB_PASSWORD=12345 sbt boot/run
Список переменных окружения сервиса hierarchy-entities
Все доступные переменные окружения для настройки сервиса иерархий.
| Переменная | Тип | Обязательная | Значение по умолчанию | Описание |
|---|---|---|---|---|
| HIERARCHY_ENTITIES_HTTP_HOST | string | нет | "0.0.0.0" | Хост, на котором слушает HTTP-сервер |
| HIERARCHY_ENTITIES_HTTP_PORT | int | нет | 8080 | Порт, на котором слушает HTTP-сервер |
| HIERARCHY_ENTITIES_KAFKA_SERVERS | string | да | "localhost:9092" | Адрес Kafka |
| HIERARCHY_ENTITIES_KAFKA_TOPIC | string | нет | "hierarchy_entities_commands" | Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery. |
| HIERARCHY_ENTITIES_KAFKA_CONSUMER_GROUP | string | нет | "hierarchy_entities_consumer_group" | Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске. |
| HIERARCHY_ENTITIES_KAFKA_PARTITIONS | int | нет | 10 | Число читаемых партиций из кафка-топика команд. |
| HIERARCHY_ENTITIES_KAFKA_CONSUMER_RESTART_MIN_BACKOFF | duration string | нет | 1 second | Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта) |
| HIERARCHY_ENTITIES_KAFKA_CONSUMER_RESTART_MAX_BACKOFF | duration string | нет | 30 seconds | Максимальное задержка до рестарта консьюмера после падения |
| HIERARCHY_ENTITIES_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR | double | нет | 0.2 | Коэффициент величины дополнительной случайной задержки(jitter) относительно основной задержки (При значении 0.2 задержка может быть до 20% больше, чем при 0). Если после умножения задержки на HIERARCHY_ENTITIES_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR получится меньше 1 миллисекунды, то jitter будет приравнен к нулю. |
| HIERARCHY_ENTITIES_KAFKA_CONSUMER_PER_MESSAGE_RESTART_MAX_RESTARTS | int | нет | 2 | Максимальное количество раз, которое консьюмер перезапустится с неизменной очередью сообщений(в пределах DATA_MODEL_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN), прежде чем проигнорировать сообщение, на котором происходит ошибка (Указано количество рестартов, а не прочтений. Если HIERARCHY_ENTITIES_KAFKA_CONSUMER_RESTART_MAX_RESTARTS = 2, то ошибочное сообщение будет обработано 3 раза, после чего произойдет 3ий рестарт и оно будет проигнорировано). Если указать 0, то перезапуск произойдет, но сообщение будет обработано только в первый раз, когда произошла ошибка. Если указать значение меньше 0, то перезапуски все равно будут происходить, но игнорирование сообщений, вызывающих ошибку, будет отключено. |
| HIERARCHY_ENTITIES_KAFKA_CONSUMER_PER_MESSAGE_RESTART_CACHE_SIZE | int | нет | 100 | Для каждого сообщения счетчик перепрочтений хранится в кэше. Максимальное количество значений в этом кэше. |
| HIERARCHY_ENTITIES_KAFKA_CONSUMER_PER_MESSAGE_RESTART_CACHE_TTL | duration string | нет | 5 minutes | Для каждого сообщения счетчик перепрочтений хранится в кэше.Максимальное время жизни элемента в этом кэше. В случае отсутствия значения время жизни элемента не будет ограничено. |
| HIERARCHY_ENTITIES_KAFKA_CONSUMER_RESTART_MAX_RESTARTS | int | нет | 5 | Максимальное число рестартов консьюмера после падения (в пределах HIERARCHY_ENTITIES_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN).После превышения этого числа сервис будет объявлен больным. Все рестарты для каждого отдельного сообщения увеличивают и общий счетчик рестартов консьюмера, поэтому при использовании HIERARCHY_ENTITIES_KAFKA_CONSUMER_PER_MESSAGE_RESTART_MAX_RESTARTS нужно указывать HIERARCHY_ENTITIES_KAFKA_CONSUMER_RESTART_MAX_RESTARTS > HIERARCHY_ENTITIES_KAFKA_CONSUMER_PER_MESSAGE_RESTART_MAX_RESTARTS или не указывать HIERARCHY_ENTITIES_KAFKA_CONSUMER_PER_MESSAGE_RESTART_MAX_RESTARTS совсем. |
| HIERARCHY_ENTITIES_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN | duration string | нет | 5 minutes | Временной отрезок, в который HIERARCHY_ENTITIES_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов |
| HIERARCHY_ENTITIES_KAFKA_COMMANDEVENT_TOPIC | string | да | "commandevents" | Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд. |
| HIERARCHY_ENTITIES_KAFKA_AUTH_USER | string | нет | "" | Название учетной записи Kafka(в случае аутентификации в kafka с помощью пароля). Если название не указано, то настройки авторизации не будут применены. |
| HIERARCHY_ENTITIES_KAFKA_AUTH_PASSWORD | string | нет | "" | Пароль учетной записи Kafka(в случае аутентификации в kafka с помощью пароля). |
| HIERARCHY_ENTITIES_KAFKA_AUTH_PRINCIPAL | string | нет | "" | Principal учетной записи Kafka в Kerberos(в случае аутентификации в kafka через Kerberos). |
| HIERARCHY_ENTITIES_KAFKA_AUTH_KEYTAB_PATH | string | нет | "" | Путь до keytab-файла(в случае аутентификации в kafka через Kerberos). |
| HIERARCHY_ENTITIES_KAFKA_AUTH_TRUSTSTORE_LOCATION | string | нет | "" | Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет. |
| HIERARCHY_ENTITIES_KAFKA_AUTH_TRUSTSTORE_PASSWORD | string | нет | "" | Пароль к хранилищу сертификатов. |
| HIERARCHY_ENTITIES_KAFKA_AUTH_MODE | string | нет | "static" | Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса |
| HIERARCHY_ENTITIES_KAFKA_AUTH_CONFIG | string | нет | "" | Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig]. Переменная соответствует полю authConfig из KafkaAuthSettings. |
| HIERARCHY_ENTITIES_KAFKA_AUTH_CACHE_SIZE | int | нет | Максимальный размер кеша для Kafka producer (количество активных соединений). | |
| HIERARCHY_ENTITIES_KAFKA_AUTH_CACHE_TTL | duration string | нет | Время жизни Kafka producer в кеше. | |
| HIERARCHY_ENTITIES_KAFKA_CONNECTION_CHECK_TEST_MESSAGES_INTERVAL | duration string | нет | 4 minutes | Применяется только для producer-ов со способом аутентификации kerberos. Интервал отправки тестовых сообщений кафки в топик connectionCheck.testMessagesTopicName. Тестовые сообщения (null, service producer test) отправляются регулярно с этим интервалом. |
| HIERARCHY_ENTITIES_KAFKA_CONNECTION_CHECK_INTERVAL | duration string | нет | 60 seconds | Применяется только для producer-ов со способом аутентификации kerberos. Интервал проверки того, сколько тестовых сообщений было отправлено за данный период. Если количество сообщений за этот период равно количеству сообщений за прошлый период, то начинается отсчет периода без сообщений. |
| HIERARCHY_ENTITIES_KAFKA_CONNECTION_CHECK_FAILED_AFTER_INTERVAL | duration string | нет | 5 minutes | Применяется только для producer-ов со способом аутентификации kerberos. Максимальная продолжительность периода без успешно отправленных тестовых сообщений. По ее достижении сервис будет объявлен больным. |
| HIERARCHY_ENTITIES_KAFKA_PRODUCER_PROPS | string | нет | "max.request.size=1048576" | Дополнительные параметры для Kafka producer. Заполняются по шаблону "key1=value1;key2=value2". |
| HIERARCHY_AUTHORIZER_KIND | string | да | "authzforce" | Вид авторизатора, который используется в сервисе. Допустимые значения: "authzforce", "oberto". При указании неизвестного значения будет использовано значение по-умолчанию. |
| HIERARCHY_AUTHZFORCE_ADDR | string | да | "http://localhost:8080/authzforce-ce" | Адрес AuthZforce server |
| HIERARCHY_AUTHZFORCE_DOMAIN | string | да | "" | Доступный DomainID в AuthZforce server |
| HIERARCHY_ENTITIES_CONSUL_ADDR | url string | нет | "http://localhost:8500" | Адрес Сonsul. |
| HIERARCHY_ENTITIES_CONSUL_AUTH_USER | string | нет | "" | Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены. |
| HIERARCHY_ENTITIES_CONSUL_AUTH_PASSWORD | string | нет | "" | Пароль учетной записи Сonsul. |
| HIERARCHY_ENTITIES_TRACE_DURATION | boolean | нет | false | Признак необходимости трассировки выполнения команд |
| HIERARCHY_ENTITIES_DISCOVERABLE_ID | string | нет | "another_hierarchy_entities_service_instance" | ID сервиса в ServiceDiscovery |
| HIERARCHY_ENTITIES_DISCOVERABLE_NAME | string | нет | "hierarchyentities" | Имя сервиса в ServiceDiscovery |
| HIERARCHY_ENTITIES_DISCOVERABLE_HOST | string | да | "localhost" | Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service |
| HIERARCHY_ENTITIES_DISCOVERABLE_PORT | int | нет | Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер. | |
| HIERARCHY_ENTITIES_DISCOVERABLE_LIVETIME | duration string | нет | 2 minutes | Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым. |
| HIERARCHY_ENTITIES_DISCOVERABLE_HEALTHPASS | string | нет | 1 minute | Периодичность отправки health check в ServiceDiscovery |
| HIERARCHY_ENTITIES_SERVICE_TITLE | string | нет | "hierarchy-entities" | Название сервиса для отображения |
| HIERARCHY_ENTITIES_SERVICE_DESCRIPTION | string | нет | "Service HIERARCHY_ENTITIES" | Описание сервиса для отображения |
| HIERARCHY_ENTITIES_AKKA_HTTP_CLIENT_MAXCON | int | нет | 512 | Максимальное число одновременных исходящих HTTP-соединений |
| HIERARCHY_ENTITIES_AKKA_HTTP_CLIENT_MAXREQ | int | нет | 1024 | Максимальное число одновременных исходящих HTTP-запросов |
| HIERARCHY_ENTITIES_AKKA_HTTP_SERVER_MAXCON | int | нет | 1024 | Максимальное число одновременных входящих HTTP-соединений |
| HIERARCHY_ENTITIES_INTERNALCMD_ALLOW | bool | нет | false | Можно ли сервису отправлять внутрисистемные команды |
| HIERARCHY_ENTITIES_HEALTH_TIMEOUT | duration string | нет | 5 seconds | Максимальное время ожидания ответа health check |
| HIERARCHY_ENTITIES_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD | duration string | нет | 10 minutes | Время кэширования данных по командам из CommandDiscovery |
| HIERARCHY_ENTITIES_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD | duration string | нет | 30 seconds | Время кэширования данных по сервисам из ServiceDiscovery |
| HIERARCHY_ENTITIES_DB_HOST | string | да | Хост БД | |
| HIERARCHY_ENTITIES_DB_PORT | int | да | Порт БД | |
| HIERARCHY_ENTITIES_DB_NAME | string | да | Имя базы в БД | |
| HIERARCHY_ENTITIES_DB_URL | jdbc url string | нет | JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы. | |
| HIERARCHY_ENTITIES_DB_USER | string | да | Пользователь БД | |
| HIERARCHY_ENTITIES_DB_PASSWORD | string | да | Пароль пользователя БД | |
| HIERARCHY_ENTITIES_DB_THREADS | int | нет | 10 | Количество потоков в пуле потоков для соединения с БД |
| HIERARCHY_ENTITIES_DB_QUEUE_SIZE | int | нет | 300 | Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей |
| HIERARCHY_ENTITIES_DB_CONN_MAX | int | нет | 10 | Максимальное количество одновременных подключений к БД |
| HIERARCHY_ENTITIES_DB_CONN_TIMEOUT | duration string | нет | 20 second | Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение. |
| HIERARCHY_ENTITIES_DB_CONN_MIN | int | нет | = DB_THREADS | Минимальное количество одновременных подключений к БД |
| HIERARCHY_ENTITIES_DB_ISOLATION | string | нет | "READ_COMMITTED" | Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE. |
| HIERARCHY_ENTITIES_DB_READONLY | boolean | нет | false | Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции. |
| HIERARCHY_ENTITIES_DB_VALIDATION_TIMEOUT | duration string | нет | 1 seconds | Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение. |
| HIERARCHY_ENTITIES_DB_IDLE_TIMEOUT | duration string | нет | 10 minutes | Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула. |
| HIERARCHY_ENTITIES_DB_MAX_LIFETIME | duration string | нет | 30 minutes | Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы. |
| HIERARCHY_ENTITIES_DB_INITIALIZATION_FAIL_FAST | string | нет | false | Deprecated, начиная с версии Slick 3.3.0. Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0. |
| HIERARCHY_ENTITIES_DB_LEAK_DETECTION_THRESHOLD | int | нет | 0 | Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с. |
| HIERARCHY_ENTITIES_DB_CONNECTION_TEST_QUERY | string | нет | "SELECT 1" | Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid(). |
| HIERARCHY_ENTITIES_DB_AUTO_COMMIT | boolean | нет | true | Это свойство определяет то, как будут вести себя по умолчанию возвращаемые соединения относительно autocommit-а. |
| HIERARCHY_ENTITIES_DB_SCHEMA | string | нет | "public" | Устанавливает schema по умолчанию |
| HIERARCHY_ENTITIES_DB_ISOLATE_INTERNAL_QUERIES | boolean | нет | false | Определяет то, изолируются ли с помощью транзакций внутренние запросы пула(например запрос connection alive test). Свойство применяется только если autoCommit выключен. |
| HIERARCHY_ENTITIES_DB_INITIALIZATION_FAIL_TIMEOUT | int | нет | 1 | Работает, начиная с версии Slick 3.3.0. Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Любое положительное число считается числом миллисекунд для попытки получить начальное соединение;поток приложения будет заблокирован в течение этого периода. Если соединение не может быть получено до истечения этого времени,будет брошено исключение. Данный таймаут применяется после периода connectionTimeout. Если значение равно нулю (0),HikariCP попытается получить и проверить подключение. Если соединение получено,но проверка не пройдена, будет брошено исключение, и пул не будет запущен. Однако,если соединение не может быть получено, пул запустится,но последующие попытки получить соединение могут потерпеть неудачу.Значение меньше нуля пройдет любую первоначальную попытку подключения, и пул немедленно запустится,пытаясь получить соединения в фоновом режиме.Следовательно, последующие попытки получить соединение могут потерпеть неудачу. |
| HIERARCHY_ENTITIES_DB_REGISTER_MBEANS | boolean | нет | false | Зарегистрированы ли JMX Management Beans («MBeans») |
| HIERARCHY_ENTITIES_FS_URI | url string | нет | http://localhost:9000 | Адрес для подключения к Minio |
| HIERARCHY_ENTITIES_FS_ACCESS_KEY_ID | string | нет | "minioadmin" | Ключ доступа к хранилищу файлов Minio (aka пользователь) |
| HIERARCHY_ENTITIES_FS_SECRET_ACCESS_KEY | string | нет | "minioadmin" | Секретный код доступа к хранилищу файлов Minio (aka пароль) |
| HIERARCHY_ENTITIES_FS_UPLOAD_PARALLELISM | int | нет | 4 | Максимально возможный параллелизм при загрузке файлов в хранилище |
| HIERARCHY_ENTITIES_FS_AUTH_MODE | string | нет | static | Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса |
| HIERARCHY_ENTITIES_FS_AUTH_CONFIG | string | нет | "" | Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[FSBucketConfig] соответствует полю authConfig FSConfigRep |
| HIERARCHY_ENTITIES_FS_CACHE_SIZE | int | нет | 1 | Максимальный размер кэша клиентов для хранилища файлов (количество активных соединений). |
| HIERARCHY_ENTITIES_FS_CACHE_TTL | duration string | нет | Время жизни клиента в кэше | |
| LOGGING_HOSTNAME | string | нет | SERVER | Имя сервера для CEF-логов |
| LOGGING_EXTERNAL_ADDRESS | string | нет | localhost | IP-адрес сервера для CEF-логов |
| GPN_VERSION_POSTFIX | string | нет | Постфикс библиотеки gpn-libs для сборки CI | |
| CLIENT_VERSION_POSTFIX | string | нет | Постфикс библиотеки sed-domain-lib для сборки CI | |
| SYSTEM_VERSION_POSTFIX | string | нет | Постфикс библиотеки sed-system-lib для сборки CI |
Список команд сервиса hierarchy-entities
Список реализованных в сервисе команд, моделей EntityType и действий Actions, которые можно использовать при настройке авторизации. Не все поля EntityType доступны для использования в настройке авторизации. Если указан прочерк "-", то данное значение не влияет на авторизацию:
- если не указан Action, то никакой Action не проверяется (= без авторизации)
- если не указан EntityType, то на авторизацию влияет только Action
*1 - при создании объектов иерархии права проверяются по ID HierarchyEntity, в котором мы хотим создать объект
В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.
CreateHierarchyEntity
На входе атрибуты для создания иерархичной сущности
{
"id": "HierarchyEntityId",
"title": "title",
"description": "description",
"data": {
"someInfo": "info"
},
"externalType": "catalogItem",
"externalEntityType": "CatalogCode1",
"externalId": "6d873b43-0913-4fde-827c-968f13ebf778"
}
На выходе ID новой задачи
"HierarchyEntityId"
Добавление новой иерархичной сущности.
- Input: HierarchyEntityCreateDTO
- Output: Id созданной задачи
| Команда | Путь |
|---|---|
| hierarchyEntities_createHierarchyEntity | Kafka Topic "hierarchyEntities_commands" |
UpdateHierarchyEntity
На выходе атрибуты для обновления иерархичной сущности
{
"id": "HierarchyEntityId",
"title": "title",
"description": "description",
"data": {
"someInfo": "info"
},
"version": 1
}
На выходе признак успешности обновления
true
Обновление иерархичной сущности.
- Input: HierarchyEntityUpdateDTO
- Output: Boolean
| Команда | Путь |
|---|---|
| hierarchyEntities_updateHierarchyEntity | Kafka Topic "hierarchyEntities_commands" |
DeleteHierarchyEntity
На входе ID иерархичной сущности
"hierarchyEntityId"
На выходе признак успешности удаления
true
Удаление иерархичной сущности.
- Input: ID иерархичной сущности
- Output: Boolean
| Команда | Путь |
|---|---|
| hierarchyEntities_deleteHierarchyEntity | Kafka Topic "hierarchyEntities_commands" |
RestoreHierarchyEntity
На входе ID иерархичной сущности
"hierarchyEntityId"
На выходе признак успешности восстановления
true
Восстановление иерархичной сущности.
- Input: ID иерархичной сущности
- Output: Boolean
| Команда | Путь |
|---|---|
| hierarchyEntities_restoreHierarchyEntity | Kafka Topic "hierarchyEntities_commands" |
GetHierarchyEntity
На входе ID иерархичной сущности
"hierarchyEntityId"
На выходе атрибуты иерархичной сущности
{
"id": "HierarchyEntityId",
"title": "title",
"description": "description",
"data": {
"someInfo": "info"
},
"created": 1664292962695,
"createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"modified": 1664292962695,
"modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"removed": false,
"version": 2
}
Получение иерархичной сущности.
- Input: UUID задачи
- Output: HierarchyEntity
| Команда | Путь |
|---|---|
| hierarchyEntities_getHierarchyEntity | HTTP POST "/v1/hierarchy-entity/get" |
ListHierarchyEntities
На входе параметры поиска, сортировки и пагинации (Search) Возможна фильтрация и сортировка по полям data. Для строковых значений префикс data (Например "data.someInfo.info) Для числовых значений префикс dataNumber (Например "dataNumber.someInfo.numberInfo)
{
"query": "",
"context": {},
"sorting": {
"fieldName": "title",
"order": "desc"
},
"paging": {
"page": 1,
"count": 5
}
}
На выходе список иерархичных сущностей и их общее количество
{
"items": [
{
"id": "HierarchyEntityId",
"title": "title",
"description": "description",
"data": {
"someInfo": {
"info": "info",
"numberInfo": 10
}
},
"created": 1664292962695,
"createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"modified": 1664292962695,
"modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"removed": false,
"version": 2
}
],
"total": 1
}
Получение списка иерархичных сущностей с поиском, сортировкой и пагинацией.
- Input: Search
- Output: Page[HierarchyEntity]
| Команда | Путь |
|---|---|
| hierarchyEntities_listHierarchyEntities | HTTP POST "/v1/hierarchy-entity/list" |
CreateHierarchyEntityObject
На входе атрибуты для создания объекта иерархий
{
"hierarchyEntityId": "HierarchyEntityId",
"parentId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
"data": {
"title": "objectTitle",
"objectNumber": 3
},
"externalType": "catalogItem",
"externalEntityType": "CatalogCode1",
"externalId": "6d873b43-0913-4fde-827c-968f13ebf778"
}
На выходе ID нового объекта иерархий
"ccdeecc5-ff63-4c98-80d6-bab044cc5f1e"
Добавление нового объекта иерархий.
- Input: HierarchyEntityObjectCreateDTO
- Output: Id объекта иерархий
| Команда | Путь |
|---|---|
| hierarchyEntities_createHierarchyEntityObject | Kafka Topic "hierarchyEntities_commands" |
CreateHierarchyEntityObjectBatch
На входе массив атрибутов для создания объектов иерархий
{
"batch": [
{
"hierarchyEntityId": "HierarchyEntityId1",
"parentId": null,
"data": {
"title": "Название 1",
"objectNumber": 1
},
"externalType": "catalogItem",
"externalEntityType": "CatalogCode1",
"externalId": "6d873b43-0913-4fde-827c-968f13ebf778"
},
{
"hierarchyEntityId": "HierarchyEntityId2",
"parentId": null,
"data": {
"title": "Название 2",
"objectNumber": 2
}
}
]
}
На выходе IDs новых объектов иерархий
[
"411f2b60-9c68-4941-91e8-14e5d2d9f841",
"b3d13de1-6411-4f3c-b0d1-bbe619b54f9f"
]
Добавление новых объектов иерархий.
- Input: HierarchyEntityObjectBatchCreateDto
- Output: Массив идентификаторов объектов иерархий (HierarchyEntityObjectId = UUID)
| Команда | Путь |
|---|---|
| hierarchyEntities_createHierarchyEntityObjectBatch | Kafka Topic "hierarchyEntities_commands" |
CreateHierarchyEntityObjectBatchByFile
На входе массив атрибутов для создания объектов иерархий
{
"id": "1c689788-9617-4c93-bcee-6eae8909a0ba",
"path": "temp/1c689788-9617-4c93-bcee-6eae8909a0ba",
"bucket": "temp"
}
На выходе IDs новых объектов иерархий
[
"411f2b60-9c68-4941-91e8-14e5d2d9f841",
"b3d13de1-6411-4f3c-b0d1-bbe619b54f9f"
]
Добавление новых объектов иерархий используя файл.
Input: StoredFile Ссылка на файл в FileStorage, который содержит список DTO создания объектов иерархии (формат файла - HierarchyEntityObjectBatchCreateDto)
Output: Массив идентификаторов объектов иерархий (HierarchyEntityObjectId = UUID)
| Команда | Путь |
|---|---|
| hierarchyEntities_createHierarchyEntityObjectBatchByFile | Kafka Topic "hierarchyEntities_commands" |
UpdateHierarchyEntityObject
На выходе атрибуты для обновления объекта иерархий
{
"id": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"hierarchyEntityId": "HierarchyEntityId",
"parentId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
"data": {
"title": "objectTitle",
"objectNumber": 3
},
"externalType": "catalogItem",
"externalEntityType": "CatalogCode1",
"externalId": "6d873b43-0913-4fde-827c-968f13ebf778",
"version": 1
}
На выходе признак успешности обновления
true
Обновление объекта иерархий.
- Input: HierarchyEntityObjectUpdateDTO
- Output: Boolean
| Команда | Путь |
|---|---|
| hierarchyEntities_updateHierarchyEntityObject | Kafka Topic "hierarchyEntities_commands" |
DeleteHierarchyEntityObject
На входе ID объекта иерархий
"ccdeecc5-ff63-4c98-80d6-bab044cc5f1e"
На выходе признак успешности удаления
true
Удаление объекта иерархий.
- Input: ID объекта иерархий
- Output: Boolean
| Команда | Путь |
|---|---|
| hierarchyEntities_deleteHierarchyEntityObject | Kafka Topic "hierarchyEntities_commands" |
RestoreHierarchyEntityObject
На входе ID объекта иерархий
"ccdeecc5-ff63-4c98-80d6-bab044cc5f1e"
На выходе признак успешности восстановления
true
Восстановление объекта иерархий.
- Input: ID объекта иерархий
- Output: Boolean
| Команда | Путь |
|---|---|
| hierarchyEntities_restoreHierarchyEntityObject | Kafka Topic "hierarchyEntities_commands" |
GetHierarchyEntityObject
На входе ID объекта иерархий
"hierarchyEntityId"
На выходе атрибуты объекта иерархий
{
"id": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"hierarchyEntityId": "HierarchyEntityId",
"parentId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
"data": {
"title": "objectTitle",
"objectNumber": 3
},
"created": 1664292962695,
"createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"modified": 1664292962695,
"modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"removed": false,
"version": 2
}
Получение объекта иерархий.
- Input: UUID объекта иерархий
- Output: HierarchyEntityObject
| Команда | Путь |
|---|---|
| hierarchyEntities_getHierarchyEntityObject | HTTP POST "/v1/hierarchy-entity-object/get" |
ListHierarchyEntityObjects
На входе параметры поиска, сортировки и пагинации (Search) Возможна фильтрация и сортировка по полям data. Для строковых значений префикс data (Например "data.someInfo.info) Для числовых значений префикс dataNumber (Например "dataNumber.someInfo.numberInfo)
{
"query": "",
"context": {},
"sorting": {
"fieldName": "title",
"order": "desc"
},
"paging": {
"page": 1,
"count": 5
}
}
На выходе список объектов иерархий и их общее количество
{
"items": [
{
"id": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"hierarchyEntityId": "HierarchyEntityId",
"parentId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
"data": {
"title": "objectTitle",
"objectNumber": 3
},
"created": 1664292962695,
"createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"modified": 1664292962695,
"modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"removed": false,
"version": 2
}
],
"total": 1
}
Получение списка объектов иерархий с поиском, сортировкой и пагинацией.
- Input: Search
- Output: Page[HierarchyEntityObject]
| Команда | Путь |
|---|---|
| hierarchyEntities_listHierarchyEntityObjects | HTTP POST "/v1/hierarchy-entity-object/list" |
ListHierarchy
На входе параметры поиска, сортировки и пагинации (Search), параметр expandTree и опциональный parentId Пагинация влияет только на самый верхний уровень вложенности (parentId = null) Возможна фильтрация и сортировка по полям data. Для строковых значений префикс data (Например "data.someInfo.info) Для числовых значений префикс dataNumber (Например "dataNumber.someInfo.numberInfo)
Если expandTree = false поле children у объектов всегда = null, в остальных случаях это список вложенных объектов
Payload для команды
{
"search": {
"query": "data.title",
"context": {
"data.title": "ts asd:*"
},
"sorting": {
"fieldName": "title",
"order": "desc"
},
"paging": {
"page": 1,
"count": 10
}
},
"expandTree": false,
"parentId": null
}
Результат выполнения команды
Сценарии работы Фильтрация с expandTree = false, parentId = null На выходе список верхне уровневых объектов, которые хранят попавшие под фильтр сущности на нижних уровнях, или сами попадают под фильтр.
{
"items": [
{
"entityObject": {
"id": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"hierarchyEntityId": "HierarchyEntityId",
"parentId": null,
"data": {
"title": "objectTitle",
"objectNumber": 3
},
"created": 1664292962695,
"createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"modified": 1664292962695,
"modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"removed": false,
"version": 2
},
"isMatched": false,
"childrenCount": 10,
"children": null
}
],
"total": 1
}
Фильтрация с expandTree = false, parentId != null На выходе список объектов у которых родитель = parentId, которые хранят попавшие под фильтр сущности на нижних уровнях, или сами попадают под фильтр.
{
"items": [
{
"entityObject": {
"id": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"hierarchyEntityId": "HierarchyEntityId",
"parentId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
"data": {
"title": "objectTitle",
"objectNumber": 3
},
"created": 1664292962695,
"createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"modified": 1664292962695,
"modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"removed": false,
"version": 2
},
"isMatched": true,
"childrenCount": 0,
"children": null
}
],
"total": 1
}
Фильтрация с expandTree = true, parentId можно не указывать, так как дерево будет раскрыто полностью На выходе список объектов от верхнего уровня с иерархичной вложенностью до объекта, который попадает под фильтр
{
"items": [
{
"entityObject": {
"id": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"hierarchyEntityId": "HierarchyEntityId",
"parentId": null,
"data": {
"title": "objectTitle",
"objectNumber": 3
},
"created": 1664292962695,
"createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"modified": 1664292962695,
"modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"removed": false,
"version": 2
},
"isMatched": false,
"childrenCount": 1,
"children": [
{
"entityObject": {
"id": "72602ae9-66ab-4065-8305-d374ff14a4bf",
"hierarchyEntityId": "HierarchyEntityId",
"parentId": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"data": {
"title": "objectTitle",
"objectNumber": 3
},
"created": 1664292962695,
"createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"modified": 1664292962695,
"modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"removed": false,
"version": 2
},
"isMatched": true,
"childrenCount": 0,
"children": []
}
]
}
],
"total": 1
}
Пример автоматически изменённого payload при регистрации события выполнения команды через sendCommandEvent
{
"items": [
"the output is cut off"
],
"total": 13689
}
Получение списка объектов иерархий с поиском, сортировкой и пагинацией. Отправка событий по этой команде была переопределена, в частости массив items больше не содержит данных узлов иерархии, внутри него текстовое уведомление, сообщающее, что данные урезаны.
- Input: HierarchySearch
- Output: Page[HierarchyEntityObjectExtendedDTO]
| Команда | Путь |
|---|---|
| hierarchyEntities_listHierarchy | HTTP POST "/v1/hierarchy/list" |
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| hierarchyEntityId | InSetQuery, LikeQuery, TsQuery |
| parentId | InSetQuery |
| data.* | InSetQuery, LikeQuery, TsQuery |
| externalType | InSetQuery |
| externalEntityType | InSetQuery |
| externalId | InSetQuery |
Объекты сервиса hierarchy-entities
HierarchyEntity
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | string | да | ID |
| title | string | да | имя сущности |
| description | string | да | описание сущности |
| data | json | да | доп. данные |
| created | TimeStamp | да | дата и время создания |
| createdBy | UUID | да | ID создавшего запись пользователя |
| modified | TimeStamp | да | дата и время изменения |
| modifiedBy | UUID | да | ID изменившего запись пользователя |
| removed | Boolean | да | признак удаления |
| version | Integer | да | версия для оптимистичной блокировки |
HierarchyEntityCreateDTO
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | string | да | ID |
| title | string | да | имя сущности |
| description | string | да | описание сущности |
| data | json | нет | доп. данные |
HierarchyEntityUpdateDTO
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | string | да | ID |
| title | string | да | имя сущности |
| description | string | да | описание сущности |
| data | json | нет | доп. данные |
| version | Integer | да | версия для оптимистичной блокировки |
HierarchyEntityObject
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | UUID | да | ID |
| hierarchyEntityId | string | да | ID сущности объекта |
| parentId | UUID | нет | Родительский объект |
| data | json | да | доп. данные |
| externalType | ExternalEntityTypes | нет | код типа внешнего объекта |
| externalEntityType | string | нет | тип объекта хранящегося в ноде (код каталога или EntityType) |
| externalId | string | нет | код или UUID внешнего объекта |
| created | TimeStamp | да | дата и время создания |
| createdBy | UUID | да | ID создавшего запись пользователя |
| modified | TimeStamp | да | дата и время изменения |
| modifiedBy | UUID | да | ID изменившего запись пользователя |
| removed | Boolean | да | признак удаления |
| version | Integer | да | версия для оптимистичной блокировки |
HierarchyEntityObjectCreateDTO
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| hierarchyEntityId | string | да | ID сущности объекта |
| parentId | UUID | нет | Родительский объект |
| data | json | да | доп. данные |
| externalType | ExternalEntityTypes | нет | код типа внешнего объекта |
| externalEntityType | string | нет | тип объекта хранящегося в ноде (код каталога или EntityType) |
| externalId | string | нет | код или UUID внешнего объекта |
HierarchyEntityObjectBatchCreateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| batch | HierarchyEntityObjectCreateDTO[] | да | входные данные для создания объектов иерархии |
HierarchyEntityObjectUpdateDTO
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | UUID | да | ID |
| hierarchyEntityId | string | да | ID сущности объекта |
| parentId | UUID | нет | Родительский объект |
| data | json | да | доп. данные |
| externalType | ExternalEntityTypes | нет | код типа внешнего объекта |
| externalEntityType | string | нет | тип объекта хранящегося в ноде (код каталога или EntityType) |
| externalId | string | нет | код или UUID внешнего объекта |
| version | Integer | да | версия для оптимистичной блокировки |
HierarchyEntityObjectExtendedDTO
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| entityObject | HierarchyEntityObject | да | Сущность иерархий |
| isMatched | boolean | да | Попадает ли объект под фильтр |
| childrenCount | Integer | да | Количество дочерних объектов на следующем уровне |
| children | HierarchyEntityObjectExtendedDTO[] | нет | Дочерние объекты |
HierarchySearch
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| search | Search | да | Параметры запроса |
| expandTree | boolean | да | Раскрыть родителей для всех подходящих под фильтр объектов |
| parentId | UUID | нет | Ограничить вывод объектов указанным родителем |
ExternalEntityTypes
| Тип | Определение |
|---|---|
| catalogItem | Объект сервиса каталогов |
| entityObject | Объект сервиса моделей данных |
StoredFile
Информация о файле
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | string | да | ID файла |
| path | string | да | Путь по папкам до файла внутри бакета |
| bucket | string | да | Бакет для хранения файла |
Rag-chat: сервис для чата
Сервис принимает запросы для работы с чатом.
Команды могут приходить как по HTTP, так и через Kafka в топик rag_chat_commands.
Сервис разбит на несколько модулей, в виде sbt проектов:
domain, в котором содержатся все доменные модели и их различные представления.commands, в котором содержатся все? что связано с командами, их описанием и обработчиками.infrastructure, в котором содержится описание взаимодействия с другими сервисами.storage, содержит сервисы для сохранения и чтения их разных хранилищ доменных моделей.service, содержит сервисы бизнес логики, которые определяют правила взаимодействия компонентов между собой.boot, содержит зависимости и описание для сборки и запуска сервиса.
Информация по добавлению команд можно прочитать в описании шаблона
Локальный запуск
При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:
- PostgreSQL база по адресу
localhost:5432/rag-chat_db - Kafka по адресу
localhost:9092 - Consul по адресу
localhost:8500 - Адрес Kafka будет указан в
application.conf - Добавлены необходимые переменные окружения:
- RAG_CHAT_DB_HOST
- RAG_CHAT_DB_PORT
- RAG_CHAT_DB_NAME
- RAG_CHAT_DB_USER
- RAG_CHAT_DB_PASSWORD
Запуск из консоли с помощью SBT
RAG_CHAT_DB_HOST=localhost RAG_CHAT_DB_PORT=5432 RAG_CHAT_DB_NAME=rag-chat_db RAG_CHAT_DB_USER=postgres RAG_CHAT_DB_PASSWORD=12345 sbt boot/run
Список переменных окружения сервиса Rag-chat
Все доступные переменные окружения для настройки сервиса.
| Переменная | Тип | Обязательная | Значение по умолчанию | Описание |
|---|---|---|---|---|
| RAG_CHAT_HTTP_HOST | string | нет | 0.0.0.0 | Хост, на котором слушает HTTP-сервер |
| RAG_CHAT_HTTP_PORT | int | нет | 8999 | Порт, на котором слушает HTTP-сервер |
| RAG_CHAT_KAFKA_SERVERS | string | да | localhost:9092 | Адрес Kafka |
| RAG_CHAT_KAFKA_TOPIC | string | нет | rag_chat_commands | Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery. |
| RAG_CHAT_KAFKA_CONSUMER_GROUP | string | нет | rag_chat_consumer_group | Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске. |
| RAG_CHAT_KAFKA_PARTITIONS | int | нет | 10 | Число читаемых партиций из кафка-топика команд. |
| RAG_CHAT_KAFKA_CONSUMER_RESTART_MIN_BACKOFF | duration string | нет | 1 second | Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта) |
| RAG_CHAT_KAFKA_CONSUMER_RESTART_MAX_BACKOFF | duration string | нет | 30 seconds | Максимальное задержка до рестарта консьюмера после падения |
| RAG_CHAT_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR | double | нет | 0.2 | Рандомный фактор для вычисления задержки перед следующим рестратом консьюмера (При значении 0.2 задержка может быть до 20% больше, чем при 0) |
| RAG_CHAT_KAFKA_CONSUMER_RESTART_MAX_RESTARTS | int | нет | 5 | Максимальное число рестартов консьюмера после падения (в пределах RAG_CHAT_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN) |
| RAG_CHAT_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN | duration string | нет | 5 minutes | Временной отрезок, в который RAG_CHAT_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов |
| RAG_CHAT_KAFKA_COMMANDEVENT_TOPIC | string | да | commandevents | Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд. |
| RAG_CHAT_KAFKA_AUTH_USER | string | нет | Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены. | |
| RAG_CHAT_KAFKA_AUTH_PASSWORD | string | нет | Пароль учетной записи Kafka. | |
| RAG_CHAT_KAFKA_AUTH_TRUSTSTORE_LOCATION | string | нет | Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет. | |
| RAG_CHAT_KAFKA_AUTH_TRUSTSTORE_PASSWORD | string | нет | Пароль к хранилищу сертификатов. | |
| RAG_CHAT_KAFKA_AUTH_MODE | string | нет | Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса | |
| RAG_CHAT_KAFKA_AUTH_CONFIG | string | нет | Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig] | |
| RAG_CHAT_KAFKA_AUTH_CACHE_SIZE | int | нет | Максимальный размер кеша для Kafka producer (количество активных соединений). | |
| RAG_CHAT_KAFKA_AUTH_CACHE_TTL | duration string | нет | Время жизни Kafka producer в кеше. | |
| RAG_CHAT_KAFKA_CONNECTION_CHECK_TEST_MESSAGES_INTERVAL | duration string | нет | 4 minutes | Применяется только для producer-ов со способом аутентификации kerberos. Интервал отправки тестовых сообщений кафки в топик connectionCheck.testMessagesTopicName. Тестовые сообщения (null, service producer test) отправляются регулярно с этим интервалом. |
| RAG_CHAT_KAFKA_CONNECTION_CHECK_INTERVAL | duration string | нет | 60 seconds | Применяется только для producer-ов со способом аутентификации kerberos. Интервал проверки того, сколько тестовых сообщений было отправлено за данный период. Если количество сообщений за этот период равно количеству сообщений за прошлый период, то начинается отсчет периода без сообщений. |
| RAG_CHAT_KAFKA_CONNECTION_CHECK_FAILED_AFTER_INTERVAL | duration string | нет | 5 minutes | Применяется только для producer-ов со способом аутентификации kerberos. Максимальная продолжительность периода без успешно отправленных тестовых сообщений. По ее достижении сервис будет объявлен больным. |
| RAG_CHAT_CONSUL_ADDR | url string | нет | http://localhost:8500 | Адрес Сonsul. |
| RAG_CHAT_CONSUL_AUTH_USER | string | нет | Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены. | |
| RAG_CHAT_CONSUL_AUTH_PASSWORD | string | нет | Пароль учетной записи Сonsul. | |
| RAG_CHAT_TRACE_DURATION | boolean | нет | false | Признак необходимости трассировки выполнения команд |
| RAG_CHAT_DISCOVERABLE_ID | string | нет | another_RAG_CHAT_service_instance | ID сервиса в ServiceDiscovery |
| RAG_CHAT_DISCOVERABLE_NAME | string | нет | rag-chat | Имя сервиса в ServiceDiscovery |
| RAG_CHAT_DISCOVERABLE_HOST | string | да | localhost | Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service |
| RAG_CHAT_DISCOVERABLE_PORT | int | нет | Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер. | |
| RAG_CHAT_DISCOVERABLE_LIVETIME | duration string | нет | 2 minutes | Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым. |
| RAG_CHAT_DISCOVERABLE_HEALTHPASS | string | нет | 1 minute | Периодичность отправки health check в ServiceDiscovery |
| RAG_CHAT_SERVICE_TITLE | string | нет | Rag-chat | Название сервиса для отображения |
| RAG_CHAT_SERVICE_DESCRIPTION | string | нет | Service RAG_CHAT | Описание сервиса для отображения |
| RAG_CHAT_AKKA_HTTP_CLIENT_MAXCON | int | нет | 512 | Максимальное число одновременных исходящих HTTP-соединений |
| RAG_CHAT_AKKA_HTTP_CLIENT_MAXREQ | int | нет | 1024 | Максимальное число одновременных исходящих HTTP-запросов |
| RAG_CHAT_AKKA_HTTP_SERVER_MAXCON | int | нет | 1024 | Максимальное число одновременных входящих HTTP-соединений |
| RAG_CHAT_INTERNALCMD_ALLOW | bool | нет | false | Можно ли сервису отправлять внутрисистемные команды |
| RAG_CHAT_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD | duration string | нет | 10 minutes | Время кэширования данных по командам из CommandDiscovery |
| RAG_CHAT_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD | duration string | нет | 30 seconds | Время кэширования данных по сервисам из ServiceDiscovery |
| RAG_CHAT_DB_HOST | string | да | Хост БД | |
| RAG_CHAT_DB_PORT | int | да | Порт БД | |
| RAG_CHAT_DB_NAME | string | да | Имя базы в БД | |
| RAG_CHAT_DB_URL | jdbc url string | нет | JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы. | |
| RAG_CHAT_DB_USER | string | да | Пользователь БД | |
| RAG_CHAT_DB_PASSWORD | string | да | Пароль пользователя БД | |
| RAG_CHAT_DB_THREADS | int | нет | 10 | Количество потоков в пуле потоков для соединения с БД |
| RAG_CHAT_DB_QUEUE_SIZE | int | нет | 300 | Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей |
| RAG_CHAT_DB_CONN_MAX | int | нет | 10 | Максимальное количество одновременных подключений к БД |
| RAG_CHAT_DB_CONN_TIMEOUT | duration string | нет | 20 second | Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение. |
| RAG_CHAT_DB_ISOLATION | string | нет | READ_COMMITTED | Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE. |
| RAG_CHAT_DB_READONLY | boolean | нет | false | Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции. |
| RAG_CHAT_DB_CONN_MIN | int | нет | = DB_THREADS | Минимальное количество одновременных подключений к БД |
| RAG_CHAT_DB_VALIDATION_TIMEOUT | duration string | нет | 1 seconds | Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение. |
| RAG_CHAT_DB_IDLE_TIMEOUT | duration string | нет | 10 minutes | Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула. |
| RAG_CHAT_DB_MAX_LIFETIME | duration string | нет | 30 minutes | Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы. |
| RAG_CHAT_DB_INITIALIZATION_FAIL_FAST | string | нет | false | Deprecated, начиная с версии Slick 3.3.0. Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0. |
| RAG_CHAT_DB_LEAK_DETECTION_THRESHOLD | int | нет | 0 | Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с. |
| RAG_CHAT_DB_CONNECTION_TEST_QUERY | string | нет | SELECT 1 | Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid(). |
| RAG_CHAT_DB_REGISTER_MBEANS | boolean | нет | false | Зарегистрированы ли JMX Management Beans («MBeans») |
| RAG_CHAT_DB_AUTO_COMMIT | boolean | нет | true | Это свойство определяет то, как будут вести себя по умолчанию возвращаемые соединения относительно autocommit-а. |
| RAG_CHAT_DB_SCHEMA | string | нет | public | Устанавливает schema по умолчанию |
| RAG_CHAT_DB_ISOLATE_INTERNAL_QUERIES | boolean | нет | false | Определяет то, изолируются ли с помощью транзакций внутренние запросы пула(например запрос connection alive test). Свойство применяется только если autoCommit выключен. |
| RAG_CHAT_DB_INITIALIZATION_FAIL_TIMEOUT | int | нет | 1 | Работает, начиная с версии Slick 3.3.0. Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Любое положительное число считается числом миллисекунд для попытки получить начальное соединение;поток приложения будет заблокирован в течение этого периода. Если соединение не может быть получено до истечения этого времени,будет брошено исключение. Данный таймаут применяется после периода connectionTimeout. Если значение равно нулю (0),HikariCP попытается получить и проверить подключение. Если соединение получено,но проверка не пройдена, будет брошено исключение, и пул не будет запущен. Однако,если соединение не может быть получено, пул запустится,но последующие попытки получить соединение могут потерпеть неудачу.Значение меньше нуля пройдет любую первоначальную попытку подключения, и пул немедленно запустится,пытаясь получить соединения в фоновом режиме.Следовательно, последующие попытки получить соединение могут потерпеть неудачу. |
| RAG_CHAT_AUTHZFORCE_ADDR | string | нет | http://localhost:8080/authzforce-ce | Адрес AuthZforce server |
| RAG_CHAT_AUTHZFORCE_DOMAIN | string | нет | Доступный DomainID в AuthZforce server | |
| RAG_CHAT_LOG_LEVEL | string | нет | INFO | Общий уровень логирования в сервисе |
| RAG_CHAT_LOG_LEVEL_AKKA | string | нет | INFO | Уровень логирования для akka |
| RAG_CHAT_LOG_LEVEL_LIQUIBASE | string | нет | INFO | Уровень логирования для liquibase (миграции) |
| RAG_CHAT_LOG_LEVEL_APPLICATION | string | нет | DEBUG | Уровень логирования для application |
| RAG_CHAT_LOG_LEVEL_SLICK_STATEMENT | string | нет | DEBUG | Уровень логирования запросов, отправляемых slick в БД |
| RAG_CHAT_LOG_LEVEL_SLICK_BENCHMARK | string | нет | OFF | Уровень логирование бенчмарков выполнения запросов slick |
| RAG_CHAT_LOG_LEVEL_KAFKA_PRODUCER | string | нет | WARN | Уровень логирования конфига kafka-producer |
| RAG_CHAT_LOG_LEVEL_KAFKA_CONSUMER | string | нет | WARN | Уровень логирования конфига kafka-consumer |
| RAG_CHAT_LOG_LEVEL_HTTP_SERVER | string | нет | WARN | Уровень логирования HTTP-сервера |
| RAG_CHAT_LOG_LEVEL_AKKAHTTPSENDER | string | нет | TRACE | Уровень логирования для отправки команд через HTTP. На уровне INFO логируется трассировка, если она включена |
| RAG_CHAT_LOG_LEVEL_KAFKASENDER | string | нет | TRACE | Уровень логирования для отправки команд через Kafka. На уровне INFO логируется трассировка, если она включена |
| RAG_CHAT_LOG_LEVEL_COMMANDSTATUSCLI | string | нет | TRACE | Уровень логирования для проверки состояний команд в сервисе статусов |
| RAG_CHAT_LOG_LEVEL_TEAM_ROUTES | string | нет | TRACE | Уровень логирования для роутов /team |
| RAG_CHAT_LOG_OUTPUT | string | нет | STDOUT | Вывод лога |
| RAG_CHAT_SYSLOG_TYPE | string | нет | UDP | Тип передачи syslog |
| RAG_CHAT_LOGGING_SRC_IP | string | нет | для параметра src в логах | |
| RAG_CHAT_LOGGING_SRC_HOST | string | нет | для параметра shost в логах | |
| RAG_CHAT_LOGGING_DST_IP | string | нет | для параметра dst в логах | |
| RAG_CHAT_LOGGING_CEF_VER | string | нет | 0 | версия CEF |
| RAG_CHAT_HTTP_RESPONSE_TIMEOUT | duration string | нет | 30 seconds | Максимальное время ожидания запроса для сервиса |
| RAG_CHAT_HTTP_IDLE_TIMEOUT | duration string | нет | 31 seconds | Максимальное время простоя при ожидании ответа для сервиса |
| RAG_CHAT_HTTP_CLIENT_CONNECTION_TIMEOUT | duration string | нет | 5 seconds | Максимальное время ожидания подключения http клиента |
| RAG_CHAT_HTTP_CLIENT_REQUEST_TIMEOUT | duration string | нет | 5 seconds | Максимальное время ожидания ответа для http клиента |
| RAG_CHAT_HTTP_CLIENT_IDLE_TIMEOUT | duration string | нет | 6 seconds | Максимальное время простоя при ожидании ответа для http клиента (должно быть равным или меньше RAG_CHAT_HTTP_CLIENT_REQUEST_TIMEOUT) |
| RAG_CHAT_RAG_ENGINE_SERVICE_URL | string | нет | http://127.0.0.1:3000/ | Путь к сервису генерации RAG |
| RAG_CHAT_RAG_INDEXATION_SERVICE_URL | string | нет | http://127.0.0.1:3000/ | Путь к сервису индексации RAG |
| RAG_CHAT_FS_URI | string | да | http://localhost:9000/ | Адрес файлового хранилища |
| RAG_CHAT_FS_ACCESS_KEY_ID | string | да | minioadmin | Имя пользователя файлового хранилища |
| RAG_CHAT_FS_SECRET_ACCESS_KEY | string | да | minioadmin | Пароль пользователя файлового хранилища |
| RAG_CHAT_FS_UPLOAD_PARALLELISM | int | нет | 4 | Параллелизм для загрузки файлов |
| RAG_CHAT_FS_AUTH_MODE | string | нет | static | Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса |
| RAG_CHAT_FS_AUTH_CONFIG | string | нет | Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[FSBucketConfig] соответствует полю authConfig FSConfigRep | |
| RAG_CHAT_FS_CACHE_SIZE | int | нет | 1 | Максимальный размер кеша клиентов для хранилища файлов (количество активных соединений). |
| RAG_CHAT_FS_CACHE_TTL | duration string | нет | Время жизни клиента в кеше | |
| RAG_CHAT_INDEXATION_PROGRESS_TOPIC | string | Нет | progress | Топик, в который плагин пишет об окончании обработки. |
| RAG_CHAT_INDEXATION_CONSUMER_TOPIC | string | Нет | ragChatPluginIndexation | Основной топик плагина, в который поступает StepProgress на обработку. |
| RAG_CHAT_INDEXATION_CONSUMER_GROUP | string | Нет | rag_chat_consumer_group | Имя группы-консьюмеров плагина индексации документов в RAG. |
| RAG_CHAT_INDEXATION_CONSUMER_TOPIC_PARTITIONS | int | нет | 10 | Число читаемых партиций из кафка-топика команд. |
| RAG_CHAT_INDEXATION_PLUGIN_INFO_READABLE_NAME | string | Нет | Плагин для индексации текста документа в RAG | Значение в поле name у тех. константы плагина. |
| RAG_CHAT_INDEXATION_PLUGIN_INFO_DESCRIPTION | string | Нет | Передает тесты документов в indexation-service системы RAG | Значение в поле description у тех. константы плагина. |
| RAG_CHAT_INDEXATION_PLUGIN_INFO_VERSION | int | Нет | 1 | Значение в поле serviceVersion у тех. константы плагина. |
| RAG_CHAT_LAMP_HOST | string | Нет | router20 | Хост LAMP сервиса router |
| RAG_CHAT_LAMP_PORT | int | Нет | 9000 | Порт LAMP сервиса router |
| RAG_CHAT_LAMP_TLS | boolean | Нет | false | Признак защищенного подключения к LAMP |
| RAG_CHAT_UPLOAD_DOCS_KEY | string | Нет | ragChatFullText | Ключ для additional в таблице ObjectFile, куда запишется url файла txt с содержимым fulltext |
| RAG_CHAT_UPLOAD_DOCS_DATAMODEL_TEMP_BUCKET | string | Нет | temp | Название temp бакета на стенде |
| RAG_CHAT_UPLOAD_DOCS_DATAMODEL_BUCKET | string | Нет | datamodel | Название datamodel бакета на стенде |
| RAG_CHAT_UPLOAD_DOCS_ENTITY_TYPE | string | Нет | RagChatDoc | EntityType datamodel, который создается при запуске rag-chat, и куда добавляются файлы |
| RAG_CHAT_JOURNAL_MODE | string | нет | WriteToJournal |
Режим журналирования Nestor. Допустимые значения: WriteToJournal (Отправка в сервис журналирования), WriteToTopic (Отправка события в очередь) |
| RAG_CHAT_JOURNAL_TOPIC | string | да, если переменная EXPORTER_JOURNAL_MODE = WriteToTopic |
"" | Название очереди журналирования. Для режима WriteToJournal значение игнорируется. |
Список команд сервиса Rag-chat
В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.
В сервисе реализованы следующие команды:
- Запрос пользователя на генерацию (atomic)
- Запрос для получения доступных опций обратной связи для пользователя (atomic)
- Запрос для передачи вариантов ответа из двух сгенерированных LLM (atomic)
- Запрос для изменения названия чата (atomic)
- Запрос для работы с загруженными документами
- Запрос списка чатов (atomic)
- Запрос для получения истории конкретного чата (atomic)
- Запрос для сохранения фидбека по ответу (atomic)
- Запрос для удаления чата (atomic)
RagGenerate
Генерация ответа на основе пользовательского запроса из сервиса RAG.
- Input: RagGenerateRequest
- Output: RagGenerateResponse
| Команда | Путь |
|---|---|
| ragchat_http_RagGenerate | HTTP POST "/ragchat_http_RagGenerate" |
Payload для команды
{
"sessionId": "00001111-2222-3333-4444-555566676777",
"userQuery": "Почему небо синее?",
"docIds": [
"2345670987",
"1235987"
],
"useDatabase": true
}
Результат выполнения команды
{
"sessionId": "00001111-2222-3333-4444-555566676777",
"answers": [
{
"responseMessageId": "7014e7d9-8463-4923-a2c7-7aeb15b41b57",
"content": "потому-что"
}
],
"sources": [
{
"fileIdentity": {
"fileId": "d2becec0-13d8-4a5f-be46-b6811461944f",
"entityType": "project",
"objectId": "696e5b6c-0bcc-41e8-af0d-e575b691c6a3"
},
"segments": [
{
"start": 67,
"end": 420
},
{
"start": 175,
"end": 335
}
]
},
{
"fileIdentity": {
"fileId": "2ea83b21-3e7c-481d-8a9c-75e572195856",
"entityType": "document",
"objectId": "c0154212-2b54-4409-998e-991b96afe321"
},
"segments": [
{
"start": 332,
"end": 343
}
]
},
{
"fileIdentity": {
"fileId": "e3b3fe4b-c15c-4e04-974a-ecc5b06db4ea",
"entityType": "note",
"objectId": "d0ccd5c7-f9a2-485f-bd65-2c12b968f8ac"
},
"segments": [
{
"start": 383,
"end": 421
},
{
"start": 243,
"end": 243
}
]
}
]
}
RagSetOptions
Запрос для получения доступных опций обратной связи для пользователя.
- Input: [Search]
- Output: RagSetOptionsResponse
| Команда | Путь |
|---|---|
| ragchat_http_SetOptions | HTTP POST "/ragchat_http_SetOptions" |
Payload для команды
{
"query": "likeOption",
"context": {
"likeOption": "true"
},
"paging": {
"page": 1,
"count": 10
}
}
Результат выполнения команды
{
"items": [
{
"optionId": "61ff3b41-8124-4213-84c9-f40d1faa687b",
"optionName": "Ответ неточный"
},
{
"optionId": "5afce936-6bda-4f8f-ac73-850a37236cd3",
"optionName": "Ответ неполный"
}
],
"total": 2
}
RagListChats
Получение списка чатов.
- Input: [Search]
- Output: Page[RagChatDto]
| Команда | Путь |
|---|---|
| ragchat_http_ListChats | HTTP POST "/ragchat_http_ListChats" |
Payload для команды
{
"query": "",
"context": {},
"paging": {
"page": 1,
"count": 10
}
}
Результат выполнения команды
{
"items": [
{
"sessionId": "00001111-2222-3333-4444-555566676777",
"chatName": "Открытие ИП",
"modifiedAt": "2025-07-01T10:00:00Z"
},
{
"sessionId": "00001111-2222-3333-4444-555566676778",
"chatName": "Налоги для ИП",
"modifiedAt": "2025-07-03T12:30:00Z"
}
],
"total": 2
}
RagApplyMessage
Пользователь выбирает наиболее релевантный ответ из двух сгенерированных LLM. Инфо о фидбэке необходимо сохранить в БД для того, чтобы потом переиспользовать в дообучении/кастомизации LLM.
- Input: RagApplyMessageDto
- Output: [Unit]
| Команда | Путь |
|---|---|
| ragchat_http_ApplyMessage | HTTP POST "/ragchat_http_ApplyMessage" |
Payload для команды
{
"acceptedResponseMessageId": "cf274b47-857c-40f4-9bc8-6e63baf2d274",
"rejectedResponseMessageId": "a166c9b0-f5c3-40e7-a3ec-fecdc92e8671"
}
RagListChatsMetadata
Запрос возвращает метаданные по пользовательским диалогам
- Input: [Search]
- Output: Page[ListChatsMetadataDto]
| Команда | Путь |
|---|---|
| ragchat_http_ListChatsMetadata | HTTP POST "/ragchat_http_ListChatsMetadata" |
Payload для команды
{
"query": "",
"context": {},
"paging": {
"page": 1,
"count": 10
}
}
Результат выполнения команды
{
"items": [
{
"userId": "b98b499e-d770-4956-8759-f0b98f4320e2",
"session": {
"sessionId": "ebe6f7a7-fbc0-4320-a8b4-49157a959a37",
"createdAt": 1776293165390,
"chatName": "Налоги для ИП",
"modifiedAt": 1756293165390,
"questionCount": 100
}
},
{
"userId": "11d7de4c-336e-4775-be54-392fe59dd8d2",
"session": {
"sessionId": "3a5ea377-9ecf-4738-a65f-5feaa0733dd7",
"createdAt": 1786293165390,
"chatName": "Уголовная ответственность",
"modifiedAt": 1756293165390,
"questionCount": 34
}
}
],
"total": 2
}
RagListQueries
Получение истории отдельного чата. Для получения истории конкретного чата в запросе в "query" и в "context" указывается ключ сессии (чата) "sessionId" и ее идентификатор "00001111-2222-3333-4444-555566676778".
- Input: [Search]
- Output: Page[RagMessageDto]
| Команда | Путь |
|---|---|
| ragchat_http_ListQueries | HTTP POST "/ragchat_http_ListQueries" |
Payload для команды
{
"query": "sessionId",
"context": {
"sessionId": "00001111-2222-3333-4444-555566676778"
},
"paging": {
"page": 1,
"count": 20
}
}
Результат выполнения команды
{
"items": [
{
"role": "user",
"content": "Как открыть ИП?",
"sources": []
},
{
"role": "bot",
"content": "Вам нужно подать заявление в налоговую службу...",
"sources": [
{
"fileIdentity": {
"fileId": "abc123",
"entityType": "document",
"objectId": "xyz456"
},
"segments": [
{
"start": 25,
"end": 56
},
{
"start": 70,
"end": 85
}
]
}
]
}
],
"total": 1
}
RagUploadDocs
- команда берет каждый документ из бакета temp и через команду saveObjectBatchV2 добавляет их в entityType как объекты
- по каждому документу в датамодел бакете получаем данные из s3 (задается переменной RAG_CHAT_UPLOAD_DOCS_TEMP_BUCKET) и отправляем содержимое документа в сервис lamp, используя роут Extraction, в итоге получаем fulltext. После создаем для документа файл в бакете temp (задается переменной RAG_CHAT_UPLOAD_DOCS_DATAMODEL_TEMP_BUCKET), содержимое которого - fulltext.
- после этого мы вызываем команду saveFilesAdditionalInfoV2 в Data-model, чтобы добавить файл в поле key (задается переменной RAG_CHAT_UPLOAD_DOCS_KEY) и скопировать файл из temp в бакет datamodel, в итоге там должно быть 2 файла - изначальный и файл с содержимым fulltext из lamp сервиса.
- после этого добавляем fulltext в dto, добавляем файлы после saveObjectBatchV2 (туда добавили в поле additionalData нужные файлы с fulltext), и пересылаем его в rag-сервис, возвращаем ответ
- Input: RagUploadDocsDto
- Output: RagUploadDocsResponse
| Команда | Путь |
|---|---|
| ragchat_http_UploadDocs | HTTP POST "/ragchat_http_UploadDocs" |
Payload для команды
{
"sessionId": "dff63c66-821a-4185-addd-7d2618419d3c",
"fileIds": [
"d5b44cfe-0eff-4c93-bbdd-8e61d3fa9a68",
"17837a03-6689-492c-a720-102d7bb3e0b7"
]
}
Результат выполнения команды
{
"sessionId": "00001111-2222-3333-4444-555566676778"
}
RagSetChatName
Изменение названия чата.
- Input: RagSetChatNameDto
- Output: [String]
| Команда | Путь |
|---|---|
| ragchat_http_SetChatName | HTTP POST "/ragchat_http_SetChatName" |
Payload для команды
{
"sessionId": "00001111-2222-3333-4444-555566676777",
"chatName": "newChatName"
}
Результат выполнения команды
"newChatName"
RagSetFeedback
Пользователь ставит ответу LLM бинарную оценку (лайк/дизлайк). Инфо о фидбэке необходимо сохранить в БД для того, чтобы потом переиспользовать в дообучении/кастомизации LLM.
- Input: RagSetFeedbackRequest
- Output: [Unit]
| Команда | Путь |
|---|---|
| ragchat_http_SetFeedback | HTTP POST "/ragchat_http_SetFeedback" |
Payload для команды
{
"responseMessageId": "1f71723d-7522-4667-bfdd-4878ab424016",
"likeOption": true,
"commentOptions": [
{
"optionId": "eebb54af-49f8-4b68-af56-cfc1aea4839c"
},
{
"optionId": "96a1611a-6bae-4864-a4dc-a9b6f34a06c1"
}
],
"comment": "Доработайте ваш RAG, пожалуйста."
}
RagDeleteChat
Пользователь удаляет выбранный чат.
- Input: RagDeleteChatDto
- Output: [Unit]
| Команда | Путь |
|---|---|
| ragchat_http_DeleteChat | HTTP POST "/ragchat_http_DeleteChat" |
Payload для команды
{
"sessionId": "cf274b47-857c-40f4-9bc8-6e63baf2d274"
}
RagGenerateRequest
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| sessionId | UUID | нет | ID сессии чата (можно передавать null или не передавать) |
| userQuery | String | да | Запрос пользователя |
| docIds | String[] | да | ID документов, которые загрузил пользователь |
| useDatabase | Boolean | нет | False - искать только по загруженному документу. True - искать по документу и также по БД (по дефолту) |
RagGenerateResponse
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| sessionId | String | нет | ID сессии пользователя |
| answers | RagAnswersDto[] | да | Сгенерированный LLM ответ |
| sources | RagSourceDto[] | да | Источники, на которые ссылалась модель при генерации ответа |
RagAnswersDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| responseMessageId | String | да | ID ответа LLM в чате |
| content | String | да | Сгенерированный LLM ответ |
RagSourceDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| fileIdentity | FileIdentity | да | Идентификация файла |
| segments | RagSegmentDto[] | да | Сегменты, которые нужно подсветить на фронте |
FileIdentity
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| fileId | String | да | ID файла |
| entityType | String | да | Наименование типа объекта |
| objectId | String | да | ID объекта |
RagSegmentDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| start | Int | да | Начало спана для сегмента |
| end | Int | да | Конец спана для сегмента |
RagChatDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| sessionId | String | да | ID сессии пользователя |
| chatName | String | да | Наименование чата |
| modifiedAt | Timestamp | да | Дата и время последнего изменения |
RagMessageDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| role | String | да | Роль участника сообщения: "user" — пользователь, "bot" — ответы LLM |
| content | String | да | Конкретное сообщение в текстовом виде |
| sources | RagSourceDto[] | да | Источники, на которые ссылалась модель при генерации ответа |
ListChatsMetadataDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| userId | String | да | ID сессии пользователя |
| session | SessionMetadata | да | Метаинформация сессии |
SessionMetadata
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| sessionId | String | да | ID сессии пользователя |
| createdAt | Timestamp | да | Дата и время создания сессии чата |
| chatName | String | да | Наименование чата |
| modifiedAt | Timestamp | да | Дата и время последнего изменения чата |
| questionCount | Int | да | Количество вопросов, заданных пользователем в рамках текущей сессии. |
RagSetChatNameDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| sessionId | String | да | ID сессии пользователя |
| chatName | VarChar64 (String) | да | Наименование чата (ограничено 64 символами) |
RagApplyMessageDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| acceptedResponseMessageId | UUID | да | ID принятого ответа |
| rejectedResponseMessageId | UUID | да | ID отклоненного ответа |
RagUploadDocsDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| sessionId | String | нет | ID сессии пользователя |
| fileIds | [UUID[]] | да | Загруженные документы (из temp) |
RagUploadDocsResponse
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| sessionId | String | да | ID сессии пользователя |
RagSetOptionsResponse
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| items | RagSetOptionsItem[] | да | Опции, которые может выбрать пользователь для обратной связи на ответ системы |
| total | String | да | Общее количество опций в БД |
RagSetOptionsItem
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| optionId | UUID | да | ID опции |
| optionName | String | да | Название опции |
RagSetFeedbackRequest
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| responseMessageId | UUID | да | ID ответа LLM, на которую дал оценку пользователь |
| likeOption | Boolean | да | Обратная связь пользователя |
| commentOptions | [CommentOption[]] | нет | Массив объектов, в котором передаются выбранные пользователем опции обратной связи |
| comment | String | нет | Комментарий, который оставил пользователь о качестве ответа модели |
CommentOption
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| optionId | UUID | да | ID конкретной опции обратной связи, которую выбрал пользователь |
RagDeleteChatDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| sessionId | String | да | ID сессии чата |
Split-plugin: сервис для чата
Сервис принимает запросы для работы с чатом.
Команды могут приходить как по HTTP, так и через Kafka в топик split_plugin_commands.
Сервис разбит на несколько модулей, в виде sbt проектов:
domain, в котором содержатся все доменные модели и их различные представления.commands, в котором содержатся все? что связано с командами, их описанием и обработчиками.infrastructure, в котором содержится описание взаимодействия с другими сервисами.storage, содержит сервисы для сохранения и чтения их разных хранилищ доменных моделей.service, содержит сервисы бизнес логики, которые определяют правила взаимодействия компонентов между собой.boot, содержит зависимости и описание для сборки и запуска сервиса.
Информация по добавлению команд можно прочитать в описании шаблона
Локальный запуск
При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:
- PostgreSQL база по адресу
localhost:5432/split-plugin - Kafka по адресу
localhost:9092 - Consul по адресу
localhost:8500 - Адрес Kafka будет указан в
application.conf - Добавлены необходимые переменные окружения:
- SPLIT_PLUGIN_DB_HOST
- SPLIT_PLUGIN_DB_PORT
- SPLIT_PLUGIN_DB_NAME
- SPLIT_PLUGIN_DB_USER
- SPLIT_PLUGIN_DB_PASSWORD
Запуск из консоли с помощью SBT
SPLIT_PLUGIN_DB_HOST=localhost SPLIT_PLUGIN_DB_PORT=5432 SPLIT_PLUGIN_DB_NAME=split-plugin SPLIT_PLUGIN_DB_USER=postgres SPLIT_PLUGIN_DB_PASSWORD=12345 sbt boot/run
Список переменных окружения сервиса Split-plugin
Все доступные переменные окружения для настройки сервиса.
| Переменная | Тип | Обязательная | Значение по умолчанию | Описание |
|---|---|---|---|---|
| SPLIT_PLUGIN_HTTP_HOST | string | нет | 0.0.0.0 | Хост, на котором слушает HTTP-сервер |
| SPLIT_PLUGIN_HTTP_PORT | int | нет | 8999 | Порт, на котором слушает HTTP-сервер |
| SPLIT_PLUGIN_KAFKA_SERVERS | string | да | localhost:9092 | Адрес Kafka |
| SPLIT_PLUGIN_KAFKA_TOPIC | string | нет | split_plugin_commands | Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery. |
| SPLIT_PLUGIN_KAFKA_CONSUMER_GROUP | string | нет | split_plugin_consumer_group | Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске. |
| SPLIT_PLUGIN_KAFKA_PARTITIONS | int | нет | 10 | Число читаемых партиций из кафка-топика команд. |
| SPLIT_PLUGIN_KAFKA_CONSUMER_RESTART_MIN_BACKOFF | duration string | нет | 1 second | Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта) |
| SPLIT_PLUGIN_KAFKA_CONSUMER_RESTART_MAX_BACKOFF | duration string | нет | 30 seconds | Максимальное задержка до рестарта консьюмера после падения |
| SPLIT_PLUGIN_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR | double | нет | 0.2 | Рандомный фактор для вычисления задержки перед следующим рестратом консьюмера (При значении 0.2 задержка может быть до 20% больше, чем при 0) |
| SPLIT_PLUGIN_KAFKA_CONSUMER_RESTART_MAX_RESTARTS | int | нет | 5 | Максимальное число рестартов консьюмера после падения (в пределах SPLIT_PLUGIN_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN) |
| SPLIT_PLUGIN_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN | duration string | нет | 5 minutes | Временной отрезок, в который SPLIT_PLUGIN_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов |
| SPLIT_PLUGIN_KAFKA_COMMANDEVENT_TOPIC | string | да | commandevents | Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд. |
| SPLIT_PLUGIN_KAFKA_AUTH_USER | string | нет | Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены. | |
| SPLIT_PLUGIN_KAFKA_AUTH_PASSWORD | string | нет | Пароль учетной записи Kafka. | |
| SPLIT_PLUGIN_KAFKA_AUTH_TRUSTSTORE_LOCATION | string | нет | Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет. | |
| SPLIT_PLUGIN_KAFKA_AUTH_TRUSTSTORE_PASSWORD | string | нет | Пароль к хранилищу сертификатов. | |
| SPLIT_PLUGIN_KAFKA_AUTH_MODE | string | нет | Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса | |
| SPLIT_PLUGIN_KAFKA_AUTH_CONFIG | string | нет | Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig] | |
| SPLIT_PLUGIN_KAFKA_AUTH_CACHE_SIZE | int | нет | Максимальный размер кеша для Kafka producer (количество активных соединений). | |
| SPLIT_PLUGIN_KAFKA_AUTH_CACHE_TTL | duration string | нет | Время жизни Kafka producer в кеше. | |
| SPLIT_PLUGIN_KAFKA_CONNECTION_CHECK_TEST_MESSAGES_INTERVAL | duration string | нет | 4 minutes | Применяется только для producer-ов со способом аутентификации kerberos. Интервал отправки тестовых сообщений кафки в топик connectionCheck.testMessagesTopicName. Тестовые сообщения (null, service producer test) отправляются регулярно с этим интервалом. |
| SPLIT_PLUGIN_KAFKA_CONNECTION_CHECK_INTERVAL | duration string | нет | 60 seconds | Применяется только для producer-ов со способом аутентификации kerberos. Интервал проверки того, сколько тестовых сообщений было отправлено за данный период. Если количество сообщений за этот период равно количеству сообщений за прошлый период, то начинается отсчет периода без сообщений. |
| SPLIT_PLUGIN_KAFKA_CONNECTION_CHECK_FAILED_AFTER_INTERVAL | duration string | нет | 5 minutes | Применяется только для producer-ов со способом аутентификации kerberos. Максимальная продолжительность периода без успешно отправленных тестовых сообщений. По ее достижении сервис будет объявлен больным. |
| SPLIT_PLUGIN_CONSUL_ADDR | url string | нет | http://localhost:8500 | Адрес Сonsul. |
| SPLIT_PLUGIN_CONSUL_AUTH_USER | string | нет | Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены. | |
| SPLIT_PLUGIN_CONSUL_AUTH_PASSWORD | string | нет | Пароль учетной записи Сonsul. | |
| SPLIT_PLUGIN_TRACE_DURATION | boolean | нет | false | Признак необходимости трассировки выполнения команд |
| SPLIT_PLUGIN_DISCOVERABLE_ID | string | нет | another_SPLIT_PLUGIN_service_instance | ID сервиса в ServiceDiscovery |
| SPLIT_PLUGIN_DISCOVERABLE_NAME | string | нет | split-plugin | Имя сервиса в ServiceDiscovery |
| SPLIT_PLUGIN_DISCOVERABLE_HOST | string | да | localhost | Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service |
| SPLIT_PLUGIN_DISCOVERABLE_PORT | int | нет | Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер. | |
| SPLIT_PLUGIN_DISCOVERABLE_LIVETIME | duration string | нет | 2 minutes | Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым. |
| SPLIT_PLUGIN_DISCOVERABLE_HEALTHPASS | string | нет | 1 minute | Периодичность отправки health check в ServiceDiscovery |
| SPLIT_PLUGIN_SERVICE_TITLE | string | нет | Split-plugin | Название сервиса для отображения |
| SPLIT_PLUGIN_SERVICE_DESCRIPTION | string | нет | Service split-plugin | Описание сервиса для отображения |
| SPLIT_PLUGIN_AKKA_HTTP_CLIENT_MAXCON | int | нет | 512 | Максимальное число одновременных исходящих HTTP-соединений |
| SPLIT_PLUGIN_AKKA_HTTP_CLIENT_MAXREQ | int | нет | 1024 | Максимальное число одновременных исходящих HTTP-запросов |
| SPLIT_PLUGIN_AKKA_HTTP_SERVER_MAXCON | int | нет | 1024 | Максимальное число одновременных входящих HTTP-соединений |
| SPLIT_PLUGIN_INTERNALCMD_ALLOW | bool | нет | false | Можно ли сервису отправлять внутрисистемные команды |
| SPLIT_PLUGIN_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD | duration string | нет | 10 minutes | Время кэширования данных по командам из CommandDiscovery |
| SPLIT_PLUGIN_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD | duration string | нет | 30 seconds | Время кэширования данных по сервисам из ServiceDiscovery |
| SPLIT_PLUGIN_DB_HOST | string | да | Хост БД | |
| SPLIT_PLUGIN_DB_PORT | int | да | Порт БД | |
| SPLIT_PLUGIN_DB_NAME | string | да | Имя базы в БД | |
| SPLIT_PLUGIN_DB_URL | jdbc url string | нет | JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы. | |
| SPLIT_PLUGIN_DB_USER | string | да | Пользователь БД | |
| SPLIT_PLUGIN_DB_PASSWORD | string | да | Пароль пользователя БД | |
| SPLIT_PLUGIN_DB_THREADS | int | нет | 10 | Количество потоков в пуле потоков для соединения с БД |
| SPLIT_PLUGIN_DB_QUEUE_SIZE | int | нет | 300 | Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей |
| SPLIT_PLUGIN_DB_CONN_MAX | int | нет | 10 | Максимальное количество одновременных подключений к БД |
| SPLIT_PLUGIN_DB_CONN_TIMEOUT | duration string | нет | 20 second | Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение. |
| SPLIT_PLUGIN_DB_ISOLATION | string | нет | READ_COMMITTED | Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE. |
| SPLIT_PLUGIN_DB_READONLY | boolean | нет | false | Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции. |
| SPLIT_PLUGIN_DB_CONN_MIN | int | нет | = DB_THREADS | Минимальное количество одновременных подключений к БД |
| SPLIT_PLUGIN_DB_VALIDATION_TIMEOUT | duration string | нет | 1 seconds | Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение. |
| SPLIT_PLUGIN_DB_IDLE_TIMEOUT | duration string | нет | 10 minutes | Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула. |
| SPLIT_PLUGIN_DB_MAX_LIFETIME | duration string | нет | 30 minutes | Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы. |
| SPLIT_PLUGIN_DB_INITIALIZATION_FAIL_FAST | string | нет | false | Deprecated, начиная с версии Slick 3.3.0. Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0. |
| SPLIT_PLUGIN_DB_LEAK_DETECTION_THRESHOLD | int | нет | 0 | Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с. |
| SPLIT_PLUGIN_DB_CONNECTION_TEST_QUERY | string | нет | SELECT 1 | Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid(). |
| SPLIT_PLUGIN_DB_REGISTER_MBEANS | boolean | нет | false | Зарегистрированы ли JMX Management Beans («MBeans») |
| SPLIT_PLUGIN_DB_AUTO_COMMIT | boolean | нет | true | Это свойство определяет то, как будут вести себя по умолчанию возвращаемые соединения относительно autocommit-а. |
| SPLIT_PLUGIN_DB_SCHEMA | string | нет | public | Устанавливает schema по умолчанию |
| SPLIT_PLUGIN_DB_ISOLATE_INTERNAL_QUERIES | boolean | нет | false | Определяет то, изолируются ли с помощью транзакций внутренние запросы пула(например запрос connection alive test). Свойство применяется только если autoCommit выключен. |
| SPLIT_PLUGIN_DB_INITIALIZATION_FAIL_TIMEOUT | int | нет | 1 | Работает, начиная с версии Slick 3.3.0. Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Любое положительное число считается числом миллисекунд для попытки получить начальное соединение;поток приложения будет заблокирован в течение этого периода. Если соединение не может быть получено до истечения этого времени,будет брошено исключение. Данный таймаут применяется после периода connectionTimeout. Если значение равно нулю (0),HikariCP попытается получить и проверить подключение. Если соединение получено,но проверка не пройдена, будет брошено исключение, и пул не будет запущен. Однако,если соединение не может быть получено, пул запустится,но последующие попытки получить соединение могут потерпеть неудачу.Значение меньше нуля пройдет любую первоначальную попытку подключения, и пул немедленно запустится,пытаясь получить соединения в фоновом режиме.Следовательно, последующие попытки получить соединение могут потерпеть неудачу. |
| SPLIT_PLUGIN_AUTHZFORCE_ADDR | string | нет | http://localhost:8080/authzforce-ce | Адрес AuthZforce server |
| SPLIT_PLUGIN_AUTHZFORCE_DOMAIN | string | нет | Доступный DomainID в AuthZforce server | |
| SPLIT_PLUGIN_AUTHZFORCE_AUTHORIZER_KIND | string | нет | oberto | Вид авторизатора, который используется в сервисе. Допустимые значения: authzforce, oberto. При указании неизвестного значения будет использовано значение по-умолчанию. |
| SPLIT_PLUGIN_LOG_LEVEL | string | нет | INFO | Общий уровень логирования в сервисе |
| SPLIT_PLUGIN_LOG_LEVEL_AKKA | string | нет | INFO | Уровень логирования для akka |
| SPLIT_PLUGIN_LOG_LEVEL_LIQUIBASE | string | нет | INFO | Уровень логирования для liquibase (миграции) |
| SPLIT_PLUGIN_LOG_LEVEL_APPLICATION | string | нет | DEBUG | Уровень логирования для application |
| SPLIT_PLUGIN_LOG_LEVEL_SLICK_STATEMENT | string | нет | DEBUG | Уровень логирования запросов, отправляемых slick в БД |
| SPLIT_PLUGIN_LOG_LEVEL_SLICK_BENCHMARK | string | нет | OFF | Уровень логирование бенчмарков выполнения запросов slick |
| SPLIT_PLUGIN_LOG_LEVEL_KAFKA_PRODUCER | string | нет | WARN | Уровень логирования конфига kafka-producer |
| SPLIT_PLUGIN_LOG_LEVEL_KAFKA_CONSUMER | string | нет | WARN | Уровень логирования конфига kafka-consumer |
| SPLIT_PLUGIN_LOG_LEVEL_HTTP_SERVER | string | нет | WARN | Уровень логирования HTTP-сервера |
| SPLIT_PLUGIN_LOG_LEVEL_AKKAHTTPSENDER | string | нет | TRACE | Уровень логирования для отправки команд через HTTP. На уровне INFO логируется трассировка, если она включена |
| SPLIT_PLUGIN_LOG_LEVEL_KAFKASENDER | string | нет | TRACE | Уровень логирования для отправки команд через Kafka. На уровне INFO логируется трассировка, если она включена |
| SPLIT_PLUGIN_LOG_LEVEL_COMMANDSTATUSCLI | string | нет | TRACE | Уровень логирования для проверки состояний команд в сервисе статусов |
| SPLIT_PLUGIN_LOG_LEVEL_TEAM_ROUTES | string | нет | TRACE | Уровень логирования для роутов /team |
| SPLIT_PLUGIN_LOG_OUTPUT | string | нет | STDOUT | Вывод лога |
| SPLIT_PLUGIN_SYSLOG_TYPE | string | нет | UDP | Тип передачи syslog |
| SPLIT_PLUGIN_LOGGING_SRC_IP | string | нет | для параметра src в логах | |
| SPLIT_PLUGIN_LOGGING_SRC_HOST | string | нет | для параметра shost в логах | |
| SPLIT_PLUGIN_LOGGING_DST_IP | string | нет | для параметра dst в логах | |
| SPLIT_PLUGIN_LOGGING_CEF_VER | string | нет | 0 | версия CEF |
| SPLIT_PLUGIN_HTTP_CLIENT_CONNECTION_TIMEOUT | duration string | нет | 5 seconds | Максимальное время ожидания подключения http клиента |
| SPLIT_PLUGIN_HTTP_CLIENT_REQUEST_TIMEOUT | duration string | нет | 5 seconds | Максимальное время ожидания ответа для http клиента |
| SPLIT_PLUGIN_SPLIT_SERVICE_URL | string | нет | http://127.0.0.1:3000/ | Путь к сервису разделения текста |
| SPLIT_PLUGIN_FS_URI | string | да | http://localhost:9000/ | Адрес файлового хранилища |
| SPLIT_PLUGIN_FS_ACCESS_KEY_ID | string | да | minioadmin | Имя пользователя файлового хранилища |
| SPLIT_PLUGIN_FS_SECRET_ACCESS_KEY | string | да | minioadmin | Пароль пользователя файлового хранилища |
| SPLIT_PLUGIN_FS_UPLOAD_PARALLELISM | int | нет | 4 | Параллелизм для загрузки файлов |
| SPLIT_PLUGIN_FS_AUTH_MODE | string | нет | static | Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса |
| SPLIT_PLUGIN_FS_AUTH_CONFIG | string | нет | Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[FSBucketConfig] соответствует полю authConfig FSConfigRep | |
| SPLIT_PLUGIN_FS_CACHE_SIZE | int | нет | 1 | Максимальный размер кеша клиентов для хранилища файлов (количество активных соединений). |
| SPLIT_PLUGIN_FS_CACHE_TTL | duration string | нет | Время жизни клиента в кеше | |
| SPLIT_PLUGIN_TEXT_SPLITTER_PROGRESS_TOPIC | string | Нет | progress | Топик, в который плагин пишет об окончании обработки. |
| SPLIT_PLUGIN_TEXT_SPLITTER_CONSUMER_TOPIC | string | Нет | splitPlugin | Основной топик плагина, в который поступает StepProgress на обработку. |
| SPLIT_PLUGIN_TEXT_SPLITTER_CONSUMER_GROUP | string | Нет | split_plugin_consumer_group | Имя группы-консьюмеров плагина индексации документов в RAG. |
| SPLIT_PLUGIN_TEXT_SPLITTER_CONSUMER_TOPIC_PARTITIONS | int | нет | 10 | Число читаемых партиций из кафка-топика команд. |
| SPLIT_PLUGIN_TEXT_SPLITTER_PLUGIN_INFO_READABLE_NAME | string | Нет | Плагин для индексации текста документа в RAG | Значение в поле name у тех. константы плагина. |
| SPLIT_PLUGIN_TEXT_SPLITTER_PLUGIN_INFO_DESCRIPTION | string | Нет | Передает тесты документов в indexation-service системы RAG | Значение в поле description у тех. константы плагина. |
| SPLIT_PLUGIN_TEXT_SPLITTER_PLUGIN_INFO_VERSION | int | Нет | 1 | Значение в поле serviceVersion у тех. константы плагина. |
| SPLIT_PLUGIN_CREATE_ENTITY_TYPE | string | Да | Код типа сущности, которая будет создана в data-model для каждой статьи | |
| SPLIT_PLUGIN_CREATE_ENTITY_TITLE_FIELD | string | Нет | title | Название поля в data-model для хранения заголовка/названия статьи |
| SPLIT_PLUGIN_CREATE_ENTITY_FILE_FIELD | string | Нет | Название поля в data-model для хранения ссылки на файл статьи в S3 | |
| SPLIT_PLUGIN_CREATE_ENTITY_DOC_TYPE | string | Нет | lawbook | Тип документа, передаваемый в split-service для выбора корректного алгоритма разделения. |
| SPLIT_PLUGIN_CREATE_ENTITY_RELATION_FIELD | string | Нет | Название поля в data-model для хранения связи с родительским документом | |
| SPLIT_PLUGIN_CREATE_ENTITY_START_FIELD | string | Нет | Название поля в data-model для хранения начальной позиции сегмента в исходном документе. | |
| SPLIT_PLUGIN_CREATE_ENTITY_END_FIELD | string | Нет | Название поля в data-model для хранения конечной позиции сегмента в исходном документе. | |
| SPLIT_PLUGIN_CREATE_ENTITY_PARALLELISM | int | Нет | 4 | Количество потоков одновременно пишущих в сервис data-model |
| SPLIT_PLUGIN_CREATE_MESSAGE_LIMIT | string | Да | 2000 | Количество объектов в пачке сохраняемой в data-model, которое мы можем отправить за раз. Ограничено сверху максимальным размером сообщения kafka |
| SPLIT_PLUGIN_TEMP_BUCKET | string | Да | Bucket для временных файлов | |
SPLIT_PLUGIN_JOURNAL_MODE |
string | нет | WriteToJournal |
Режим журналирования Nestor. Допустимые значения: WriteToJournal (Отправка в сервис журналирования), WriteToTopic (Отправка события в очередь) |
SPLIT_PLUGIN_JOURNAL_TOPIC |
string | да, если переменная WriteToTopic |
"" | Название очереди журналирования. Для режима WriteToJournal значение игнорируется. |
Список команд сервиса Split-plugin
В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.
В сервисе реализована 1 команда:
- Запрос пользователя на генерацию (atomic)
RagGenerate
Генерация ответа на основе пользовательского запроса из сервиса RAG.
- Input: RagGenerateRequest
- Output: RagGenerateResponse
| Команда | Путь |
|---|---|
| splitplugin_http_RagGenerate | HTTP POST "/splitplugin_http_RagGenerate" |
Payload для команды
{
"sessionId": "00001111-2222-3333-4444-555566676777",
"userQuery": "Почему небо синее?",
"docIds": [
"2345670987",
"1235987"
],
"searchOption": true
}
Результат выполнения команды
{
"answer": "потому-что",
"sources": [
{
"fileIdentity": {
"fileId": "d2becec0-13d8-4a5f-be46-b6811461944f",
"entityType": "project",
"objectId": "696e5b6c-0bcc-41e8-af0d-e575b691c6a3"
},
"segments": [
{
"start": 67,
"end": 420
},
{
"start": 175,
"end": 335
}
]
},
{
"fileIdentity": {
"fileId": "2ea83b21-3e7c-481d-8a9c-75e572195856",
"entityType": "document",
"objectId": "c0154212-2b54-4409-998e-991b96afe321"
},
"segments": [
{
"start": 332,
"end": 343
}
]
},
{
"fileIdentity": {
"fileId": "e3b3fe4b-c15c-4e04-974a-ecc5b06db4ea",
"entityType": "note",
"objectId": "d0ccd5c7-f9a2-485f-bd65-2c12b968f8ac"
},
"segments": [
{
"start": 383,
"end": 421
},
{
"start": 243,
"end": 243
}
]
}
]
}
RagGenerateRequest
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| sessionId | UUID | да | ID сессии чата |
| userQuery | String | да | Запрос пользователя |
| docIds | String[] | да | ID документов, которые загрузил пользователь |
| searchOption | Boolean | нет | False - искать только по загруженному документу. True - искать по документу и также по БД (по дефолту) |
RagGenerateResponse
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| answer | String | да | Сгенерированный LLM ответ |
| sources | Source[] | да | Источники, на которые ссылалась модель при генерации ответа |
Source
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| fileIdentity | FileIdentity | да | Идентификация файла |
| segments | Segment[] | да | Сегменты, которые нужно подсветить на фронте |
FileIdentity
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| fileId | String | да | ID файла |
| entityType | String | да | Наименование типа объекта |
| objectId | String | да | ID объекта |
Segment
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| start | Int | да | Начало спана для сегмента |
| end | Int | да | Конец спана для сегмента |
Tolka: сервис аналитики
Сервис подготавливает данные для аналитики, построения графиков/таблиц. Состояние хранится в PostgreSQL.
Команды могут приходить как по HTTP, так и через Kafka в топик tolka_commands.
В сервисе реализованы следующие команды:
- Построение аналитики по близким документам
- Построение сводных данных по близким документам
- Построение данных для пользовательского виджета по близким документам
- Построение сводных данных по похожим документам
- Сохранение настроек для порогов метрик в аналитике
- Получение настроек для порогов метрик в аналитике
- Создание настроек для типа сущности в аналитике
- Редактирование настроек для типа сущности в аналитике
- Удаление настроек для типа сущности в аналитике
- Получение списка настроек для типов сущности в аналитике
- Получение списка всех виджетов аналитики
- Создание нового виджета аналитики
- Редактирование виджета аналитики
- Удаление виджета аналитики
- Изменение порядка виджетов аналитики
Optimistic Lock
У нескольких команд реализован механизм оптимистичных блокировок. Для этого в данных присутствует поле version.
Задача оптимистичных блокировок - предотвратить одновременное редактирование объекта из двух открытых форм.
Сначала фронтэнд запрашивает данные объекта и получает в ответе версию данных - поле version.
Он прикладывает эту версию в ответе. Если на бэкэнде она совпадает с исходной (не было других модификаций),
тогда данные сохраняются, а версия поднимается. Иначе сохранения не происходит, данные не перетираются.
Сервис разбит на несколько модулей, в виде sbt проектов:
domain, в котором содержатся все доменные модели и их различные представления.commands, в котором содержатся все? что связано с командами, их описанием и обработчиками.infrastructure, в котором содержится описание взаимодействия с другими сервисами.storage, содержит сервисы для сохранения и чтения их разных хранилищ доменных моделей.service, содержит сервисы бизнес логики, которые определяют правила взаимодействия компонентов между собой.utils, в котором содержатся разные хелперы.boot, содержит зависимости и описание для сборки и запуска сервиса.
Информация по добавлению команд можно прочитать в описании шаблона
Конфигурирование Tolka
Требования к запуску Tolka
Запуск сервиса осуществляется локально через sbt, на стенде в docker на jvm.
Для корректной минимальной работы сервиса требуется обязательное подключение к PostgreSQL, Kafka, Consul. Для настройки подключения к ним нужно заполнить обязательные переменные окружения из раздела ниже.
Для нормальной работы сервису дополнительно требуется окружение Verdi: CommandStatus, ApiGateway. В этом случае нужно уделить внимание настройкам, связанным с ServiceDiscovery и CommandDiscovery.
Во время работы, сервис общается с другими сервисами, т.е. они нужны только в момент выполнения команд. Список сервисов приведен в таблице ниже.
| Команда | Внешние сервисы |
|---|---|
| tolka_BuildRelatednessAnalytics | full-text-search |
| tolka_BuildRelatednessSummary | full-text-search |
| tolka_BuildRelatednessWidgetData | data-model, full-text-search |
| tolka_BuildSimilaritySummary | full-text-search |
| tolka_CreateWidget | data-model, full-text-search (при создании виджета типа BarChart) |
| tolka_UpdateWidget | data-model, full-text-search (при создании виджета типа BarChart) |
Запуск Tolka из консоли с помощью SBT
TOLKA_DB_HOST=localhost TOLKA_DB_PORT=5432 TOLKA_DB_NAME=tolka_db TOLKA_DB_USER=postgres TOLKA_DB_PASSWORD=12345 sbt boot/run
Список переменных окружения Tolka
Все доступные переменные окружения для настройки сервиса.
| Переменная | Тип | Обязательная | Значение по умолчанию | Описание |
|---|---|---|---|---|
| TOLKA_HTTP_HOST | string | нет | "0.0.0.0" | Хост, на котором слушает HTTP-сервер |
| TOLKA_HTTP_PORT | int | нет | 8192 | Порт, на котором слушает HTTP-сервер |
| TOLKA_KAFKA_SERVERS | string | да | "localhost:9092" | Адрес Kafka |
| TOLKA_KAFKA_TOPIC | string | нет | "tolka_commands" | Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery. |
| TOLKA_KAFKA_CONSUMER_GROUP | string | нет | "tolka_consumer_group" | Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске. |
| TOLKA_KAFKA_PARTITIONS | int | нет | 10 | Число читаемых партиций из кафка-топика команд. |
| TOLKA_KAFKA_CONSUMER_RESTART_MIN_BACKOFF | duration string | нет | 1 second | Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта) |
| TOLKA_KAFKA_CONSUMER_RESTART_MAX_BACKOFF | duration string | нет | 30 seconds | Максимальное задержка до рестарта консьюмера после падения |
| TOLKA_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR | double | нет | 0.2 | Коэффициент величины дополнительной случайной задержки(jitter) относительно основной задержки (При значении 0.2 задержка может быть до 20% больше, чем при 0). Если после умножения задержки на TOLKA_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR получится меньше 1 миллисекунды, то jitter будет приравнен к нулю. |
| TOLKA_CONSUMER_PER_MESSAGE_RESTART_MAX_RESTARTS | int | нет | 2 | Максимальное количество раз, которое консьюмер перезапустится с неизменной очередью сообщений(в пределах DATA_MODEL_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN), прежде чем проигнорировать сообщение, на котором происходит ошибка (Указано количество рестартов, а не прочтений. Если TOLKA_KAFKA_CONSUMER_RESTART_MAX_RESTARTS = 2, то ошибочное сообщение будет обработано 3 раза, после чего произойдет 3ий рестарт и оно будет проигнорировано). Если указать 0, то перезапуск произойдет, но сообщение будет обработано только в первый раз, когда произошла ошибка. Если указать значение меньше 0, то перезапуски все равно будут происходить, но игнорирование сообщений, вызывающих ошибку, будет отключено. |
| TOLKA_CONSUMER_PER_MESSAGE_RESTART_CACHE_SIZE | int | нет | 100 | Для каждого сообщения счетчик перепрочтений хранится в кэше. Максимальное количество значений в этом кэше. |
| TOLKA_CONSUMER_PER_MESSAGE_RESTART_CACHE_TTL | duration string | нет | 5 minutes | Для каждого сообщения счетчик перепрочтений хранится в кэше.Максимальное время жизни элемента в этом кэше. В случае отсутствия значения время жизни элемента не будет ограничено. |
| TOLKA_CONSUMER_RESTART_MAX_RESTARTS | int | нет | 5 | Максимальное число рестартов консьюмера после падения (в пределах TOLKA_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN).После превышения этого числа сервис будет объявлен больным. Все рестарты для каждого отдельного сообщения увеличивают и общий счетчик рестартов консьюмера, поэтому при использовании TOLKA_KAFKA_CONSUMER_PER_MESSAGE_RESTART_MAX_RESTARTS нужно указывать TOLKA_KAFKA_CONSUMER_RESTART_MAX_RESTARTS > TOLKA_KAFKA_CONSUMER_PER_MESSAGE_RESTART_MAX_RESTARTS или не указывать TOLKA_KAFKA_CONSUMER_PER_MESSAGE_RESTART_MAX_RESTARTS совсем. |
| TOLKA_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN | duration string | нет | 5 minutes | Временной отрезок, в который TOLKA_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов |
| TOLKA_KAFKA_COMMANDEVENT_TOPIC | string | да | "commandevents" | Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд. |
| TOLKA_KAFKA_AUTH_USER | string | нет | "" | Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены. |
| TOLKA_KAFKA_AUTH_PASSWORD | string | нет | "" | Пароль учетной записи Kafka. |
| TOLKA_KAFKA_AUTH_PRINCIPAL | string | нет | "" | Principal учетной записи Kafka в Kerberos(в случае соединения с kafka через Kerberos). |
| TOLKA_KAFKA_AUTH_KEYTAB_PATH | string | нет | "" | Путь до keytab-файла(в случае соединения с kafka через Kerberos). |
| TOLKA_KAFKA_AUTH_TRUSTSTORE_LOCATION | string | нет | "" | Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применяться не будет. |
| TOLKA_KAFKA_AUTH_TRUSTSTORE_PASSWORD | string | нет | "" | Пароль к хранилищу сертификатов. |
| TOLKA_KAFKA_AUTH_MODE | string | нет | "static" | Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса |
| TOLKA_KAFKA_AUTH_CONFIG | string | нет | "" | Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig]. Переменная соответствует полю authConfig из KafkaAuthSettings. |
| TOLKA_KAFKA_AUTH_CACHE_SIZE | int | нет | Максимальный размер кеша для Kafka producer (количество активных соединений). | |
| TOLKA_KAFKA_AUTH_CACHE_TTL | duration string | нет | Время жизни Kafka producer в кеше. | |
| TOLKA_KAFKA_CONNECTION_CHECK_TEST_MESSAGES_INTERVAL | duration string | нет | 4 minutes | Применяется только для producer-ов со способом аутентификации kerberos. Интервал отправки тестовых сообщений кафки в топик connectionCheck.testMessagesTopicName. Тестовые сообщения (null, service producer test) отправляются регулярно с этим интервалом. |
| TOLKA_KAFKA_CONNECTION_CHECK_INTERVAL | duration string | нет | 60 seconds | Применяется только для producer-ов со способом аутентификации kerberos. Интервал проверки того, сколько тестовых сообщений было отправлено за данный период. Если количество сообщений за этот период равно количеству сообщений за прошлый период, то начинается отсчет периода без сообщений. |
| TOLKA_KAFKA_CONNECTION_CHECK_FAILED_AFTER_INTERVAL | duration string | нет | 5 minutes | Применяется только для producer-ов со способом аутентификации kerberos. Максимальная продолжительность периода без успешно отправленных тестовых сообщений. По ее достижении сервис будет объявлен больным. |
| TOLKA_CONSUL_ADDR | url string | нет | "http://localhost:8500" | Адрес Сonsul. |
| TOLKA_CONSUL_AUTH_USER | string | нет | "" | Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены. |
| TOLKA_CONSUL_AUTH_PASSWORD | string | нет | "" | Пароль учетной записи Сonsul. |
| TOLKA_TRACE_DURATION | boolean | нет | false | Признак необходимости трассировки выполнения команд |
| TOLKA_DISCOVERABLE_ID | string | нет | "another_TOLKA_service_instance" | ID сервиса в ServiceDiscovery |
| TOLKA_DISCOVERABLE_NAME | string | нет | "tolka" | Имя сервиса в ServiceDiscovery |
| TOLKA_DISCOVERABLE_HOST | string | да | "localhost" | Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service |
| TOLKA_DISCOVERABLE_PORT | int | нет | Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер. | |
| TOLKA_DISCOVERABLE_LIVETIME | duration string | нет | 2 minutes | Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым. |
| TOLKA_DISCOVERABLE_HEALTHPASS | string | нет | 1 minute | Периодичность отправки health check в ServiceDiscovery |
| TOLKA_SERVICE_TITLE | string | нет | "Tolka" | Название сервиса для отображения |
| TOLKA_SERVICE_DESCRIPTION | string | нет | "Сервис аналитики" | Описание сервиса для отображения |
| TOLKA_AKKA_HTTP_CLIENT_MAXCON | int | нет | 512 | Максимальное число одновременных исходящих HTTP-соединений |
| TOLKA_AKKA_HTTP_CLIENT_MAXREQ | int | нет | 1024 | Максимальное число одновременных исходящих HTTP-запросов |
| TOLKA_AKKA_HTTP_SERVER_MAXCON | int | нет | 1024 | Максимальное число одновременных входящих HTTP-соединений |
| TOLKA_INTERNALCMD_ALLOW | bool | нет | false | Можно ли сервису отправлять внутрисистемные команды |
| TOLKA_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD | duration string | нет | 10 minutes | Время кэширования данных по командам из CommandDiscovery |
| TOLKA_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD | duration string | нет | 30 seconds | Время кэширования данных по сервисам из ServiceDiscovery |
| TOLKA_DB_HOST | string | да | Хост БД | |
| TOLKA_DB_PORT | int | да | Порт БД | |
| TOLKA_DB_NAME | string | да | Имя базы в БД | |
| TOLKA_DB_URL | jdbc url string | нет | JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы. | |
| TOLKA_DB_USER | string | да | Пользователь БД | |
| TOLKA_DB_PASSWORD | string | да | Пароль пользователя БД | |
| TOLKA_DB_THREADS | int | нет | 10 | Количество потоков в пуле потоков для соединения с БД |
| TOLKA_DB_QUEUE_SIZE | int | нет | 300 | Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей |
| TOLKA_DB_CONN_MAX | int | нет | 10 | Максимальное количество одновременных подключений к БД |
| TOLKA_DB_CONN_TIMEOUT | duration string | нет | 20 second | Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение. |
| TOLKA_DB_ISOLATION | string | нет | "READ_COMMITTED" | Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE. |
| TOLKA_DB_READONLY | boolean | нет | false | Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции. |
| TOLKA_DB_CONN_MIN | int | нет | = DB_THREADS | Минимальное количество одновременных подключений к БД |
| TOLKA_DB_VALIDATION_TIMEOUT | duration string | нет | 1 seconds | Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение. |
| TOLKA_DB_IDLE_TIMEOUT | duration string | нет | 10 minutes | Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула. |
| TOLKA_DB_MAX_LIFETIME | duration string | нет | 30 minutes | Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы. |
| TOLKA_DB_INITIALIZATION_FAIL_FAST | string | нет | false | Deprecated, начиная с версии Slick 3.3.0. Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0. |
| TOLKA_DB_LEAK_DETECTION_THRESHOLD | int | нет | 0 | Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с. |
| TOLKA_DB_CONNECTION_TEST_QUERY | string | нет | "SELECT 1" | Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid(). |
| TOLKA_DB_AUTO_COMMIT | boolean | нет | true | Это свойство определяет то, как будут вести себя по умолчанию возвращаемые соединения относительно autocommit-а. |
| TOLKA_DB_SCHEMA | string | нет | "public" | Устанавливает schema по умолчанию |
| TOLKA_DB_ISOLATE_INTERNAL_QUERIES | boolean | нет | false | Определяет то, изолируются ли с помощью транзакций внутренние запросы пула(например запрос connection alive test). Свойство применяется только если autoCommit выключен. |
| TOLKA_DB_INITIALIZATION_FAIL_TIMEOUT | int | нет | 1 | Работает, начиная с версии Slick 3.3.0. Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Любое положительное число считается числом миллисекунд для попытки получить начальное соединение;поток приложения будет заблокирован в течение этого периода. Если соединение не может быть получено до истечения этого времени,будет брошено исключение. Данный таймаут применяется после периода connectionTimeout. Если значение равно нулю (0),HikariCP попытается получить и проверить подключение. Если соединение получено,но проверка не пройдена, будет брошено исключение, и пул не будет запущен. Однако,если соединение не может быть получено, пул запустится,но последующие попытки получить соединение могут потерпеть неудачу.Значение меньше нуля пройдет любую первоначальную попытку подключения, и пул немедленно запустится,пытаясь получить соединения в фоновом режиме.Следовательно, последующие попытки получить соединение могут потерпеть неудачу. |
| TOLKA_DB_REGISTER_MBEANS | boolean | нет | false | Зарегистрированы ли JMX Management Beans («MBeans») |
| TOLKA_FS_URI | string | да | http://localhost:9000/ | Адрес файлового хранилища |
| TOLKA_FS_ACCESS_KEY_ID | string | да | minioadmin | Имя пользователя файлового хранилища |
| TOLKA_FS_SECRET_ACCESS_KEY | string | да | minioadmin | Пароль пользователя файлового хранилища |
| TOLKA_FS_UPLOAD_PARALLELISM | int | нет | 4 | Параллелизм для загрузки файлов |
| TOLKA_FS_AUTH_MODE | string | нет | static | Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса |
| TOLKA_FS_AUTH_CONFIG | string | нет | "" | Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[FSBucketConfig] соответствует полю authConfig FSConfigRep |
| TOLKA_FS_CACHE_SIZE | int | нет | 1 | Максимальный размер кеша клиентов для хранилища файлов (количество активных соединений). |
| TOLKA_FS_CACHE_TTL | duration string | нет | Время жизни клиента в кеше | |
| TOLKA_FS_RETRY_ATTEMPTS | int | нет | 5 | Количество ретраев, которое будет произведено в случае Exception-а в операции FSClient-а и при вычитывании стрима в get операциях FSClient-а. |
| TOLKA_FS_RETRY_DELAY | duration string | нет | 10 millis | Задержка между ретраями операций FSClient-а. |
| TOLKA_AUTHZFORCE_ADDR | string | нет | "http://localhost:8080/authzforce-ce" | Адрес AuthZforce server |
| TOLKA_AUTHZFORCE_DOMAIN | string | нет | "" | Доступный DomainID в AuthZforce server |
| TOLKA_AUTHZFORCE_CONNECT_TIMEOUT | string | нет | 10 seconds | Таймаут на подключение к AuthZforce server |
| TOLKA_EXTERNAL_MIGRATIONS_RETRY_DELAY | duration string | нет | 15 seconds | Задержка между повторными попытками запуска внешних миграций |
| TOLKA_EXTERNAL_MIGRATIONS_RETRY_ATTEMPTS | int | нет | 5 | Максимальное количество попыток запуска внешних миграций |
| TOLKA_DM_SCHEMA_CACHE_SIZE | int | нет | 128 | Максимальный размер кэша для json schema |
| TOLKA_DM_SCHEMA_CACHE_TTL | duration string | нет | 5 minute | Время жизни элементов в кэше для json schema |
| TOLKA_LAMP_FILE_CACHE_SIZE | int | нет | 64 | Максимальный размер кэша для файлов из lamp |
| TOLKA_LAMP_FILE_CACHE_TTL | duration string | нет | 30 minute | Время жизни элементов в кэше для файлов из lamp |
| TOLKA_FTS_MAPPING_CACHE_SIZE | int | нет | 64 | Максимальный размер кэша для маппингов в полнотекстовом поиске |
| TOLKA_FTS_MAPPING_CACHE_TTL | duration string | нет | 5 minute | Время жизни элементов в кэше для маппингов в полнотекстовом поиске |
| TOLKA_DM_OBJECT_PAGE_SIZE | int | нет | 100 | Размер страницы при выборке объектов из data-model |
| TOLKA_AUTHORIZER_KIND | string | нет | "authzforce" | Вид авторизатора, который используется в сервисе. Допустимые значения: "authzforce", "oberto". При указании неизвестного значения будет использовано значение по-умолчанию. |
| TOLKA_SENDERLIB_COMMANDS_HTTP_RETRY_ATTEMPTS | int | нет | 5 | Поле attempts из RetrySettings |
| TOLKA_SENDERLIB_COMMANDS_HTTP_RETRY_DELAY | duration string | нет | "5 seconds" | Поле delay из RetrySettings |
| TOLKA_SENDERLIB_COMMANDS_HTTP_RETRY_KIND | string | нет | "OnSomeExceptions(ConnectException)" | CommandResultRetryConditionKind |
TOLKA_JOURNAL_MODE |
string | нет | WriteToJournal |
Режим журналирования Nestor. Допустимые значения: WriteToJournal (Отправка в сервис журналирования), WriteToTopic (Отправка события в очередь) |
TOLKA_JOURNAL_TOPIC |
string | да, если переменная WriteToTopic |
"" | Название очереди журналирования. Для режима WriteToJournal значение игнорируется. |
| TOLKA_SENDERLIB_CONSUL_CONNECTION_RETRY_MAX | int | нет | 5 | Количество попыток переподключения к Consul |
| TOLKA_SENDERLIB_CONSUL_CONNECTION_RETRY_DELAY | duration string | нет | 1 second | Задержка при попытках переподключения к Consul |
Список команд сервиса Tolka
Список реализованных в сервисе команд, моделей EntityType и действий Actions, которые можно использовать при настройке авторизации.
| Название команды | EntityType | Actions | UIAction (в attila) |
|---|---|---|---|
| tolka_BuildRelatednessAnalytics | RelatednessAnalytics | View | ViewAnalytics |
| tolka_BuildRelatednessSummary | RelatednessAnalytics | View | ViewAnalytics |
| tolka_BuildRelatednessWidgetData | RelatednessAnalytics | View | ViewAnalytics |
| tolka_BuildSimilaritySummary | SimilarityAnalytics | View | ViewAnalytics |
| tolka_AddMetricThresholds | MetricThreshold | Create | ChangeAnalyticsSettings |
| tolka_GetMetricThresholds | MetricThreshold | View | ViewAnalytics |
| tolka_ListAllWidgets | Widget | View | ViewAnalytics |
| tolka_CreateWidget | Widget | Create | ChangeAnalyticsSettings |
| tolka_UpdateWidget | Widget | Update | ChangeAnalyticsSettings |
| tolka_DeleteWidget | Widget | Delete | ChangeAnalyticsSettings |
| tolka_ReorderWidgets | Widget | Update | ChangeAnalyticsSettings |
| tolka_CreateAnalyticsEntity | AnalyticsEntity | Create | ChangeAnalyticsSettings |
| tolka_UpdateAnalyticsEntity | AnalyticsEntity | Update | ChangeAnalyticsSettings |
| tolka_DeleteAnalyticsEntity | AnalyticsEntity | Delete | ChangeAnalyticsSettings |
| tolka_ListAnalyticsEntity | AnalyticsEntity | View | ViewAnalytics |
В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.
BuildRelatednessAnalytics (tolka)
На входе файлы с результатами plagiarismSearch
{
"data": [
"processing/10b1011b-9db3-4186-a53c-971016030068",
"processing/e95024a7-4dc3-4107-8df4-68f47e98679a",
"processing/c3907091-f0de-4990-ac9b-68f1d9221f7b"
],
"settings": {
"thresholds": {
"high": {
"from": 80,
"to": 100,
"color": "#F95959"
},
"medium": {
"from": 50,
"to": 80,
"color": "#F2AF4A"
},
"low": {
"from": 10,
"to": 50,
"color": "#BB85E5"
}
},
"entities": [
{
"code": "document",
"color": "#2F80ED",
"fieldName": "publishYear"
},
{
"code": "patent",
"color": "#27AE60",
"fieldName": "year"
}
]
}
}
На выходе данные для построения аналитики
{
"buckets": {
"1998": {
"total": 1,
"entities": [
{
"code": "patent",
"count": 1
}
]
},
"1990": {
"total": 2,
"entities": [
{
"code": "document",
"count": 2
}
]
},
"1980": {
"total": 1,
"entities": [
{
"code": "document",
"count": 1
}
]
}
},
"summary": {
"total": 4,
"high": {
"patent": {
"total": 1,
"items": [
{
"objectId": "6e896d39-0439-4af4-85fd-115749bdb29a",
"relatedness": 0.98
}
]
},
"document": {
"total": 1,
"items": [
{
"objectId": "82f79ca0-4caf-4503-8d1c-db3af2718fff",
"relatedness": 0.82
}
]
}
},
"medium": {
"document": {
"total": 1,
"items": [
{
"objectId": "947cb658-f2a1-4bbf-b856-579d80fc1466",
"relatedness": 0.66
}
]
}
},
"low": {
"document": {
"total": 1,
"items": [
{
"objectId": "082d61e6-11ac-4bf5-978d-ff24378fc57f",
"relatedness": 0.41
}
]
}
}
}
}
Возвращает данные для построения аналитики по близким документам, на основе результатов plagiarismSearch (Lamp).
В данные аналитики попадают только те объекты, которые присутствуют в индексе полнотекстового поиска (FullTextSearch).
Имя команды для вызова: tolka_BuildRelatednessAnalytics. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: BuildAnalyticsDTO
- На выходе: RelatednessAnalyticsResponse
BuildRelatednessSummary (tolka)
На входе файлы с результатами plagiarismSearch, и настройки, если необходимы отличные от настроек по умолчанию.
{
"data": [
"processing/10b1011b-9db3-4186-a53c-971016030068",
"processing/e95024a7-4dc3-4107-8df4-68f47e98679a",
"processing/c3907091-f0de-4990-ac9b-68f1d9221f7b"
],
"settings": {
"thresholds": {
"high": {
"from": 80,
"to": 100
},
"medium": {
"from": 50,
"to": 80
},
"low": {
"from": 10,
"to": 50
}
},
"entities": [
"RfbrDocument"
]
}
}
На выходе данные для построения системного виджета сводных данных
{
"thresholds": {
"high": {
"RfbrDocument": {
"total": 1,
"items": [
{
"objectId": "47d6f786-562b-43f0-9999-5e1098d8cf6e",
"relatedness": 0.95595397,
"metric": 0.95595397
}
]
}
},
"medium": {
"RfbrDocument": {
"total": 1,
"items": [
{
"objectId": "9465d4f9-c19d-400e-8353-433174e49d81",
"relatedness": 0.55595397,
"metric": 0.55595397
}
]
}
},
"low": {
"RfbrDocument": {
"total": 2,
"items": [
{
"objectId": "0d6f3e9f-27ef-4bd4-bdd2-2d66a07c707a",
"relatedness": 0.15188915,
"metric": 0.15188915
},
{
"objectId": "7840164e-b40a-44ee-8e3f-88fde1a96681",
"relatedness": 0.025739253,
"metric": 0.025739253
}
]
}
}
},
"total": 4
}
Возвращает данные для построения системного виджета сводных данных по близким документам, на основе
результатов plagiarismSearch (Lamp).
В данные аналитики попадают только те объекты, которые присутствуют в индексе полнотекстового поиска (FullTextSearch).
Имя команды для вызова: tolka_BuildRelatednessSummary. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: BuildSummaryDTO
- На выходе: ObjectsSummary
BuildRelatednessWidgetData (tolka)
На входе ID виджета, файлы с результатами Lamp-Similarity, и настройки, если необходимы отличные от настроек по умолчанию.
{
"widgetId": "3ef4639f-dc0b-4bd8-80f9-ecba44e45aef",
"data": [
"temp/5322db77-4cfe-4d6a-a905-e8469bb81dca"
],
"settings": {
"thresholds": {
"high": {
"from": 80,
"to": 100,
"color": "#F95959"
},
"medium": {
"from": 50,
"to": 80,
"color": "#F2AF4A"
},
"low": {
"from": 0,
"to": 50,
"color": "#BB85E5"
}
},
"entities": [
"RfbrDocument"
]
}
}
На выходе данные для пользовательского виджета
{
"widgetId": "3ef4639f-dc0b-4bd8-80f9-ecba44e45aef",
"buckets": {
"2016": {
"entities": [
{
"code": "RfbrDocument",
"count": 2
}
],
"total": 2
},
"1999": {
"entities": [
{
"code": "RfbrDocument",
"count": 1
}
],
"total": 1
},
"2002": {
"entities": [
{
"code": "RfbrDocument",
"count": 1
}
],
"total": 1
}
}
}
Возвращает данные для построения пользовательского виджета, на основе результатов plagiarism (Lamp).
В данные аналитики попадают только те объекты, которые присутствуют в индексе полнотекстового поиска (FullTextSearch).
Имя команды для вызова: tolka_BuildRelatednessWidgetData. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: BuildWidgetDataDTO
- На выходе: RelatednessWidgetData
BuildSimilaritySummary (tolka)
На входе файлы с результатами Lamp-Similarity, и настройки, если необходимы отличные от настроек по умолчанию.
{
"data": [
"processing/10b1011b-9db3-4186-a53c-971016030068",
"processing/e95024a7-4dc3-4107-8df4-68f47e98679a",
"processing/c3907091-f0de-4990-ac9b-68f1d9221f7b"
],
"settings": {
"thresholds": {
"high": {
"from": 80,
"to": 100
},
"medium": {
"from": 50,
"to": 80
},
"low": {
"from": 10,
"to": 50
}
},
"entities": [
"RfbrDocument"
]
}
}
На выходе данные для построения системного виджета сводных данных
{
"thresholds": {
"high": {
"RfbrDocument": {
"total": 1,
"items": [
{
"objectId": "47d6f786-562b-43f0-9999-5e1098d8cf6e",
"metric": 0.95595397
}
]
}
},
"medium": {
"RfbrDocument": {
"total": 1,
"items": [
{
"objectId": "9465d4f9-c19d-400e-8353-433174e49d81",
"metric": 0.55595397
}
]
}
},
"low": {
"RfbrDocument": {
"total": 2,
"items": [
{
"objectId": "0d6f3e9f-27ef-4bd4-bdd2-2d66a07c707a",
"metric": 0.15188915
},
{
"objectId": "7840164e-b40a-44ee-8e3f-88fde1a96681",
"metric": 0.025739253
}
]
}
}
},
"total": 4
}
Возвращает данные для построения системного виджета сводных данных по близким документам, на основе
результатов similarity (Lamp).
В данные аналитики попадают только те объекты, которые присутствуют в индексе полнотекстового поиска (FullTextSearch).
Имя команды для вызова: tolka_BuildSimilaritySummary. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: BuildSummaryDTO
- На выходе: ObjectsSummary
AddMetricThresholds (tolka)
На входе настройки порогов для метрик аналитики
{
"id": "00000000-0000-0000-0000-000000000000",
"version": 1,
"thresholds": [
{
"name": "high",
"title": "high",
"interval": {
"from": 80,
"to": 100
},
"color": "#F95959"
},
{
"name": "medium",
"title": "medium",
"interval": {
"from": 50,
"to": 80
},
"color": "#F2AF4A"
},
{
"name": "low",
"title": "low",
"interval": {
"from": 10,
"to": 50
},
"color": "#BB85E5"
}
]
}
На выходе результат сохранения настроек
true
Сохраняет настройки для порогов метрики в конкретной аналитике. Метрика всегда зависит от запрашиваемой аналитики. Применение настройки для порогов зависит от реализации аналитики. Список реализованных аналитик можно посмотреть в списке команд.
Имя команды для вызова: tolka_AddMetricThresholds. Поддерживается асинхронный и синхронный вызов.
- На входе: ThresholdsSetting
- На выходе: Boolean
GetMetricThresholds (tolka)
На выходе настоойки порогов для метрик аналитики
{
"id": "00000000-0000-0000-0000-000000000000",
"version": 1,
"thresholds": [
{
"name": "high",
"title": "high",
"interval": {
"from": 80,
"to": 100
},
"color": "#F95959"
},
{
"name": "medium",
"title": "medium",
"interval": {
"from": 50,
"to": 80
},
"color": "#F2AF4A"
},
{
"name": "low",
"title": "low",
"interval": {
"from": 10,
"to": 50
},
"color": "#BB85E5"
}
]
}
Возвращает настройки для порогов метрики в конкретной аналитике. Список реализованых аналитик можно посмотреть в списке команд.
Имя команды для вызова: tolka_GetMetricThresholds. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: -
- На выходе: ThresholdsSetting
ListAllWidgets (tolka)
На входе ничего
На выходе список всех виджетов в системе
{
"status": "Completed",
"timestamp": 1680860689954,
"value": [
{
"id": "4f2b79f7-4c74-480a-9999-4dac31fcd629",
"title": "TestWidget1",
"widgetType": "analyticsWidgetType_barChart",
"settings": {
"showLegend": true,
"entities": [
{
"code": "elibBook",
"fieldName": "bookNote"
},
{
"code": "elibJournalArticle",
"fieldName": "issueEDN"
}
],
"fieldType": "string"
},
"visibility": true,
"position": 1,
"version": 1
},
{
"id": "55b03d4f-2b35-49bc-a754-0b93d3d81642",
"title": "TestWidget2",
"widgetType": "analyticsWidgetType_linearBar",
"settings": {
"showLegend": true,
"entities": [
"elibBook",
"elibPublication"
]
},
"visibility": true,
"position": 2,
"version": 1
}
]
}
Возвращает полный перечень всех виджетов в системе.
Имя команды для вызова: tolka_ListAllWidgets. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: -
- На выходе: List[Widget]
CreateWidget (tolka)
На входе параметры нового виджета
{
"title": "Test",
"widgetType": "analyticsWidgetType_barChart",
"settings": {
"showLegend": true,
"fieldType": "string",
"entities": [
{
"code": "elibBook",
"fieldName": "bookNote"
},
{
"code": "elibJournalArticle",
"fieldName": "issueEDN"
}
]
},
"visibility": true
}
На выходе ID нового виджета
"2112b855-9beb-4f76-8e51-818a16aadf60"
Сохраняет новый виджет аналитики в системе и возвращает его ID.
Имя команды для вызова: tolka_CreateWidget. Поддерживается асинхронный и синхронный вызов.
- На входе: CreateWidgetDTO
- На выходе: WidgetId
UpdateWidget (tolka)
На входе новые параметры виджета
{
"id": "2112b855-9beb-4f76-8e51-818a16aadf60",
"title": "Test",
"widgetType": "analyticsWidgetType_barChart",
"settings": {
"showLegend": false,
"fieldType": "string",
"entities": [
{
"code": "elibBook",
"fieldName": "bookNote"
},
{
"code": "elibJournalArticle",
"fieldName": "issueEDN"
}
]
},
"visibility": false,
"version": 2
}
На выходе признак успешности
true
Обновляет виджет аналитики.
Имя команды для вызова: tolka_UpdateWidget. Поддерживается асинхронный и синхронный вызов.
- На входе: UpdateWidgetDTO
- На выходе: Boolean
DeleteWidget (tolka)
На входе ID удаляемого виджета
"2112b855-9beb-4f76-8e51-818a16aadf60"
На выходе признак успешности
true
Удаляет виджет аналитики из системы.
Имя команды для вызова: tolka_DeleteWidget. Поддерживается асинхронный и синхронный вызов.
- На входе: WidgetId
- На выходе: Boolean
ReorderWidgets (tolka)
На входе данные, необходимые для перестановки местами двух виджетов
{
"first": {
"id": "89c1c73e-5051-454d-9557-b6bbedd4d956",
"newPosition": 9,
"version": 2
},
"second": {
"id": "a21bf274-dc8c-4f96-91ef-2c3c20e21f6d",
"newPosition": 10,
"version": 2
}
}
На выходе признак успешности
true
Переставляет местами два виджета, изменяя их позицию в списке.
Имя команды для вызова: tolka_ReorderWidgets. Поддерживается асинхронный и синхронный вызов.
- На входе: ReorderWidgetsDTO
- На выходе: Boolean
CreateAnalyticsEntity (tolka)
На входе настройки сущности в аналитике
{
"code": "MyEntity",
"color": "#EBC425",
"visibleOnDashboard": true
}
На выходе идентификатор созданных настроек
"cdb00bc8-7516-4349-8b88-dc58d0b6e1c1"
Создает настройки для типа сущности в конкретной аналитике.
Имя команды для вызова: tolka_CreateAnalyticsEntity. Поддерживается асинхронный и синхронный вызов.
- На входе: AnalyticsEntityCreateDTO
- На выходе: AnalyticsEntityId
UpdateAnalyticsEntity (tolka)
На входе настройки сущности в аналитике
{
"id": "cdb00bc8-7516-4349-8b88-dc58d0b6e1c1",
"version": 1,
"code": "MyEntity",
"color": "#FFD40A",
"visibleOnDashboard": true
}
На выходе результат изменения настроек
true
Изменяет настройки для типа сущности в конкретной аналитике.
Имя команды для вызова: tolka_UpdateAnalyticsEntity. Поддерживается асинхронный и синхронный вызов.
- На входе: AnalyticsEntityUpdateDTO
- На выходе: Boolean
DeleteAnalyticsEntity (tolka)
На входе идентификатор настройки сущности в аналитике
"cdb00bc8-7516-4349-8b88-dc58d0b6e1c1"
На выходе результат удаления настроек
true
Удаляет настройки для типа сущности в конкретной аналитике.
Имя команды для вызова: tolka_DeleteAnalyticsEntity. Поддерживается асинхронный и синхронный вызов.
- На входе: AnalyticsEntityId
- На выходе: Boolean
ListAnalyticsEntity (tolka)
На входе фильтры для получения настроек для сущностей в аналитике
{
"query": "",
"context": {},
"sorting": {
"fieldName": "created",
"order": "Asc"
},
"paging": {
"page": 1,
"count": 10
}
}
На выходе идентификатор созданных настроек
{
"total": 2,
"items": [
{
"id": "cdb00bc8-7516-4349-8b88-dc58d0b6e1c1",
"version": 2,
"code": "MyEntity",
"color": "#FFD40A",
"visibleOnDashboard": true
},
{
"id": "75ec78a8-616a-46ce-a270-abfbe0515fd3",
"version": 1,
"code": "AnotherEntity",
"color": "#CC6CDC",
"visibleOnDashboard": false
}
]
}
Возвращает список настроек для типов сущностей используемых в аналитике. Применение настройки зависит от реализации аналитики. Список реализованых аналитик можно посмотреть в списке команд.
Имя команды для вызова: tolka_ListAnalyticsEntity. Поддерживается синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: Search
- На выходе: Page[AnalyticsEntity]
Модели сервиса Tolka
BuildAnalyticsDTO (tolka)
Исходные данные для построения аналитики.
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| data | List[StoredFile] | Да | Список ссылок на файлы с результатами LAMP | - Значения в списке не пустые - Элементы списка должны быть StoredFile закодированными в виде строки (URL) |
| settings | SummaryAnalysisSettingsOld | Да | Настройки для построения аналитики |
SummaryAnalysisSettingsOld (tolka)
Идентификатор конкретной версии политики.
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| thresholds | Thresholds | Да | Информация об интервалах | |
| entities | List[GraphEntity] | Да | Информация о сущностях, которые требуются в аналитике |
Threshold (tolka)
Информация о интервале, который используются для группировки объектов по значению определенной метрики
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| name | AsciiCode | Да | Человекочитаемое наименование интервала | Не пустое, 'A-Z' 'a-z' '0-9' '_' |
| title | Title | Да | Человекочитаемое наименование интервала | Не пустое, не длиннее 256 символов |
| color | HexColor | Да | Цвет для выделения объектов в данном интервале | Формат Hexadecimal color |
| interval | Interval | Да | Пороги значений для интервала | Интервалы не должны пересекаться |
GraphEntity (tolka)
Информация о сущности.
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| code | String | Да | Код сущности | |
| color | String | Да | Цвет, связанный с данной сущностью | |
| fieldName | String | Да | Название поля, которое содержит значение для целевой метрики |
BuildSummaryDTO (tolka)
Параметры для построения системного виджета сводных данных.
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| data | List[StoredFile] | Да | Список ссылок на файлы с результатами LAMP | - Значения в списке не пустые - Элементы списка должны быть StoredFile закодированными в виде строки (URL) |
| settings | AnalysisSettings | Нет | Настройки для построения аналитики |
BuildWidgetDataDTO (tolka)
Параметры для построения данных для пользовательского виджета.
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| widgetId | WidgetId | Да | ID виджета, для которого строятся данные | |
| data | List[StoredFile] | Да | Список ссылок на файлы с результатами LAMP | - Значения в списке не пустые - Элементы списка должны быть StoredFile закодированными в виде строки (URL) |
| settings | AnalysisSettings | Нет | Настройки для построения аналитики |
AnalysisSettings (tolka)
Настройки для построения аналитики. Если какие-либо настройки не указаны, то используется соответствующие глобальные настройки.
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| thresholds | Map[String, Interval] | Нет | Информация об интервалах | |
| entities | List[EntityTypeId] | Нет | Коды сущностей, которые требуются в аналитике |
Interval (tolka)
Закрытый интервал [from, to].
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| from | Int | Да | Значение, с которого начинается интервал. Значение входит в интервал. | Больше или равно 0 |
| to | Int | Да | Значение, до которого продолжается интервал. Значение входит в интервал. | Меньше или равно 100 |
RelatednessAnalyticsResponse (tolka)
Данные для построения аналитики по relatedness, сгруппированные по интервалам.
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| buckets | Map[String, AggregateBucketValue] | Да | Список бакетов, которые появляются в результате агрегации объектов по определенному значению (key в Map) | |
| summary | RelatednessSummaryOld | Да | Объекты, сгруппированные по типу сущности, которые попадают в интервал. Границы интервала соответствуют настройкам для Relatedness. |
RelatednessSummaryOld (tolka)
Данные для построения аналитики по relatedness, сгруппированные по интервалам.
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| total | Long | Да | Общее количество объектов. | |
| high | ObjectsRelatedness | Да | Объекты, сгруппированные по типу сущности, которые попадают в интервал. Границы интервала соответствуют настройкам для Relatedness. | |
| medium | ObjectsRelatedness | Да | Объекты, сгруппированные по типу сущности, которые попадают в интервал. Границы интервала соответствуют настройкам для Relatedness. | |
| low | ObjectsRelatedness | Да | Объекты, сгруппированные по типу сущности, которые попадают в интервал. Границы интервала соответствуют настройкам для Relatedness. |
ObjectsSummary (tolka)
Данные для построения сводных данных по объектам, сгруппированные по интервалам, на основе метрики.
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| total | Long | Да | Общее количество объектов. |
| thresholds | Map[String, ObjectsIntervalByMetric] | Да | Ключ - код интервала; значение - объекты, которые попадают в интервал |
RelatednessWidgetData (tolka)
Данные для пользовательского виджета
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| widgetId | WidgetId | Да | ID виджета, для которого предназначены данные |
| buckets | Map[String, AggregateBucketValue] | Для виджетов типа BarChart |
Список бакетов, которые появляются в результате агрегации объектов по определенному значению. |
| summary | ObjectsSummary | Для виджетов типа LinearBar, PieChart, SummaryTable |
Данные для построения сводных данных, сгруппированные по интервалам. |
ObjectsIntervalByMetric (tolka)
Объекты, сгруппированные по требуемому параметру (например типу сущности или значению поля сущности), которые попадают в
интервал.
Соответствует типу Map[String, Page[ObjectIdWithMetric]].
ObjectIdWithMetric (tolka)
Идентификатор объекта и значение метрики. Метрика зависит от вызванной команды.
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| objectId | ObjectId | Да | Идентификатор объекта | Не пустое |
| metric | Float | Да | Значение метрики | от 0.0 до 1.0 |
| relatedness | Float | Да | Deprecated. Значение relatedness | от 0.0 до 1.0 |
AnalyticsEntityId (tolka)
Соответствует типу UUID.
AsciiCode (tolka)
Соответствует типу String. Формат должен соответствовать regular expression "^[A-Za-z0-9_]$".
HexColor (tolka)
Соответствует типу String.
Hexadecimal формат для обозначения цвета: #HexHexHexHex, где Hex это 2 символа в диапазонах 0-9 и a-f (регистр
значения не имеет).
Первые три Hex обязательны (общая длина = 1+6), а четверный опционален и редко используется (обозначает прозрачность).
ThresholdsSettingId (tolka)
Соответствует типу UUID.
WidgetId (tolka)
Соответствует типу UUID.
ThresholdsSetting (tolka)
Настройки для порогов метрики в аналитике.
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| id | ThresholdsSettingId | Нет | Идентификатор настройки. Если не задан, будет присвоен ID глобальных настроек "00000000-0000-0000-0000-000000000000". | |
| version | Int | Нет | Версия настройки. Если не задана, будет присвоена "1". Если глобальные настройки уже заданы и ID и версию не задать, то может привести к ошибке, т.к. версия будет отличаться от "1". | |
| thresholds | List[Threshold] | Да | Список интервалов значений для метрики. Интервалы не должны пересекаться. |
Widget (tolka)
Данные виджета аналитики
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| id | WidgetId | Да | Идентификатор виджета | |
| title | Title | Да | Название виджета | Не пустое, не длиннее 256 символов |
| widgetType | String | Да | Код типа виджета | Должен соответствовать коду из справочника analyticsWidgetType |
| settings | WidgetSettings | Да | Настройки виджета | |
| visibility | Boolean | Да | Видимость виджета на дашборде | |
| position | Int | Да | Позиция виджета на дашборде | Больше 0 |
| version | Int | Да | Версия виджета |
CreateWidgetDTO (tolka)
Параметры для создания нового виджета
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| title | Title | Да | Название виджета | Не пустое, не длиннее 256 символов |
| widgetType | String | Да | Код типа виджета | Должен соответствовать коду из справочника analyticsWidgetType |
| settings | WidgetSettings | Да | Настройки виджета | |
| visibility | Boolean | Да | Видимость виджета на дашборде |
UpdateWidgetDTO (tolka)
Параметры для обновления виджета
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| id | WidgetId | Да | Идентификатор виджета | |
| title | Title | Да | Название виджета | Не пустое, не длиннее 256 символов |
| widgetType | String | Да | Код типа виджета | Должен соответствовать коду из справочника analyticsWidgetType |
| settings | WidgetSettings | Да | Настройки виджета | |
| visibility | Boolean | Да | Видимость виджета на дашборде | |
| version | Int | Да | Версия виджета |
WidgetSettings (tolka)
Настройки виджета. Формат настроек зависит от типа виджета (поле widgetType).
Формат для типов виджета "Круговая диаграмма", "Линейный бар", "Сводная таблица":
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| showLegend | Boolean | Да | Отображать ли легенду | |
| entities | List[String] | Да | Перечень кодов сущностей | |
| fieldName | String | Нет | Если выбрана одна сущность, то поле целевой метрики в этой сущности; иначе не используется. |
Формат для типа виджета "Столбчатая диаграмма":
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| showLegend | Boolean | Да | Отображать ли легенду | |
| fieldType | String | Да | Тип данных, по которым строится диаграмма | |
| entities | List[BarChartSettingsEntity] | Да | Перечень кодов сущностей и полей из них | Все поля должны соответствовать типу, указанному в fieldType |
BarChartSettingsEntity (tolka)
Информация о сущности для настроек виджета типа "Столбчатая диаграмма"
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| code | EntityTypeId | Да | Код сущности | |
| fieldName | String | Да | Название поля, которое содержит значение для целевой метрики | Поле должно содержаться в модели сущности, а также в качестве фасета в правилах ее поиска |
ReorderWidgetsDTO (tolka)
Данные для перестановки местами двух виджетов
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| first | ReorderWidgetDTO | Да | Первый виджет из пары меняемых местами | |
| second | ReorderWidgetDTO | Да | Второй виджет из пары меняемых местами |
ReorderWidgetDTO (tolka)
Данные для изменения положения виджета
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| id | WidgetId | Да | Идентификатор виджета | |
| newPosition | Int | Да | Новая позиция виджета на дашборде | Больше 0 |
| version | Int | Да | Версия виджета |
AnalyticsEntity (tolka)
Настройки для порогов метрики в аналитике.
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| id | AnalyticsEntityId | Да | Идентификатор настройки | Не пустое |
| version | Int | Да | Версия настройки | |
| code | EntityTypeId | Да | Код сущности | Не пустое |
| color | HexColor | Да | Цвет, связанный с данной сущностью | Формат Hexadecimal color |
| visibleOnDashboard | Boolean | Да | Видимость сущности на дашбордах. В общей статистике объекты все равно учитываются | |
| created | TimeStamp | Да | Дата создания настройки |
AnalyticsEntityCreateDTO (tolka)
Настройки для порогов метрики в аналитике.
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| code | EntityTypeId | Да | Код сущности | Не пустое |
| color | HexColor | Да | Цвет, связанный с данной сущностью | Формат Hexadecimal color |
| visibleOnDashboard | Boolean | Да | Видимость сущности на дашбордах. В общей статистике объекты все равно учитываются |
AnalyticsEntityUpdateDTO (tolka)
Обновление настроек порогов метрики в аналитике.
| Поле | Тип | Обязательное | Описание | Ограничения |
|---|---|---|---|---|
| id | AnalyticsEntityId | Да | Идентификатор настройки | Не пустое |
| version | Int | Да | Версия настройки | |
| code | EntityTypeId | Да | Новый код сущности | Не пустое |
| color | HexColor | Да | Новый цвет, связанный с данной сущностью | Формат Hexadecimal color |
| visibleOnDashboard | Boolean | Да | Новое значение видимости сущности на дашбордах |