Le magasin de données exécutant des requêtes d'agrégation est construit sur Elasticsearch (actuellement version 1.7.x). Elasticsearch fournit des recherches en temps réel et des capacités d'agrégation, avec l'API d'analytique formant une couche mince et améliorée en matière de sécurité par-dessus. Le langage de requête et d'agrégation d'Elasticsearch est utilisé dans les exemples.
-
Le langage utilisé dans le champ filtre du JSON de requête est décrit dans la documentation Elasticsearch Query DSL.
-
Le langage utilisé dans le champ agrégations du JSON de requête est entièrement décrit dans la documentation Elasticsearch Aggregations.
Indexes
Différents types de données résident dans différents index. Par exemple, les données tâche résident dans l'index jobPart, et les données coûts résident dans l'index costs. Les données requises peuvent être spécifiées en indiquant l'index dans l'URL du point de terminaison de l'API d'agrégation.
Documents Parent-Enfant
Des parties de l'information concernant une tâche résident dans deux documents différents dans la base de données Elasticsearch. Ces documents sont dans une relation parent-enfant. Par exemple, l'information concernant le projet d'une tâche réside dans le document parent, tandis que l'information concernant la tâche elle-même réside dans le document enfant. En fonction des informations requises, les agrégations se font soit avant l'agrégation parent-enfant des données, soit après, mais l'agrégation des données elle-même doit être présente dans toutes les requêtes.
Données Communes
Analyse
{
"id": string,
"createdBy": <User>,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": boolean,
"innerId": number,
"name": chaîne,
"tags": string[],
"trashed": booléen,
"trashedBy": <User>,
"type": string
}
Attribution
{
"name": chaîne,
"linguist": <User>,
"vendor": <Vendor>
}
Portail de l’envoyeur
{
"id": string,
"createdBy": <User>,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": boolean,
"name": chaîne,
"tags": string[],
"trashed": booléen,
"urlId": string
}
Buyer
{
"id": string,
"name": chaîne
}
Client
{
"id": string,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": boolean,
"externalId": string,
"name": chaîne,
"tags": string[],
"trashed": booléen,
}
CostCenter
{
"id": string,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": boolean,
"name": chaîne,
"tags": string[],
"trashed": booléen,
}
Domaine
{
"id": string,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": boolean,
"name": chaîne,
"tags": string[],
"trashed": booléen
}
Job
{
"id": string,
"createdBy": <User>,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": boolean,
"extension": string,
"fileName": chaîne,
"groupCount": nombre,
"innerId": "1",
"languagePair": string,
"lastModified": Date,
"localePair": string,
"sourceLanguage": chaîne,
"sourceLocale": string,
"tags": string[],
"targetLanguage": chaîne,
"targetLocale": string",
"taskId": string,
"trashed": booléen,
"trashedBy": <User>,
"uid": string
}
JobPart
{
"id": "19",
"assignedTo": <Assignment>,
"beginIndex": nombre,
"buyer": <Buyer>,
"createdBy": <User>,
"dateCreated": Date,
"dateDue": Date,
"endIndex": number,
"groupCount": nombre,
"innerId": string,
"lastModified": Date,
"level": nombre,
"status": string,
"tags": [],
"uid": string,
"workflowStep": <WorkflowStep>
}
MtEngine
{
"id": string,
"deleted": boolean,
"default_: booléen,
"includeTags": booléen,
"name": chaîne,
"tags": string[],
"type": string,
}
NetRateScheme
{
"id": string,
"createdBy": <User>,
"dateCreated": Date,
"dateDeleted": Date,
"default_": boolean,
"deleted": boolean,
"externalId": string,
"name": chaîne,
"tags": string[],
}
PriceList
{
"id": string,
"createdBy": <User>,
"currency": chaîne,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"default_": boolean,
"deleted": boolean,
"name": chaîne,
"tags": string[],
"trashed": booléen,
"unit": chaîne
}
Project
{
"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": chaîne,
"note": chaîne,
"owner": <User>,
"sourceLanguage": chaîne,
"sourceLocale": string,
"status": string,
"subDomain": <SubDomain>,
"tags": string[],
"targetLanguages": string[],
"targetLocales": string[],
"trashed": booléen,
"trashedBy": <User>,
"uid": string,
"vendor": <Vendor>
}
Quote
{
"id": string,
"createdBy": <utilisateur>,
"currency": chaîne,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": boolean,
"innerId": string,
"name": chaîne,
"status": string,
"tags": string[],
"trashed": booléen,
"trashedBy": <User>,
"unit": chaîne
}
Service
{
"id": string,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": boolean,
"name": chaîne,
"publicName": chaîne,
"tags": string[],
"trashed": booléen,
"type": string
}
sous-domaine
{
"id": string,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": boolean,
"name": chaîne,
"tags": string[],
"trashed": booléen
}
utilisateur
{
"id": number,
"actif": booléen,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": boolean,
"e-mail": chaîne,
"firstName": chaîne,
"fullName": chaîne,
"innerId": number,
"jobTitle": string,
"lastName": chaîne,
"paramètre linguistique": chaîne,
"note": chaîne,
"role": chaîne,
"tags": string[],
"timeZone": string,
"trashed": booléen,
"userName": chaîne
}
Vendor
{
"id": string,
"candidate": booléen,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": boolean,
"tags": string[],
"token": string,
"trashed": booléen
}
WorkflowStep
{
"id": string,
"abbreviation": chaîne,
"dateDeleted": Date,
"dateTrashed": Date,
"name": chaîne,
"order": nombre,
"tags": string[],
"trashed": booléen
}
Index d'analyse
Agrégation de données
"data": {
"children": {
"type": "analysisType"
}
}
Document parent
{
"automationWidget": <AutomationWidget>,
"project": <Project>,
"service": <Service>
}
Document enfant
{
"analysis": <Analysis>,
"jobPart": <JobPart>,
"job": <Job>,
"netRateScheme": <NetRateScheme>,
"priority": nombre,
"data": {
"mt": {
"match0": {
"characters": number,
"pages": nombre,
"percent": nombre,
"segments": nombre,
"words": nombre
},
"match100": {
"characters": number,
"pages": nombre,
"percent": nombre,
"segments": nombre,
"words": nombre
},
"match50": {
"characters": number,
"pages": nombre,
"percent": nombre,
"segments": nombre,
"words": nombre
},
"match75": {
"characters": number,
"pages": nombre,
"percent": nombre,
"segments": nombre,
"words": nombre
},
"match85": {
"characters": number,
"pages": nombre,
"percent": nombre,
"segments": nombre,
"words": nombre
},
"match95": {
"characters": number,
"pages": nombre,
"percent": nombre,
"segments": nombre,
"words": nombre
}
},
"repetitions": {
"characters": number,
"pages": nombre,
"percent": nombre,
"segments": nombre,
"words": nombre
},
"tm": {
"match0": {
"characters": number,
"pages": nombre,
"percent": nombre,
"segments": nombre,
"words": nombre
},
"match100": {
"characters": number,
"pages": nombre,
"percent": nombre,
"segments": nombre,
"words": nombre
},
"match101": {
"characters": number,
"pages": nombre,
"percent": nombre,
"segments": nombre,
"words": nombre
},
"match50": {
"characters": number,
"pages": nombre,
"percent": nombre,
"segments": nombre,
"words": nombre
},
"match75": {
"characters": number,
"pages": nombre,
"percent": nombre,
"segments": nombre,
"words": nombre
},
"match85": {
"characters": number,
"pages": nombre,
"percent": nombre,
"segments": nombre,
"words": nombre
},
"match95": {
"characters": number,
"pages": nombre,
"percent": nombre,
"segments": nombre,
"words": nombre
}
},
"total": {
"characters": number,
"pages": nombre,
"percent": nombre,
"segments": nombre,
"words": nombre
}
}
}
Index API
Agrégation de données
"data": {
"children": {
"type": "apiType"
}
}
Document parent
{
"user": <User>
}
Document enfant
{
"demande": {
"date": Date,
"hôte": chaîne,
"ipv4": chaîne,
"ipv6": chaîne,
"emplacement": chaîne,
"méthode": chaîne
},
"réponse": {
"date": Date,
"durée": nombre,
"statut": nombre
},
"api": {
"action": chaîne,
"asynch": booléen,
"type": string,
"uri": chaîne,
"ver": chaîne
}
}
Index des Coûts
Agrégation de données
"data": {
"children": {
"type": "costsType"
}
}
Document parent
{
"automationWidget": <AutomationWidget>,
"project": <Project>,
"service": <Service>
}
Document enfant
{
"analysis": <Analysis>,
"job": <Job>,
"jobPart": <JobPart>,
"netRateScheme": <NetRateScheme>,
"priceList": <PriceList>,
"quote": <Quote>,
"workflowStep": <WorkflowStep>,
"priority": nombre,
"data": {
"mt": {
"correspondance0": nombre,
"correspondance100": nombre,
"correspondance50": nombre,
"correspondance75": nombre,
"correspondance85": nombre,
"correspondance95": nombre,
},
"répétitions": nombre,
"tm": {
"correspondance0": nombre,
"correspondance100": nombre,
"correspondance101": nombre,
"correspondance50": nombre,
"correspondance75": nombre,
"correspondance85": nombre,
"correspondance95": nombre,
},
"total": nombre
}
}
jobPart Index
Agrégation de Données
"data": {
"children": {
"type": "jobPartType"
}
}
Document Parent
{
"automationWidget": <AutomationWidget>,
"project": <Project>,
"service": <Service>
}
Document Enfant
{
"job": <Job>,
"jobPart": <JobPart>
"data": {
"comptes": {
"chars": {
"total": number,
"confirmé": nombre,
"notConfirmed": number,
"locked": number,
"notLocked": number,
"confirmedAndLocked": number,
"notConfirmedAndLocked": number,
"terminé": nombre,
"notCompleted": number
},
"groups": {
"total": nombre
},
"segments": {
"total": number,
"confirmé": nombre,
"notConfirmed": number,
"locked": number,
"notLocked": number,
"confirmedAndLocked": number,
"notConfirmedAndLocked": number,
"terminé": nombre,
"notCompleted": number,
"mt": {
"postEdited": number,
"pertinent": nombre,
"nonPertinent": nombre
},
"qa": {
"vérifié": nombre,
"notChecked": number
}
},
"words": {
"total": number,
"confirmé": nombre,
"notConfirmed": number,
"locked": number,
"notLocked": number,
"confirmedAndLocked": number,
"notConfirmedAndLocked": number,
"terminé": nombre,
"notCompleted": number
},
"qa": {
"avertissements": nombre,
"ignoredWarnings": number,
"avertissementsNonIgnorés": nombre
}
}
}
-
Les requêtes HTTP sont exécutées dans Postman.
-
Connectez-vous via un profil PM ou administrateur, et obtenez un jeton de connexion en utilisant une API de connexion.
-
POST requests to
api/v3/analytics/jobPart?token=<your_login_token>
Nombre total d'emplois
Requête
{
"agrégations": {
"data": {
"children": {
"type": "jobPartType"
}
}
}
}
Réponse
{
"hits": {
"total": 359
},
"agrégations": {
"data": {
"doc_count": 14417
}
}
}
Sous le champ agrégations, l'agrégation données a répondu avec 14 417 documents correspondants affichés dans le champ doc_count.
Nombre total de mots sources
Requête
{
"agrégations": {
"data": {
"children": {
"type": "jobPartType"
},
"aggs": {
"wordCount": {
"sum": {
"field": "data.volume.words"
}
}
}
}
}
}
Réponse
{
"hits": {
"total": 359
},
"agrégations": {
"data": {
"doc_count": 14417,
"wordCount": {
"value": 6893067
}
}
}
}
Nombre total de mots sources divisé par la langue cible
Requête
{
"agrégations": {
"data": {
"children": {
"type": "jobPartType"
},
"aggs": {
"byTargetLanguage": {
"terms": {
"field": "job.targetLanguage",
"size": 3
},
"aggs": {
"wordCount": {
"sum": {
"field": "data.volume.words"
}
}
}
}
}
}
}
}
Réponse
{
"hits": {
"total": 359
},
"agrégations": {
"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
}
}
}
L'entité buckets est affichée dans la réponse. Lorsque le module analytique est demandé de diviser les données par une certaine catégorie, le résultat est représenté sous forme d'une liste de seaux. Chaque seau contient une clé qui définit quelles données ce seau représente (dans ce cas, une langue cible) et une valeur (autres agrégations) spécifique juste à cette partie de l'ensemble de données.
Nombre total d'emplois divisés par le statut du projet
Requête
{
"agrégations": {
"projectStatus": {
"terms": {
"field": "project.status"
},
"aggs": {
"data": {
"children": {
"type": "jobPartType"
}
}
}
}
}
}
Réponse
{
"hits": {
"total": 359
},
"agrégations": {
"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
},
"clé": "COMPLÉTÉ"
},
{
"doc_count": 1,
"data": {
"doc_count": 4
},
"key": "ASSIGNED"
},
{
"doc_count": 1,
"data": {
"doc_count": 6
},
"key": "DECLINED_BY_VENDOR"
}
]
}
}
}
Le module analytique a été informé de diviser les données par le statut du projet avant l'agrégation data.
Nombre total d'emplois provenant de nouveaux projets
Requête
{
"filter": {
"term": {
"project.status": "NEW"
}
},
"agrégations": {
"data": {
"children": {
"type": "jobPartType"
}
}
}
}
Réponse
{
"hits": {
"total": 326
},
"agrégations": {
"data": {
"doc_count": 14318
}
}
}
Le champ filtre est utilisé dans la requête. Cela permet de restreindre les données avant les agrégations suivantes.