Les sources de données Elasticsearch offrent des canaux de lecture et d'écriture bidirectionnels pour synchroniser les données entre DataWorks et Elasticsearch.
Applicabilité
Les groupes de ressources publics prennent en charge Elasticsearch 5.x, tandis que les groupes de ressources Serverless (recommandés) et les groupes de ressources dédiés à l'intégration de données prennent en charge Elasticsearch 5.x, 6.x, 7.x et 8.x.
Pour plus d'informations sur les groupes de ressources Serverless, consultez la section Utiliser un groupe de ressources Serverless.
Pour plus d'informations sur les groupes de ressources dédiés à l'intégration de données, consultez la section Utiliser un groupe de ressources dédié à l'intégration de données.
Elasticsearch est un moteur de recherche open source de niveau entreprise développé sous licence Apache. Construit sur Lucene, il offre des capacités de recherche distribuée et d'analyse de données. Le tableau suivant établit une correspondance entre les concepts fondamentaux d'Elasticsearch et leurs équivalents dans les bases de données relationnelles.
|
Elasticsearch |
Base de données relationnelle |
|
Elasticsearch (instance) |
base de données relationnelle (instance) |
|
index |
base de données |
|
type |
table |
|
document |
ligne |
|
champ |
colonne |
Une instance Elasticsearch peut contenir plusieurs index. Chaque index comprend plusieurs types, chaque type contient plusieurs documents et chaque document se compose de plusieurs champs. Le plug-in Elasticsearch Writer utilise l'API REST d'Elasticsearch pour écrire des données par lots dans Elasticsearch.
Versions prises en charge
DataWorks prend en charge les versions 5.x, 6.x, 7.x et 8.x d'Alibaba Cloud Elasticsearch, mais pas les instances Elasticsearch auto-gérées.
Limitations
Les limitations suivantes s'appliquent aux lectures et écritures hors ligne vers Elasticsearch :
Le lecteur Elasticsearch récupère les informations sur les shards depuis le serveur pour la synchronisation des données. Tous les shards doivent être actifs pendant la synchronisation afin d'éviter toute incohérence des données.
Pour Elasticsearch 6.x ou version ultérieure, vous pouvez utiliser un groupe de ressources serverless (recommandé) ou un groupe de ressources exclusif pour Data Integration.
Les champs
scaled_floatne peuvent pas être synchronisés.Les index dont les noms de champs contiennent le mot-clé
$refne peuvent pas être synchronisés.
Types de champs pris en charge
|
Type |
Lecture hors ligne |
Écriture hors ligne |
Écriture en temps réel |
|
binary |
Pris en charge |
Pris en charge |
Pris en charge |
|
boolean |
Pris en charge |
Pris en charge |
Pris en charge |
|
keyword |
Pris en charge |
Pris en charge |
Pris en charge |
|
constant_keyword |
Non pris en charge |
Non pris en charge |
Non pris en charge |
|
wildcard |
Non pris en charge |
Non pris en charge |
Non pris en charge |
|
long |
Pris en charge |
Pris en charge |
Pris en charge |
|
integer |
Pris en charge |
Pris en charge |
Pris en charge |
|
short |
Pris en charge |
Pris en charge |
Pris en charge |
|
byte |
Pris en charge |
Pris en charge |
Pris en charge |
|
double |
Pris en charge |
Pris en charge |
Pris en charge |
|
float |
Pris en charge |
Pris en charge |
Pris en charge |
|
half_float |
Non pris en charge |
Non pris en charge |
Non pris en charge |
|
scaled_float |
Non pris en charge |
Non pris en charge |
Non pris en charge |
|
unsigned_long |
Non pris en charge |
Non pris en charge |
Non pris en charge |
|
date |
Pris en charge |
Pris en charge |
Pris en charge |
|
date_nanos |
Non pris en charge |
Non pris en charge |
Non pris en charge |
|
alias |
Non pris en charge |
Non pris en charge |
Non pris en charge |
|
object |
Pris en charge |
Pris en charge |
Pris en charge |
|
flattened |
Non pris en charge |
Non pris en charge |
Non pris en charge |
|
nested |
Pris en charge |
Pris en charge |
Pris en charge |
|
join |
Non pris en charge |
Non pris en charge |
Non pris en charge |
|
integer_range |
Pris en charge |
Pris en charge |
Pris en charge |
|
float_range |
Pris en charge |
Pris en charge |
Pris en charge |
|
long_range |
Pris en charge |
Pris en charge |
Pris en charge |
|
double_range |
Pris en charge |
Pris en charge |
Pris en charge |
|
date_range |
Pris en charge |
Pris en charge |
Pris en charge |
|
ip_range |
Non pris en charge |
Pris en charge |
Pris en charge |
|
ip |
Pris en charge |
Pris en charge |
Pris en charge |
|
version |
Pris en charge |
Pris en charge |
Pris en charge |
|
murmur3 |
Non pris en charge |
Non pris en charge |
Non pris en charge |
|
aggregate_metric_double |
Non pris en charge |
Non pris en charge |
Non pris en charge |
|
histogram |
Non pris en charge |
Non pris en charge |
Non pris en charge |
|
text |
Pris en charge |
Pris en charge |
Pris en charge |
|
annotated-text |
Non pris en charge |
Non pris en charge |
Non pris en charge |
|
completion |
Pris en charge |
Non pris en charge |
Non pris en charge |
|
search_as_you_type |
Non pris en charge |
Non pris en charge |
Non pris en charge |
|
token_count |
Pris en charge |
Non pris en charge |
Non pris en charge |
|
dense_vector |
Non pris en charge |
Non pris en charge |
Non pris en charge |
|
rank_feature |
Non pris en charge |
Non pris en charge |
Non pris en charge |
|
rank_features |
Non pris en charge |
Non pris en charge |
Non pris en charge |
|
geo_point |
Pris en charge |
Pris en charge |
Pris en charge |
|
geo_shape |
Pris en charge |
Pris en charge |
Pris en charge |
|
point |
Non pris en charge |
Non pris en charge |
Non pris en charge |
|
shape |
Non pris en charge |
Non pris en charge |
Non pris en charge |
|
percolator |
Non pris en charge |
Non pris en charge |
Non pris en charge |
|
string |
Pris en charge |
Pris en charge |
Pris en charge |
Fonctionnement
Le lecteur Elasticsearch fonctionne comme suit :
Il utilise l'API _search scroll slice d'Elasticsearch, en combinant sa fonctionnalité de découpage de défilement (scroll slice) avec le sharding multithread de Data Integration.
Il convertit les types de données en fonction de la configuration de mappage dans Elasticsearch.
Pour plus d'informations, consultez la documentation officielle d'Elasticsearch.
Le lecteur Elasticsearch récupère les informations sur les shards depuis le serveur pour la synchronisation des données. Pour éviter toute incohérence des données, assurez-vous que tous les shards côté serveur restent actifs pendant la synchronisation.
Configuration de base
En production, supprimez les commentaires du code avant d'exécuter la tâche.
{
"order":{
"hops":[
{
"from":"Reader",
"to":"Writer"
}
]
},
"setting":{
"errorLimit":{
"record":"0" // The error limit. The job stops if the error count exceeds this value.
},
"jvmOption":"",
"speed":{
"concurrent":3, // The number of concurrent threads.
"throttle":true,
"mbps":"12" // The maximum speed in MB/s.
}
},
"steps":[
{
"category":"reader",
"name":"Reader",
"parameter":{
"column":[ // The columns to read.
"id",
"name"
],
"endpoint":"", // The service endpoint.
"index":"", // The source index.
"password":"", // The password for authentication.
"scroll":"", // The scroll context duration.
"search":"", // The query body, same as the `query` object in an Elasticsearch `_search` request.
"type":"default",
"username":"" // The username for authentication.
},
"stepType":"elasticsearch"
},
{
"stepType": "elasticsearch",
"parameter": {
"column": [ // The columns to write.
{
"name": "id",
"type": "integer"
},
{
"name": "name",
"type": "text"
}
],
"index": "test", // The destination index.
"indexType": "", // The index type. Leave this empty for Elasticsearch v7.x or later.
"actionType": "index", // The write mode.
"cleanup": false, // Specifies whether to recreate the index before writing.
"datasource": "test", // The data source name.
"primaryKeyInfo": { // The primary key configuration.
"fieldDelimiterOrigin": ",",
"column": [
"id"
],
"type": "specific",
"fieldDelimiter": ","
},
"dynamic": false, // Specifies whether to enable dynamic mapping.
"batchSize": 1024 // The number of documents to write per batch.
},
"name": "Writer",
"category": "writer"
}
],
"type":"job",
"version":"2.0" // The version number.
}
Fonctionnalités avancées
-
Extraction complète du document
Vous pouvez extraire l'intégralité du contenu d'un document Elasticsearch dans un seul champ. Pour les détails de configuration, consultez la section Scénario 1 : Extraction complète du document.
-
Transformation de données semi-structurées en données structurées
Catégorie
Description
Références
Contexte
Les données Elasticsearch comportent souvent des champs dynamiques et une imbrication profonde. Cette fonctionnalité transforme les données semi-structurées en données structurées pour le calcul et le stockage en aval.
—
Fonctionnement
La solution analyse les données JSON provenant d'Elasticsearch, utilise des expressions de chemin pour aplatir les structures imbriquées et mappe les résultats sur des tables structurées. Les documents complexes peuvent être divisés en plusieurs tables selon les besoins.
—
Solutions
Pour les données JSON imbriquées, utilisez un chemin d'accès pour accéder à des propriétés spécifiques.
-
property
-
property.sub-property
-
property[0].sub-property
Scénario 2 : Synchroniser les propriétés de champs imbriqués ou objet
Pour les relations un-à-plusieurs, déroulez une propriété de type tableau pour diviser ses éléments en plusieurs lignes.
property[*].sub-property
Scénario 3 : Diviser une propriété de type tableau en plusieurs lignes
Fusionnez et dédupliquez les éléments d'un tableau de chaînes en une seule propriété.
property[]
Scénario 4 : Dédupliquer et fusionner une propriété de type tableau
Combinez plusieurs propriétés en une seule propriété.
property1,property2
Sélectionnez la première propriété non nulle d'une liste.
property1|property2
-
Ajouter une source de données
Avant de développer une tâche de synchronisation dans DataWorks, vous devez ajouter la source de données requise à DataWorks en suivant les instructions de la section Configuration de la source de données. Vous pouvez consulter les descriptions des paramètres dans la console DataWorks pour comprendre la signification des paramètres lors de l'ajout d'une source de données.
Tâches de synchronisation de données
Pour obtenir des informations sur le point d'entrée et la procédure de configuration d'une tâche de synchronisation, consultez les guides de configuration suivants.
Tâche de synchronisation hors ligne (table unique)
Consultez la section Configurer une tâche dans l'interface sans code ou Configurer une tâche dans l'éditeur de code.
Pour une référence complète des paramètres et un exemple de script, consultez la section Annexe 1 : Exemple de script et descriptions des paramètres.
Tâche d'écriture en temps réel (table unique)
Consultez la section Configurer une tâche de synchronisation en temps réel dans DataStudio (hérité).
Synchronisation en temps réel de base de données complète
Consultez la section Configurer une tâche de synchronisation en temps réel de base de données complète.
Annexe 1 : Exemple de script et paramètres
Configurer une tâche de synchronisation par lots à l'aide de l'éditeur de code
Si vous souhaitez configurer une tâche de synchronisation par lots à l'aide de l'éditeur de code, vous devez configurer les paramètres associés dans le script selon les exigences de format de script unifié. Pour plus d'informations, consultez la section Configuration en mode script. Les informations suivantes décrivent les paramètres que vous devez configurer pour les sources de données lors de la configuration d'une tâche de synchronisation par lots à l'aide de l'éditeur de code.
Exemple de script pour le lecteur
{
"order":{
"hops":[
{
"from":"Reader",
"to":"Writer"
}
]
},
"setting":{
"errorLimit":{
"record":"0" // The number of error records allowed.
},
"jvmOption":"",
"speed":{
"concurrent":3,
"throttle":false
}
},
"steps":[
{
"category":"reader",
"name":"Reader",
"parameter":{
"column":[ // The columns to read.
"id",
"name"
],
"endpoint":"http://es-cn-xxx.elasticsearch.aliyuncs.com:9200", // The endpoint.
"index":"aliyun_es_xx", // The index.
"password":"*******", // The password.
"multiThread":true,
"scroll":"5m", // The scroll context duration.
"pageSize":5000,
"connTimeOut":600000,
"readTimeOut":600000,
"retryCount":30,
"retrySleepTime":"10000",
"search":{
"range":{
"gmt_modified":{
"gte":0
}
}
}, // Query parameter. The content is identical to the query body of the Elasticsearch _search API.
"type":"doc",
"username":"aliyun_di" // The username.
},
"stepType":"elasticsearch"
},
{
"category":"writer",
"name":"Writer",
"parameter":{ },
"stepType":"stream"
}
],
"type":"job",
"version":"2.0" // The version number.
}
Paramètres du script du lecteur
|
Paramètre |
Description |
Obligatoire |
Valeur par défaut |
|
datasource |
Le nom d'une source de données DataWorks existante. |
Oui |
Aucune |
|
index |
Le nom de l'index dans Elasticsearch. |
Oui |
Aucune |
|
type |
Le nom du type d'un index dans Elasticsearch. |
Non |
Nom de l'index |
|
search |
Le corps de la requête pour Elasticsearch. |
Oui |
Aucune |
|
pageSize |
Le nombre d'enregistrements à lire par page. |
Non |
100 |
|
scroll |
Spécifie la durée de conservation du contexte de défilement (scroll) d'Elasticsearch pour la pagination.
|
Oui |
Aucune |
|
strictMode |
Indique s'il faut activer le mode strict. Si la valeur est définie sur |
Non |
true |
|
sort |
Le champ utilisé pour trier les résultats. |
Non |
Aucune |
|
retryCount |
Le nombre de tentatives en cas d'échec d'une opération. |
Non |
30 |
|
connTimeOut |
Le délai de connexion du client, en millisecondes. |
Non |
600 000 |
|
readTimeOut |
Le délai de lecture du client, en millisecondes. |
Non |
600 000 |
|
multiThread |
Indique s'il faut utiliser plusieurs threads pour les requêtes HTTP. |
Non |
true |
|
preemptiveAuth |
Indique s'il faut utiliser l'authentification préventive pour les requêtes HTTP. |
Non |
false |
|
retrySleepTime |
L'intervalle entre les tentatives, en millisecondes. |
Non |
10 000 |
|
discovery |
Indique s'il faut activer la découverte de nœuds.
|
Non |
false |
|
compression |
Indique s'il faut utiliser GZIP pour compresser le corps de la requête. Si vous utilisez GZIP, vous devez activer le paramètre http.compression sur le nœud Elasticsearch. |
Non |
false |
|
dateFormat |
Si un champ à synchroniser est de type date et que le mappage de champ ne spécifie pas de format, vous devez configurer le paramètre dateFormat. Cette configuration doit inclure tous les formats des champs de type date à synchroniser. Exemple : |
Non |
Aucune |
|
full |
Indique s'il faut synchroniser l'intégralité du contenu du document en tant que champ unique vers la destination. Pour plus d'informations, consultez la section Scénario 1 : Extraction complète des données. |
Non |
Aucune |
|
multi |
Une fonctionnalité avancée avec cinq cas d'utilisation. Elle comporte deux sous-propriétés : |
Non |
Aucune |
Exemple de script pour l'outil d'écriture
{
"order": {
"hops": [
{
"from": "Reader",
"to": "Writer"
}
]
},
"setting": {
"errorLimit": {
"record": "0"
},
"speed": {
"throttle":true, // If throttle is false, the mbps parameter is ignored and throttling is disabled. If throttle is true, throttling is enabled.
"concurrent":1, // The job concurrency.
"mbps":"12" // The maximum rate in Mbps (1 Mbps = 1 MB/s).
}
},
"steps": [
{
"category": "reader",
"name": "Reader",
"parameter": {
},
"stepType": "stream"
},
{
"category": "writer",
"name": "Writer",
"parameter": {
"datasource":"xxx",
"index": "test-1",
"type": "default",
"cleanup": true,
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"discovery": false,
"primaryKeyInfo":{
"type":"pk",
"fieldDelimiter":",",
"column":[]
},
"batchSize": 1000,
"dynamic":false,
"esPartitionColumn":[
{
"name":"col1",
"comment":"xx",
"type":"STRING"
}
],
"column": [
{
"name": "pk",
"type": "id"
},
{
"name": "col_ip",
"type": "ip"
},
{
"name": "col_array",
"type": "long",
"array": true
},
{
"name": "col_double",
"type": "double"
},
{
"name": "col_long",
"type": "long"
},
{
"name": "col_integer",
"type": "integer"
},
{
"name": "col_keyword",
"type": "keyword"
},
{
"name": "col_text",
"type": "text",
"analyzer": "ik_max_word",
"other_params":
{
"doc_values": false
}
},
{
"name": "col_geo_point",
"type": "geo_point"
},
{
"name": "col_date",
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
},
{
"name": "col_nested1",
"type": "nested"
},
{
"name": "col_nested2",
"type": "nested"
},
{
"name": "col_object1",
"type": "object"
},
{
"name": "col_object2",
"type": "object"
},
{
"name": "col_integer_array",
"type": "integer",
"array": true
},
{
"name": "col_geo_shape",
"type": "geo_shape",
"tree": "quadtree",
"precision": "10m"
}
]
},
"stepType": "elasticsearch"
}
],
"type": "job",
"version": "2.0"
}
Une instance Elasticsearch dans un environnement VPC peut être inaccessible depuis le groupe de ressources par défaut. Pour garantir la connectivité lors de la synchronisation des données, vous devez utiliser un groupe de ressources serverless (recommandé) ou un groupe de ressources exclusif pour Data Integration afin de vous connecter au VPC. Pour plus d'informations sur l'ajout de groupes de ressources, consultez la section Groupe de ressources Serverless.
Paramètres du script de l'outil d'écriture
|
Paramètre |
Description |
Obligatoire |
Valeur par défaut |
|
datasource |
Le nom de la source de données Elasticsearch. Si la source de données n'existe pas dans DataWorks, créez-en une au préalable. Pour plus d'informations, consultez la section Configurer une source de données Elasticsearch. |
Oui |
Aucune |
|
index |
Le nom de l'index dans Elasticsearch. |
Oui |
Aucune |
|
type |
Le type de l'index dans Elasticsearch. |
Non |
default |
|
cleanup |
Indique s'il faut supprimer et recréer l'index cible avant l'écriture.
|
Non |
false |
|
batchSize |
Le nombre de documents par écriture par lot dans Elasticsearch. |
Non |
1 000 |
|
trySize |
Le nombre de tentatives après un échec d'écriture dans Elasticsearch. |
Non |
30 |
|
timeout |
La période de délai d'attente du client. |
Non |
600 000 |
|
discovery |
Indique s'il faut activer la découverte de nœuds pour la tâche.
|
Non |
false |
|
compression |
Indique s'il faut activer la compression pour les requêtes HTTP. |
Non |
true |
|
multiThread |
Indique s'il faut utiliser plusieurs threads pour les requêtes HTTP. |
Non |
true |
|
ignoreWriteError |
Indique s'il faut ignorer les erreurs d'écriture. Si la valeur est définie sur true, le système ignore l'opération ayant échoué et poursuit l'écriture des données suivantes. |
Non |
false |
|
ignoreParseError |
Indique s'il faut ignorer les erreurs d'analyse du format des données et poursuivre l'écriture des données suivantes. |
Non |
true |
|
alias |
Un alias Elasticsearch fonctionne comme une vue de base de données. Par exemple, si vous créez un alias nommé my_index_alias pour l'index my_index, les opérations sur my_index_alias s'appliquent à my_index. S'il est configuré, un alias est créé pour l'index spécifié une fois l'importation des données terminée. |
Non |
Aucune |
|
aliasMode |
Le mode d'alias une fois l'importation des données terminée. Les valeurs valides sont append et exclusive.
Le système résout l'alias vers le nom réel de l'index. Vous pouvez utiliser des alias pour la migration d'index, les requêtes unifiées sur plusieurs index et pour implémenter une fonctionnalité semblable à celle des vues. |
Non |
append |
|
settings |
Les paramètres de création d'index, au même format que les paramètres officiels d'Elasticsearch. |
Non |
Aucune |
|
column |
Le paramètre column configure les champs d'un document. Pour chaque champ, vous pouvez définir des propriétés de base telles que name et type, ainsi que des propriétés avancées telles que Analyzer, Format et Array. Les types de champs suivants sont pris en charge par Elasticsearch :
Remarques sur les types de colonne :
Pour configurer des attributs Elasticsearch autres que type pour un champ dans column, utilisez le paramètre
Si vous souhaitez écrire les données source dans Elasticsearch sous forme de tableau, vous pouvez analyser les données source au format JSON ou à l'aide d'un délimiteur spécifié. Pour plus d'informations, consultez la section Annexe 2 : Écrire des données dans Elasticsearch sous forme de tableau. |
Oui |
Aucune |
|
dynamic |
Indique s'il faut utiliser le mappage dynamique d'Elasticsearch pour ajouter automatiquement des mappages pour les nouveaux champs d'un document.
Le type par défaut dans Elasticsearch 7.x est _doc. Si vous utilisez des mappages automatiques, définissez le type sur _doc et esVersion sur Vous devez passer en mode script et ajouter le paramètre de version : Important
Si vous rencontrez des erreurs de mappage de champs, vous pouvez activer ce paramètre pour tenter de résoudre le problème. Toutefois, cela peut entraîner une incohérence des types de champs par rapport à vos attentes ou provoquer des anomalies de données. Évaluez les risques liés à votre structure de données avant de l'activer. |
Non |
false |
|
actionType |
Spécifie le type d'action d'écriture. Les valeurs valides sont index et update :
|
Non |
index |
|
primaryKeyInfo |
Spécifie comment déterminer la clé primaire du document dans Elasticsearch.
|
Oui |
specific |
|
esPartitionColumn |
Indique s'il faut activer les écritures partitionnées en définissant le paramètre de routage Elasticsearch.
|
Non |
false |
|
enableWriteNull |
Indique s'il faut écrire les champs nuls de la source dans Elasticsearch. Valeurs valides :
|
Non |
true |
Annexe 2 : Écriture de tableaux dans Elasticsearch
Vous pouvez écrire les données source dans Elasticsearch sous forme de tableau en utilisant l'une des deux méthodes suivantes.
-
Analyser les données au format JSON
Par exemple, si les données source sont
"[1,2,3,4,5]", analysez les données en définissant json_array=true. Elles sont ensuite écrites dans Elasticsearch sous forme de tableau."parameter" : { { "name":"docs_1", "type":"keyword", "json_array":true } } -
Analyser les données à l'aide d'un délimiteur
Par exemple, si les données source sont
"1,2,3,4,5", analysez les données en définissant splitter=",". Elles sont ensuite écrites dans Elasticsearch sous forme de tableau.RemarqueUne tâche ne prend en charge qu'un seul délimiteur car le paramètre splitter est global pour la tâche. Vous ne pouvez donc pas configurer différents délimiteurs pour plusieurs champs de type tableau. Par exemple, si vos données source contiennent les colonnes
col1="1,2,3,4,5"etcol2="6-7-8-9-10", vous ne pouvez pas configurer un délimiteur distinct pour chaque colonne."parameter" : { "column": [ { "name": "docs_2", "array": true, "type": "long" } ], "splitter":","// Note: The splitter parameter must be at the same level as the column parameter. }
Annexe 3 : Exemples de scénarios
Scénario 1 : Extraction complète des données
Contexte : Extrait l'intégralité d'un document Elasticsearch dans un seul champ.
-
Exemple de configuration :
## reader: Original data in Elasticsearch "hits": [ { "_index": "mutiltest_1", "_type": "_doc", "_id": "IXgdO4MB4GR_1DmrjTXP", "_score": 1.0, "_source": { "feature1": "value1", "feature2": "value2", "feature3": "value3" } }] ## Data Integration Elasticsearch reader configuration "parameter": { "column": [ "content" ], "full":true } ## writer result: Writes one row and one column to the destination. {"_index":"mutiltest_1","_type":"_doc","_id":"IXgdO4MB4GR_1DmrjTXP","_source":{"feature1":"value1","feature2":"value2","feature3":"value3"},"sort":["IXgdO4MB4GR_1DmrjTXP"]}
Scénario 2 : Synchroniser les propriétés de champs imbriqués ou objet
Contexte : Utilise un chemin d'accès pour accéder aux propriétés d'un champ
objectounested.-
Syntaxe :
property
property.sub-property
property[0].sub-property
-
Configuration de l'éditeur de code :
"multi":{ "multi":true }RemarqueCette fonctionnalité n'est pas prise en charge dans l'interface sans code.
-
Exemple de configuration :
## reader: Original data in Elasticsearch "hits": [ { "_index": "mutiltest_1", "_type": "_doc", "_id": "7XAOOoMB4GR_1Dmrrust", "_score": 1.0, "_source": { "level1": { "level2": [ { "level3": "testlevel3_1" }, { "level3": "testlevel3_2" } ] } } } ] ## Data Integration Elasticsearch reader configuration "parameter": { "column": [ "level1", "level1.level2", "level1.level2[0]", "level1.level2.level3" ], "multi":{ "multi":true } } ## writer result: 1 row, 4 columns column1(level1): {"level2":[{"level3":"testlevel3_1"},{"level3":"testlevel3_2"}]} column2(level1.level2): [{"level3":"testlevel3_1"},{"level3":"testlevel3_2"}] column3(level1.level2[0]): {"level3":"testlevel3_1"} column4(level1.level2.level3): nullRemarqueSi un nœud ancêtre dans le chemin est un tableau, le résultat est
null. Par exemple, la récupération delevel1.level2.level3renvoienullcarlevel2est un tableau. Pour accéder à la propriété, vous devez spécifier un index, tel quelevel1.level2[0].level3oulevel1.level2[1].level3. La syntaxe wildcardlevel1.level2[*].level3n'est pas prise en charge.Les clés contenant un point (
.) ne sont pas prises en charge. Par exemple, si les données sont{"level1.level2":{"level3":"testlevel3_1"}}, le résultat estnull.
Scénario 3 : Diviser une propriété de type tableau en plusieurs lignes
Contexte : Pour les relations un-à-plusieurs, vous pouvez dérouler un tableau en divisant chaque élément en une ligne distincte.
Syntaxe :
property[*].sub-propertyEffet exemple : Les données source telles que
{ "splitKey": [1, 2, 3, 4, 5] }sont transformées en cinq lignes, chaque ligne contenant un élément du tableau.-
Configuration de l'éditeur de code :
"multi":{ "multi":true, "key": "headers" }RemarqueDans l'interface sans code, vous pouvez définir le paramètre split multi-row array column name pour obtenir le même effet en générant automatiquement la configuration de script correspondante.
La valeur de la propriété spécifiée par
keydoit être une liste. Sinon, une erreur se produit.
-
Exemple de configuration :
## reader: Original data in Elasticsearch [ { "_index": "lmtestjson", "_type": "_doc", "_id": "nhxmIYMBKDL4VkVLyXRN", "_score": 1.0, "_source": { "headers": [ { "remoteip": "192.0.2.1" }, { "remoteip": "192.0.2.2" } ] } }, { "_index": "lmtestjson", "_type": "_doc", "_id": "wRxsIYMBKDL4VkVLcXqf", "_score": 1.0, "_source": { "headers": [ { "remoteip": "192.0.2.3" }, { "remoteip": "192.0.2.4" } ] } } ] ## Data Integration Elasticsearch reader configuration { "column":[ "headers[*].remoteip" ] "multi":{ "multi":true, "key": "headers" } } ## writer result: 4 rows 192.0.2.1 192.0.2.2 192.0.2.3 192.0.2.4
Scénario 4 : Dédupliquer et fusionner les propriétés de type tableau
Contexte : Déduplique les éléments du tableau et les fusionne en une chaîne séparée par des virgules. Cela fonctionne également avec les sous-propriétés telles que
name1.name2. La déduplication est basée sur le résultattoString()de chaque élément.-
Syntaxe :
property[].L'inclusion de
[]dans le nom de la colonne déclenche cette opération de déduplication et de fusion. -
Configuration de l'éditeur de code :
"multi":{ "multi":true }RemarqueCette fonctionnalité n'est pas prise en charge dans l'interface sans code.
-
Exemple de configuration :
## reader: Original data in Elasticsearch "hits": [ { "_index": "mutiltest_1", "_type": "_doc", "_id": "4nbUOoMB4GR_1Dmryj8O", "_score": 1.0, "_source": { "feature1": [ "value1", "value1", "value2", "value2", "value3" ] } } ] ## Data Integration Elasticsearch reader configuration "parameter": { "column":[ "feature1[]" ], "multi":{ "multi":true } } ## writer result: 1 row, 1 column "value1,value2,value3"
Scénario 5 : Synchroniser sélectivement plusieurs propriétés
Contexte : Renvoie la première valeur de propriété non nulle d'une liste spécifiée. Si toutes les propriétés sont nulles ou absentes,
nullest renvoyé.-
Syntaxe :
property1|property2|...L'inclusion du caractère pipe (
|) dans le nom de la colonne déclenche cette sélection multi-propriétés. -
Configuration de l'éditeur de code :
"multi":{ "multi":true }RemarqueCette fonctionnalité n'est pas prise en charge dans l'interface sans code.
-
Exemple de configuration :
## reader: Original data in Elasticsearch "hits": [ { "_index": "mutiltest_1", "_type": "_doc", "_id": "v3ShOoMB4GR_1DmrZN22", "_score": 1.0, "_source": { "feature1": "feature1", "feature2": [ 1, 2, 3 ], "feature3": { "child": "feature3" } } }] ## Data Integration Elasticsearch reader configuration "parameter": { "column":[ "feature1|feature2|feature3" ], "multi":{ "multi":true } } ## writer result: 1 row, 1 column "feature1"
Scénario 6 : Fusionner et synchroniser plusieurs propriétés
Contexte : Concatène plusieurs valeurs de propriété en une seule chaîne séparée par des virgules.
-
Syntaxe :
property1,property2,...L'inclusion d'une virgule (
,) dans le nom de la colonne déclenche cette opération de fusion multi-propriétés. -
Configuration de l'éditeur de code :
"multi":{ "multi":true }RemarqueCette fonctionnalité n'est pas prise en charge dans l'interface sans code.
-
Exemple de configuration :
## reader: Original data in Elasticsearch "hits": [ { "_index": "mutiltest_1", "_type": "_doc", "_id": "v3ShOoMB4GR_1DmrZN22", "_score": 1.0, "_source": { "feature1": "feature1", "feature2": [ 1, 2, 3 ], "feature3": { "child": "feature3" } } }] ## Data Integration Elasticsearch reader configuration "parameter": { "column":[ "feature1,feature2,feature3" ], "multi":{ "multi":true } } ## writer result: 1 row, 1 column "feature1,[1,2,3],{\"child\":\"feature3\"}"
Références
Data Integration prend en charge de nombreuses autres sources de données. Pour une liste complète, consultez la section Sources de données prises en charge et solutions de synchronisation.