O datastore que executa consultas de agregação é construído sobre o Elasticsearch (atualmente versão 1.7.x). O Elasticsearch fornece buscas em tempo real e capacidades de agregação, com a API de Análise formando uma camada fina e aprimorada em segurança sobre ele. A linguagem de consulta e agregação do Elasticsearch é utilizada nos exemplos.
-
A linguagem utilizada no campo filtro do JSON da consulta é descrita na documentação do Elasticsearch Query DSL.
-
A linguagem utilizada no campo agregações do JSON da consulta é totalmente descrita na documentação do Elasticsearch Aggregations.
Índices
Diferentes tipos de dados vivem em diferentes índices. Por exemplo, dados de trabalho vivem no índice parteDoTrabalho, e dados de custos vivem no índice custos. Os dados necessários podem ser especificados ao indicar o índice na URL do endpoint da API de agregação.
Documentos Pai-Filho
Partes da informação sobre um trabalho vivem em dois documentos diferentes no banco de dados Elasticsearch. Esses documentos estão em um relacionamento pai-filho. Por exemplo, informações sobre o projeto de um trabalho vivem no documento pai, enquanto informações sobre o próprio trabalho vivem no documento filho. Dependendo das informações necessárias, as agregações ocorrem antes ou depois da agregação pai-filho dos dados, mas a agregação de dados em si deve estar presente em todas as consultas.
Dados Comuns
Análise
{
"id": string,
"createdBy": <User>,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": boolean,
"innerId": number,
"name": string,
"tags": string[],
"trashed": boolean,
"trashedBy": <User>,
"type": string
}
Atribuição
{
"name": string,
"linguist": <User>,
"vendor": <Vendor>
}
Portal de Solicitações
{
"id": string,
"createdBy": <User>,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": boolean,
"name": string,
"tags": string[],
"trashed": boolean,
"urlId": string
}
Comprador
{
"id": string,
"name": string
}
Cliente
{
"id": string,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": boolean,
"externalId": string,
"name": string,
"tags": string[],
"trashed": boolean,
}
CostCenter
{
"id": string,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": boolean,
"name": string,
"tags": string[],
"trashed": boolean,
}
Domínio
{
"id": string,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": boolean,
"name": string,
"tags": string[],
"trashed": boolean
}
Trabalho
{
"id": string,
"createdBy": <User>,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": boolean,
"extension": string,
"fileName": string,
"contagemGrupo": número,
"innerId": "1",
"languagePair": string,
"lastModified": Date,
"localePair": string,
"sourceLanguage": string,
"sourceLocale": string,
"tags": string[],
"targetLanguage": string,
"targetLocale": string",
"taskId": string,
"trashed": boolean,
"trashedBy": <User>,
"uid": string
}
JobPart
{
"id": "19",
"assignedTo": <Assignment>,
"beginIndex": number,
"buyer": <Buyer>,
"createdBy": <User>,
"dateCreated": Date,
"dateDue": Date,
"endIndex": number,
"contagemGrupo": número,
"innerId": string,
"lastModified": Date,
"level": number,
"status": string,
"tags": [],
"uid": string,
"workflowStep": <WorkflowStep>
}
MtEngine
{
"id": string,
"deleted": boolean,
"default_: boolean,
"includeTags": boolean,
"name": string,
"tags": string[],
"type": string,
}
NetRateScheme
{
"id": string,
"createdBy": <User>,
"dateCreated": Date,
"dateDeleted": Date,
"default_": boolean,
"deleted": boolean,
"externalId": string,
"name": string,
"tags": string[],
}
PriceList
{
"id": string,
"createdBy": <User>,
"currency": string,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"default_": boolean,
"deleted": boolean,
"name": string,
"tags": string[],
"trashed": boolean,
"unidade": string
}
Projeto
{
"id": string,
"buyer": <Buyer>,
"client": <Client>,
"costCenter": <CostCenter>,
"createdBy": <User>,
"dateCreated": Date,
"dateDeleted": Date,
"dateDue": Date,
"dateTrashed": Date,
"deleted": boolean,
"domain": <Domain>,
"innerId": number,
"languagePairs": string[],
"localePairs": string[],
"mtEngine": <MtEngine>,
"name": string,
"note": string,
"owner": <User>,
"sourceLanguage": string,
"sourceLocale": string,
"status": string,
"subDomain": <SubDomain>,
"tags": string[],
"targetLanguages": string[],
"targetLocales": string[],
"trashed": boolean,
"trashedBy": <User>,
"uid": string,
"vendor": <Vendor>
}
Orçamento
{
"id": string,
"criadoPor": <usuário>,
"currency": string,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": boolean,
"innerId": string,
"name": string,
"status": string,
"tags": string[],
"trashed": boolean,
"trashedBy": <User>,
"unidade": string
}
Serviço
{
"id": string,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": boolean,
"name": string,
"publicName": string,
"tags": string[],
"trashed": boolean,
"type": string
}
SubDomain
{
"id": string,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": boolean,
"name": string,
"tags": string[],
"trashed": boolean
}
Usuário
{
"id": número,
"ativo": booleano,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": boolean,
"email": string,
"firstName": string,
"fullName": string,
"innerId": number,
"jobTitle": string,
"lastName": string,
"locale": string,
"note": string,
"role": string,
"tags": string[],
"timeZone": string,
"trashed": boolean,
"userName": string
}
Fornecedor
{
"id": string,
"candidate": boolean,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": boolean,
"tags": string[],
"token": string,
"trashed": boolean
}
EtapaDeFluxoDeTrabalho
{
"id": string,
"abbreviation": string,
"dateDeleted": Date,
"dateTrashed": Date,
"name": string,
"pedido": número,
"tags": string[],
"trashed": boolean
}
Índice de Análise
Agregação de Dados
"data": {
"children": {
"type": "analysisType"
}
}
Documento Principal
{
"automationWidget": <AutomationWidget>,
"project": <Project>,
"service": <Service>
}
Documento Secundário
{
"analysis": <Analysis>,
"jobPart": <JobPart>,
"job": <Job>,
"netRateScheme": <NetRateScheme>,
"priority": number,
"data": {
"mt": {
"match0": {
"characters": number,
"páginas": número,
"porcentagem": número,
"segments": number,
"palavras": número
},
"match100": {
"characters": number,
"páginas": número,
"porcentagem": número,
"segments": number,
"palavras": número
},
"match50": {
"characters": number,
"páginas": número,
"porcentagem": número,
"segments": number,
"palavras": número
},
"match75": {
"characters": number,
"páginas": número,
"porcentagem": número,
"segments": number,
"palavras": número
},
"match85": {
"characters": number,
"páginas": número,
"porcentagem": número,
"segments": number,
"palavras": número
},
"match95": {
"characters": number,
"páginas": número,
"porcentagem": número,
"segments": number,
"palavras": número
}
},
"repetitions": {
"characters": number,
"páginas": número,
"porcentagem": número,
"segments": number,
"palavras": número
},
"tm": {
"match0": {
"characters": number,
"páginas": número,
"porcentagem": número,
"segments": number,
"palavras": número
},
"match100": {
"characters": number,
"páginas": número,
"porcentagem": número,
"segments": number,
"palavras": número
},
"match101": {
"characters": number,
"páginas": número,
"porcentagem": número,
"segments": number,
"palavras": número
},
"match50": {
"characters": number,
"páginas": número,
"porcentagem": número,
"segments": number,
"palavras": número
},
"match75": {
"characters": number,
"páginas": número,
"porcentagem": número,
"segments": number,
"palavras": número
},
"match85": {
"characters": number,
"páginas": número,
"porcentagem": número,
"segments": number,
"palavras": número
},
"match95": {
"characters": number,
"páginas": número,
"porcentagem": número,
"segments": number,
"palavras": número
}
},
"total": {
"characters": number,
"páginas": número,
"porcentagem": número,
"segments": number,
"palavras": número
}
}
}
Índice de API
Agregação de Dados
"data": {
"children": {
"type": "apiType"
}
}
Documento Principal
{
"usuário": <Usuário>
}
Documento Secundário
{
"request": {
"date": Date,
"host": string,
"ipv4": string,
"ipv6": string,
"location": string,
"method": string
},
"response": {
"date": Date,
"duration": number,
"estado": número
},
"api": {
"action": string,
"asynch": boolean,
"type": string,
"uri": string,
"ver": string
}
}
Índice de Custos
Agregação de Dados
"data": {
"children": {
"type": "costsType"
}
}
Documento Principal
{
"automationWidget": <AutomationWidget>,
"project": <Project>,
"service": <Service>
}
Documento Secundário
{
"analysis": <Analysis>,
"job": <Job>,
"jobPart": <JobPart>,
"netRateScheme": <NetRateScheme>,
"priceList": <PriceList>,
"quote": <Quote>,
"workflowStep": <WorkflowStep>,
"priority": number,
"data": {
"mt": {
"match0": número,
"match100": número,
"match50": número,
"match75": número,
"match85": número,
"match95": número,
},
"repetitions": number,
"tm": {
"match0": número,
"match100": número,
"match101": número,
"match50": número,
"match75": número,
"match85": número,
"match95": número,
},
"total": número
}
}
trabalhoParte Índice
Agregação de Dados
"data": {
"children": {
"type": "jobPartType"
}
}
Documento Principal
{
"automationWidget": <AutomationWidget>,
"project": <Project>,
"service": <Service>
}
Documento Secundário
{
"job": <Job>,
"jobPart": <JobPart>
"data": {
"counts": {
"chars": {
"total": número,
"confirmado": número,
"notConfirmed": number,
"bloqueado": número,
"notLocked": number,
"confirmedAndLocked": number,
"notConfirmedAndLocked": number,
"completo": número,
"notCompleted": number
},
"groups": {
"total": número
},
"segments": {
"total": número,
"confirmado": número,
"notConfirmed": number,
"bloqueado": número,
"notLocked": number,
"confirmedAndLocked": number,
"notConfirmedAndLocked": number,
"completo": número,
"nãoCompleto": número,
"mt": {
"postEdited": number,
"relevant": number,
"notRelevant": number
},
"qa": {
"verificado": número,
"nãoVerificado": número
}
},
"words": {
"total": número,
"confirmado": número,
"notConfirmed": number,
"bloqueado": número,
"notLocked": number,
"confirmedAndLocked": number,
"notConfirmedAndLocked": number,
"completo": número,
"notCompleted": number
},
"qa": {
"avisos": número,
"ignoredWarnings": number,
"notIgnoredWarnings": number
}
}
}
-
As requisições HTTP são executadas no Postman.
-
Faça login através de um perfil de PM ou Admin e obtenha um token de login usando uma API de login.
-
Requisições POST para
api/v3/analytics/jobPart?token=<seu_token_de_login>
Número Total de Trabalhos
Consulta
{
"aggregations": {
"data": {
"children": {
"type": "jobPartType"
}
}
}
}
Resposta
{
"hits": {
"total": 359
},
"aggregations": {
"data": {
"doc_count": 14417
}
}
}
Sob o campo agregações, a agregação dados respondeu com 14.417 documentos correspondentes mostrados no campo doc_count.
Número Total de Palavras de Origem
Consulta
{
"aggregations": {
"data": {
"children": {
"type": "jobPartType"
},
"aggs": {
"wordCount": {
"sum": {
"field": "data.volume.words"
}
}
}
}
}
}
Resposta
{
"hits": {
"total": 359
},
"aggregations": {
"data": {
"doc_count": 14417,
"wordCount": {
"value": 6893067
}
}
}
}
Total de Palavras de Origem Dividido pelo Idioma Alvo
Consulta
{
"aggregations": {
"data": {
"children": {
"type": "jobPartType"
},
"aggs": {
"byTargetLanguage": {
"terms": {
"field": "job.targetLanguage",
"size": 3
},
"aggs": {
"wordCount": {
"sum": {
"field": "data.volume.words"
}
}
}
}
}
}
}
}
Resposta
{
"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
}
}
}
A entidade buckets é exibida na resposta. Quando o módulo de estatísticas é solicitado a dividir os dados por alguma categoria, o resultado é representado como uma lista de buckets. Cada bucket contém uma chave que define quais dados este bucket representa (neste caso, um idioma alvo) e um valor (outras agregações) específico apenas para esta parte do conjunto de dados.
Total de Empregos Dividido pelo Estado do Projeto
Consulta
{
"aggregations": {
"projectStatus": {
"terms": {
"field": "project.status"
},
"aggs": {
"data": {
"children": {
"type": "jobPartType"
}
}
}
}
}
}
Resposta
{
"hits": {
"total": 359
},
"aggregations": {
"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": "COMPLETED"
},
{
"doc_count": 1,
"data": {
"doc_count": 4
},
"key": "ASSIGNED"
},
{
"doc_count": 1,
"data": {
"doc_count": 6
},
"key": "DECLINED_BY_VENDOR"
}
]
}
}
}
O módulo de Estatísticas foi instruído a dividir os dados pelo estado do projeto antes da agregação data.
Total de Empregos de Novos Projetos
Consulta
{
"filter": {
"term": {
"project.status": "NEW"
}
},
"aggregations": {
"data": {
"children": {
"type": "jobPartType"
}
}
}
}
Resposta
{
"hits": {
"total": 326
},
"aggregations": {
"data": {
"doc_count": 14318
}
}
}
O campo filter é utilizado na consulta. Isso restringe os dados antes das agregações subsequentes.