Хранилище данных, выполняющее агрегирующие запросы, построено на базе Elasticsearch (в настоящее время версия 1.7.x). Elasticsearch предоставляет возможности поиска в реальном времени и агрегации, а интерфейс приложений API Analytics образует тонкий, усиленный с точки зрения безопасности слой поверх него. В примерах используется язык запросов и агрегаций Elasticsearch.
-
Язык, используемый в поле filter JSON-запроса, описан в документации Elasticsearch Query DSL.
-
Язык, используемый в поле aggregations запроса JSON, полностью описан в документации Elasticsearch Aggregations.
Индексы
Разные типы данных находятся в разных индексах. Например, данные задание находятся в индексе ЧастьЗадания, а данные costs находятся в индексе costs. Необходимые данные могут быть указаны, задав индекс в URL-адресе конечной точки API агрегации.
Документы «родительский элемент — дочерний элемент»
Части информации о задании находятся в двух разных документах в базе данных Elasticsearch. Эти документы находятся в отношении «родительский элемент — дочерний элемент». Например, информация о проекте задания находится в родительском документе, в то время как информация о самом задании находится в дочернем документе. В зависимости от требуемой информации, агрегация располагается либо перед агрегированием данных по схеме «родительский элемент — дочерний элемент», либо после неё, при этом сама агрегация данных должна присутствовать во всех запросах.
Общие данные
Анализ
{
"id": строка,
"createdBy": <пользователь>,
"dateCreated": Дата,
"dateDeleted": Дата,
"dateTrashed": Дата,
"deleted": булево,
"innerId": число,
"name": строка,
"tags": строка[],
"trashed": булево,
"trashedBy": <User>,
"type": строка
}
Назначение
{
"имя": строка,
"лингвист": <пользователь>,
"исполнитель": <исполнитель>
}
Портал отправителя
{
"id": строка,
"createdBy": <Пользователь>,
"dateCreated": Дата,
"dateDeleted": Дата,
"dateTrashed": Дата,
"удалено": булево,
"имя": строка,
"tags": строка[],
"вКорзине": булево,
"urlId": строка
}
Покупатель
{
"id": строка,
"имя": строка
}
Клиент
{
"id": строка,
"dateCreated": Дата,
"dateDeleted": Дата,
"dateTrashed": Дата,
"удалено": булево,
"externalId": строка,
"имя": строка,
"tags": string[],
"trashed": булево,
}
CostCenter
{
"id": строка,
"dateCreated": Дата,
"dateDeleted": Дата,
"dateTrashed": Дата,
"удалено": булево,
"имя": строка,
"теги": string[],
"вКорзине": булево,
}
Отрасль
{
"идентификатор": строка,
"dateCreated": Дата,
"dateDeleted": Дата,
"dateTrashed": Дата,
"удалено": булево,
"имя": строка,
"теги": string[],
"вКорзине": булево
}
Задание
{
"id": строка,
"createdBy": <Пользователь>,
"dateCreated": Дата,
"dateDeleted": Дата,
"dateTrashed": Дата,
"deleted": булево,
"extension": строка,
"fileName": строка,
"groupCount": число,
"innerId": "1",
"languagePair": строка,
"lastModified": Дата,
"localePair": строка,
"sourceLanguage": строка,
"sourceLocale": строка,
"tags": строка[],
"targetLanguage": строка,
"targetLocale": строка",
"taskId": строка,
"вКорзине": булево,
"trashedBy": <Пользователь>,
"uid": строка
}
ЧастьЗадания
{
"id": "19",
"assignedTo": <Назначение>,
"beginIndex": число,
"buyer": <Покупатель>,
"createdBy": <Пользователь>,
"dateCreated": Дата,
"dateDue": Дата,
"endIndex": число,
"groupCount": число,
"innerId": строка,
"lastModified": Дата,
"level": число,
"status": строка,
"tags": [],
"uid": строка,
"workflowStep": <WorkflowStep>
}
MtEngine
{
"id": строка,
"deleted": булево,
"default_: булево,
"includeTags": boolean,
"имя": строка,
"tags": string[],
"type": строка,
}
NetRateScheme
{
"id": строка,
"createdBy": <Пользователь>,
"dateCreated": Дата,
"dateDeleted": Дата,
"default_": boolean,
"deleted": boolean,
"externalId": строка,
"name": строка,
"tags": string[],
}
PriceList
{
"id": строка,
"createdBy": <Пользователь>,
"currency": строка,
"dateCreated": Дата,
"dateDeleted": Дата,
"dateTrashed": Дата,
"default_": boolean,
"удалено": булево,
"имя": строка,
"теги": строка[],
"вКорзине": булево,
"unit": строка
}
Project
{
"id": строка,
"buyer": <Покупатель>,
"client": <Клиент>,
"costCenter": <CostCenter>,
"createdBy": <Пользователь>,
"dateCreated": Дата,
"dateDeleted": Дата,
"dateDue": Дата,
"dateTrashed": Дата,
"удалено": булево,
"domain": <Domain>,
"внутреннийId": число,
"languagePairs": строка[],
"localePairs": строка[],
"mtEngine": <MtEngine>,
"имя": строка,
"note": строка,
"owner": <пользователь>,
"sourceLanguage": строка,
"sourceLocale": строка,
"status": строка,
"subDomain": <специализация>,
"tags": string[],
"targetLanguages": string[],
"targetLocales": string[],
"trashed": булево,
"trashedBy": <пользователь>,
"uid": строка,
"исполнитель": <исполнитель>
}
расчет стоимости
{
"id": строка,
"createdBy": <пользователь>,
"currency": строка,
"dateCreated": Дата,
"dateDeleted": Дата,
"dateTrashed": Дата,
"удалено": булево,
"innerId": строка,
"имя": строка,
"status": строка,
"tags": строка[],
"вКорзине": булево,
"trashedBy": <пользователь>,
"unit": строка
}
услуга
{
"id": строка,
"dateCreated": Дата,
"dateDeleted": Дата,
"dateTrashed": Дата,
"удалено": булево,
"имя": строка,
"publicName": строка,
"tags": string[],
"вКорзине": булево,
"тип": строка
}
специализация
{
"id": строка,
"dateCreated": Дата,
"dateDeleted": Дата,
"dateTrashed": Дата,
"deleted": булево,
"name": строка,
"tags": string[],
"trashed": булево,
}
пользователь
{
"id": number,
"active": булево,
"dateCreated": Дата,
"dateDeleted": Дата,
"dateTrashed": Дата,
"deleted": булево,
"электронная почта": строка,
"firstName": строка,
"fullName": строка,
"innerId": число,
"jobTitle": строка,
"lastName": строка,
"языковой стандарт": строка,
"note": строка,
"role": строка,
"tags": string[],
"timeZone": строка,
"trashed": булево,
"userName": строка
}
исполнитель
{
"id": строка,
"candidate": булево,
"dateCreated": Дата,
"dateDeleted": Дата,
"dateTrashed": Дата,
"deleted": булево,
"tags": string[],
"token": строка,
"trashed": булево
}
WorkflowStep
{
"id": строка,
"abbreviation": строка,
"dateDeleted": Дата,
"dateTrashed": Дата,
"name": строка,
"order": число,
"tags": string[],
"вКорзине": булево
}
Индекс анализа
Агрегация данных
"data": {
"children": {
"type": "analysisType"
}
}
Родительский документ
{
"automationWidget": <AutomationWidget>,
"проект": <Project>,
"service": <Service>
}
Дочерний документ
{
"analysis": <Analysis>,
"jobPart": <JobPart>,
"задание": <Job>,
"netRateScheme": <NetRateScheme>,
"priority": число,
"data": {
"машинный перевод (МТ)": {
"совпадение0": {
"character": число,
"страницы": число,
"процент": число,
"сегмент": число,
"слова": число
},
"совпадение100": {
"character": число,
"страницы": число,
"процент": число,
"сегмент": число,
"слова": число
},
"совпадение50": {
"character": число,
"страницы": число,
"процент": число,
"segments": number,
"words": число
},
"совпадение75": {
"characters": число,
"страницы": число,
"процент": число,
"segments": number,
"words": число
},
"совпадение85": {
"characters": число,
"страницы": число,
"процент": число,
"segments": number,
"words": число
},
"совпадение95": {
"characters": число,
"страницы": число,
"процент": число,
"segments": number,
"words": число
}
},
"repetitions": {
"символы": число,
"страницы": число,
"процент": число,
"сегменты": число,
"слова": число
},
"память переводов": {
"match0": {
"символы": число,
"страницы": число,
"процент": число,
"сегменты": число,
"слова": число
},
"match100": {
"символы": число,
"страницы": число,
"процент": число,
"сегменты": число,
"слова": число
},
"match101": {
"символы": число,
"страницы": число,
"процент": число,
"сегменты": число,
"слова": число
},
"match50": {
"символы": число,
"страницы": число,
"процент": число,
"сегменты": число,
"слова": число
},
"match75": {
"символы": число,
"страницы": число,
"процент": число,
"сегменты": число,
"слова": число
},
"match85": {
"символы": число,
"страницы": число,
"процент": число,
"сегменты": число,
"слова": число
},
"match95": {
"символы": число,
"страницы": число,
"процент": число,
"сегменты": число,
"слова": число
}
},
"всего": {
"символы": число,
"страницы": число,
"процент": число,
"сегменты": число,
"слова": число
}
}
}
Индекс интерфейса приложений API
Агрегация данных
"data": {
"children": {
"тип": "apiType"
}
}
Родительский документ
{
"пользователь": <User>
}
Дочерний документ
{
"запрос": {
"date": Дата,
"хост": строка,
"ipv4": строка,
"ipv6": строка,
"местоположение": строка,
"метод": строка
},
"response": {
"date": Дата,
"длительность": число,
"статус": число
},
"api": {
"действие": строка,
"asynch": логическое значение,
"type": строка,
"uri": строка,
"ver": строка
}
}
Индекс затрат
Агрегация данных
"data": {
"children": {
"type": "costsType"
}
}
Родительский документ
{
"automationWidget": <AutomationWidget>,
"project": <Project>,
"service": <Service>
}
Дочерний документ
{
"analysis": <Analysis>,
"job": <Job>,
"jobPart": <JobPart>,
"netRateScheme": <NetRateScheme>,
"priceList": <PriceList>,
"расчет стоимости": <Quote>,
"workflowStep": <WorkflowStep>,
"priority": число,
"data": {
"mt": {
"совпадение0": число,
"совпадение100": число,
"совпадение50": число,
"совпадение75": число,
"совпадение85": число,
"совпадение95": число
},
"repetitions": число,
"tm": {
"совпадение0": число,
"совпадение100": число,
"совпадение101": число,
"совпадение50": число,
"совпадение75": число,
"совпадение85": число,
"совпадение95": число
},
"total": число
}
}
Индекс части задания
Агрегация данных
"data": {
"children": {
"type": "jobPartType"
}
}
Родительский документ
{
"automationWidget": <AutomationWidget>,
"project": <Project>,
"service": <Service>
}
Дочерний документ
{
"job": <Job>,
"jobPart": <JobPart>
"data": {
"counts": {
"chars": {
"total": число,
"confirmed": число,
"notConfirmed": число,
"locked": число,
"notLocked": число,
"подтверждено и заблокировано": число,
"неподтверждено и заблокировано": число,
"завершить": число,
"неЗавершить": число
},
"группы": {
"total": число
},
"segments": {
"total": число,
"confirmed": число,
"notConfirmed": число,
"locked": число,
"notLocked": число,
"подтверждено и заблокировано": число,
"неподтверждено и заблокировано": число,
"завершить": число,
"неЗавершить": число,
"mt": {
"postEdited": number,
"релевантно": число,
"неРелевантно": число
},
"контроль качества (QA)": {
"проверено": число,
"неПроверено": число
}
},
"слова": {
"total": число,
"подтверждено": число,
"notConfirmed": число,
"заблокировано": число,
"notLocked": число,
"подтвержденоИзаблокировано": число,
"неПодтвержденоИзаблокировано": число,
"завершить": число,
"не завершить": число
},
"контроль качества (QA)": {
"предупреждения": число,
"игнорируемыеПредупреждения": число,
"неИгнорируемыеПредупреждения": число
}
}
}
-
HTTP-запросы выполняются в Postman.
-
Войдите через профиль менеджера проекта (PM) или администратора и получите токен входа, используя интерфейс приложений API для входа.
-
POST запросы к
api/v3/analytics/jobPart?token=<ваш_токен_входа>
Общее количество заданий
Запрос
{
"агрегации": {
"data": {
"children": {
"type": "jobPartType"
}
}
}
}
Ответ
{
"hits": {
"total": 359
},
"агрегации": {
"data": {
"doc_count": 14417
}
}
}
Под полем aggregations агрегация data вернула 14 417 совпадающих документов, отображённых в поле doc_count.
Общее количество слов в оригинале
Запрос
{
"агрегации": {
"data": {
"children": {
"type": "jobPartType"
},
"aggs": {
"wordCount": {
"sum": {
"field": "data.volume.words"
}
}
}
}
}
}
Ответ
{
"hits": {
"total": 359
},
"aggregations": {
"data": {
"doc_count": 14417,
"wordCount": {
"value": 6893067
}
}
}
}
Общее количество слов в оригинале, разделённое по языку перевода
Запрос
{
"агрегации": {
"data": {
"children": {
"type": "jobPartType"
},
"aggs": {
"byTargetLanguage": {
"terms": {
"field": "job.targetLanguage",
"size": 3
},
"aggs": {
"wordCount": {
"sum": {
"field": "data.volume.words"
}
}
}
}
}
}
}
}
Ответ
{
"hits": {
"total": 359
},
"aggregations": {
"data": {
"byTargetLanguage": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 10071,
"buckets": [
{
"doc_count": 1835,
"wordCount": {
"value": 702721
},
"key": "cs"
},
{
"doc_count": 1491,
"wordCount": {
"value": 2602529
},
"key": "de"
},
{
"doc_count": 1020,
"wordCount": {
"value": 92676
},
"key": "fi"
}
]
},
"doc_count": 14417
}
}
}
Сущность ведра отображается в ответе. Когда модуль аналитики запрашивает разделение данных по какой-либо категории, результат представляется в виде списка бакетов. Каждый бакет содержит ключ, который определяет, какие данные представляются этим бакетом (в данном случае — целевой язык), и значение (другие агрегации), специфичное только для этой части набора данных.
Общее количество заданий, разделённое по статусу проекта
Запрос
{
"агрегации": {
"projectStatus": {
"terms": {
"поле": "project.status"
},
"aggs": {
"data": {
"children": {
"type": "jobPartType"
}
}
}
}
}
}
Ответ
{
"hits": {
"total": 359
},
"агрегации": {
"projectStatus": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"doc_count": 326,
"data": {
"doc_count": 14318
},
"key": "NEW"
},
{
"doc_count": 31,
"data": {
"doc_count": 89
},
"key": "COMPLETE"
},
{
"doc_count": 1,
"data": {
"doc_count": 4
},
"key": "ASSIGN"
},
{
"doc_count": 1,
"data": {
"doc_count": 6
},
"key": "DECLINED_BY_VENDOR"
}
]
}
}
}
Модуль аналитики был проинструктирован разделить данные по статусу проекта перед агрегацией data.
Общее количество заданий из новых проектов
Запрос
{
"фильтр": {
"термин": {
"project.status": "NEW"
}
},
"агрегации": {
"data": {
"children": {
"type": "jobPartType"
}
}
}
}
Ответ
{
"hits": {
"total": 326
},
"агрегации": {
"data": {
"doc_count": 14318
}
}
}
Поле filter используется в запросе. Это сужает данные перед последующими агрегациями.