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, l’API analytique formant une couche fine et renforcée en matière de sécurité au-dessus de celui-ci. 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 sont stockés dans différents index. Par exemple, les données tâche vivent dans l'index jobPart, et les données coûts vivent dans l'index coûts. 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 sur une tâche vivent dans deux documents différents dans la base de données Elasticsearch. Ces documents sont dans une relation parent-enfant. Par exemple, les informations sur le projet d'une tâche vivent dans le document parent, tandis que les informations sur la tâche elle-même vivent dans le document enfant. En fonction des informations requises, les agrégations sont 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
{
"identifiant": chaîne,
"createdBy": <Utilisateur>,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"supprimé": booléen,
"innerId": nombre,
"nom": chaîne,
"tags": balise[],
"jeté": booléen,
"jetéPar": <Utilisateur>,
"type": chaîne
}
Assignation
{
"nom": chaîne,
"linguist": <Linguiste>,
"vendor": <Prestataire>
}
submitter portal
{
"identifiant": chaîne,
"createdBy": <User>,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": booléen,
"nom": chaîne,
"tags": chaîne[],
"trashed": booléen,
"urlId": chaîne
}
Acheteur
{
"id": chaîne,
"nom": chaîne
}
Client
{
"identifiant": chaîne,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"supprimé": booléen,
"idExterne": chaîne,
"nom": chaîne,
"tags": balise[],
"jeté": booléen,
}
CostCenter
{
"identifiant": chaîne,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"supprimé": booléen,
"nom": chaîne,
"tags": balise[],
"trashed": booléen,
}
Domaine
{
"id": chaîne,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"deleted": booléen,
"nom": chaîne,
"tags": balise[],
"trashed": booléen
}
Tâche
{
"identifiant": chaîne,
"createdBy": <Utilisateur>,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"supprimé": booléen,
"extension": chaîne,
"fileName": chaîne,
"groupCount": nombre,
"innerId": "1",
"languagePair": chaîne,
"lastModified": Date,
"localePair": chaîne,
"sourceLanguage": chaîne,
"sourceLocale": chaîne,
"tags": chaîne[],
"targetLanguage": chaîne,
"targetLocale": chaîne,
"taskId": chaîne,
"trashed": booléen,
"trashedBy": <Utilisateur>,
"uid": chaîne
}
Tâche
{
"id": "19",
"assignedTo": <Assignation>,
"beginIndex": nombre,
"buyer": <Acheteur>,
"createdBy": <Utilisateur>,
"dateCreated": Date,
"dateDue": Date,
"endIndex": nombre,
"groupCount": nombre,
"innerId": chaîne,
"lastModified": Date,
"level": nombre,
"status": chaîne,
"tags": [],
"uid": chaîne,
"workflowStep": <WorkflowStep>
}
TaEngine
{
"identifiant": chaîne,
"supprimé": booléen,
"default_: booléen,
"includeTags": booléen,
"nom": chaîne,
"tags": balise[],
"type": chaîne,
}
NetRateScheme
{
"id": Identifiant,
"createdBy": <Utilisateur>,
"dateCreated": Date,
"dateDeleted": Date,
"default_": booléen,
"supprimé": booléen,
"idExterne": chaîne,
"nom": chaîne,
"tags": balise[],
}
PriceList
{
"identifiant": chaîne,
"createdBy": <Utilisateur>,
"currency": chaîne,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"default_": booléen,
"supprimé": booléen,
"nom": chaîne,
"tags": balise[],
"trashed": booléen,
"unit": chaîne
}
Projet
{
"identifiant": chaîne,
"buyer": <Acheteur>,
"client": <Client>,
"costCenter": <CostCenter>,
"createdBy": <Utilisateur>,
"dateCreated": Date,
"dateDeleted": Date,
"dateDue": Date,
"dateTrashed": Date,
"supprimé": booléen,
"domaine": <Domaine>,
"innerId": nombre,
"languagePairs": chaîne[],
"localePairs": paramètre linguistique[],
"mtEngine": <TaEngine>,
"nom": chaîne,
"note": chaîne,
"responsable": <Utilisateur>,
"langueSource": chaîne,
"paramètre linguistique source": chaîne,
"statut": chaîne,
"sous-domaine": <Sous-domaine>,
"tags": balise[],
"targetLanguages": string[],
"targetLocales": paramètre linguistique[],
"jeté": booléen,
"jetéPar": <Utilisateur>,
"uid": chaîne,
"vendor": <Prestataire>
}
devis
{
"identifiant": chaîne,
"createdBy": <Utilisateur>,
"currency": chaîne,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"supprimé": booléen,
"innerId": chaîne,
"nom": chaîne,
"statut": chaîne,
"tags": balise[],
"jeté": booléen,
"jetéPar": <Utilisateur>,
"unit": chaîne
}
service
{
"identifiant": chaîne,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"supprimé": booléen,
"nom": chaîne,
"publicName": chaîne,
"tags": balise[],
"jeté": booléen,
"type": chaîne
}
sous-domaine
{
"identifiant": chaîne,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"supprimé": booléen,
"nom": chaîne,
"tags": balise[],
"jeté": booléen
}
Utilisateur
{
"identifiant": nombre,
"actif": booléen,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"supprimé": booléen,
"email": e-mail,
"firstName": chaîne,
"fullName": chaîne,
"innerId": nombre,
"jobTitle": chaîne.
"lastName": chaîne,
"locale": paramètre linguistique,
"note": chaîne,
"role": chaîne,
"tags": balise[],
"timeZone": chaîne,
"trashed": booléen,
"userName": chaîne
}
prestataire
{
"id": Identifiant,
"candidate": booléen,
"dateCreated": Date,
"dateDeleted": Date,
"dateTrashed": Date,
"supprimé": booléen,
"tags": balise[],
"token": jeton,
"trashed": booléen
}
Étape de flux de travail
{
"id": Identifiant,
"abbreviation": chaîne,
"dateDeleted": Date,
"dateTrashed": Date,
"nom": chaîne,
"order": commande,
"tags": balise[],
"trashed": booléen
}
Indice d'analyse
Agrégation de données
"data": {
"children": {
"type": "analysisType"
}
}
Document parent
{
"automationWidget": <AutomationWidget>,
"project": <Projet>,
"service": <Service>
}
Enfant Document
{
"analyse": <Analyse>,
"jobPart": <JobPart>,
"job": <Job>,
"netRateScheme": <NetRateScheme>,
"priorité": nombre,
"data": {
"TA": {
"correspondance0": {
"caractères": nombre,
"pages": nombre,
"pourcentage": nombre,
"segments": nombre,
"mots": nombre
},
"correspondance100": {
"caractères": nombre,
"pages": nombre,
"pourcentage": nombre,
"segments": nombre,
"mots": nombre
},
"correspondance50": {
"caractères": nombre,
"pages": nombre,
"pourcentage": nombre,
"segments": nombre,
"mots": nombre
},
"correspondance75": {
"caractères": nombre,
"pages": nombre,
"pourcentage": nombre,
"segments": nombre,
"mots": nombre
},
"correspondance85": {
"caractères": nombre,
"pages": nombre,
"pourcentage": nombre,
"segments": nombre,
"mots": nombre
},
"correspondance95": {
"caractères": nombre,
"pages": nombre,
"pourcentage": nombre,
"segments": nombre,
"mots": nombre
}
},
"répétitions": {
"caractères": nombre,
"pages": nombre,
"pourcentage": nombre,
"segments": nombre,
"mots": nombre
},
"MT": {
"correspondance0": {
"caractères": nombre,
"pages": nombre,
"pourcentage": nombre,
"segments": nombre,
"mots": nombre
},
"correspondance100": {
"caractères": nombre,
"pages": nombre,
"pourcentage": nombre,
"segments": nombre,
"mots": nombre
},
"correspondance101": {
"caractères": nombre,
"pages": nombre,
"pourcentage": nombre,
"segments": nombre,
"mots": nombre
},
"correspondance50": {
"caractères": nombre,
"pages": nombre,
"pourcentage": nombre,
"segments": nombre,
"mots": nombre
},
"correspondance75": {
"caractères": nombre,
"pages": nombre,
"pourcentage": nombre,
"segments": nombre,
"mots": nombre
},
"correspondance85": {
"caractères": nombre,
"pages": nombre,
"pourcentage": nombre,
"segments": nombre,
"mots": nombre
},
"correspondance95": {
"caractères": nombre,
"pages": nombre,
"pourcentage": nombre,
"segments": nombre,
"mots": nombre
}
},
"total": {
"caractères": nombre,
"pages": nombre,
"pourcentage": nombre,
"segments": nombre,
"mots": nombre
}
}
}
Index API
Agrégation de données
"data": {
"children": {
"type": "apiType"
}
}
Document parent
{
"user": <utilisateur>
}
Document enfant
{
"request": {
"date": Date,
"host": chaîne,
"ipv4": chaîne,
"ipv6": chaîne,
"location": chaîne,
"method": chaîne
},
"response": {
"date": Date,
"duration": nombre,
"status": nombre
},
"api": {
"action": chaîne,
"asynch": booléen,
"type": chaîne,
"uri": chaîne,
"ver": chaîne
}
}
Indice des coûts
Agrégation de données
"data": {
"children": {
"type": "costsType"
}
}
Document parent
{
"automationWidget": <AutomationWidget>,
"project": <Projet>,
"service": <Service>
}
Document enfant
{
"analyse": <Analyse>,
"job": <Tâche>,
"jobPart": <JobPart>,
"netRateScheme": <NetRateScheme>,
"priceList": <PriceList>,
"quote": <Devis>,
"workflowStep": <Flux de travaux>,
"priorité": nombre,
"data": {
"TA": {
"correspondance0": number,
"correspondance100": number,
"correspondance50": number,
"correspondance75": number,
"correspondance85": number,
"correspondance95": number
},
"répétitions": number
"TM": {
"correspondance0": number,
"correspondance100": number,
"correspondance101": number,
"correspondance50": number,
"correspondance75": number,
"correspondance85": number,
"correspondance95": number
},
"total": nombre
}
}
Index de jobPart
Agrégation de données
"data": {
"children": {
"type": "jobPartType"
}
}
Document parent
{
"automationWidget": <AutomationWidget>,
"project": <Projet>,
"service": <Service>
}
Document enfant
{
"job": <Tâche>,
"jobPart": <JobPart>
"data": {
"counts": {
"chars": {
"total": nombre,
"confirmed": nombre,
"notConfirmed": nombre,
"verrouillé": nombre,
"nonVerrouillé": nombre,
"confirméEtVerrouillé": nombre,
"nonConfirméEtVerrouillé": nombre,
"terminé": nombre,
"nonTerminé": nombre
},
"groups": {
"total": nombre
},
"segments": {
"total": nombre,
"confirmed": nombre,
"notConfirmed": nombre,
"verrouillé": nombre,
"nonVerrouillé": nombre,
"confirméEtVerrouillé": nombre,
"nonConfirméEtVerrouillé": nombre,
"terminé": nombre,
"nonTerminé": nombre,
"TA": {
"postÉdité": nombre,
"pertinent": nombre,
"nonPertinent": nombre,
},
"qa": {
"vérifié": nombre,
"nonVérifié": nombre,
}
},
"mots": {
"total": nombre,
"confirmé": nombre,
"nonConfirmé": nombre,
"verrouillé": nombre,
"nonVerrouillé": nombre,
"confirméEtVerrouillé": nombre,
"nonConfirméEtVerrouillé": nombre,
"terminé": nombre,
"nonTerminé": nombre,
},
"qa": {
"avertissements": nombre,
"avertissements ignorés": nombre,
"avertissements non ignoré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.
-
Requêtes POST à
api/v3/analytics/jobPart?token=<votre_jeton_de_connexion>
Nombre total de tâches
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 data a répondu avec 14 417 documents de correspondance affichés dans le champ doc_count.
Nombre total de mots source
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 source divisé par langue cible
Requête
{
"agrégations": {
"data": {
"enfants": {
"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 sollicité pour diviser les données par une certaine catégorie, le résultat est représenté sous la forme d'une liste de buckets. Chaque bucket contient une clé qui définit quelles données ce bucket représente (dans ce cas, une langue cible) et une valeur (autres agrégations) propre à cette partie de l'ensemble de données.
Nombre total de tâches divisé 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
},
"key": "TERMINÉ"
},
{
"doc_count": 1,
"data": {
"doc_count": 4
},
"key": "ASSIGNÉ"
},
{
"doc_count": 1,
"data": {
"doc_count": 6
},
"key": "DECLINED_BY_VENDOR"
}
]
}
}
}
Le module Analytics a été informé de diviser les données par le statut du projet avant l'agrégation data.
Nombre total de tâches provenant de nouveaux projets
Requête
{
"filtre": {
"terme": {
"project.status": "NEW"
}
},
"agrégations": {
"data": {
"children": {
"type": "jobPartType"
}
}
}
}
Réponse
{
"hits": {
"total": 326
},
"aggregations": {
"data": {
"doc_count": 14318
}
}
}
Le champ filtre est utilisé dans la requête. Cela réduit les données avant les agrégations suivantes.