Tous les produits
Search
Centre de documentation

DataWorks:Source de données Elasticsearch

Dernière mise à jour :Aug 10, 2026

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.

Remarque

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_float ne peuvent pas être synchronisés.

  • Les index dont les noms de champs contiennent le mot-clé $ref ne 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.

Remarque

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

Important

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

    Scénario 5 : Fusion multi-propriétés

    Sélectionnez la première propriété non nulle d'une liste.

    property1|property2

    Scénario 6 : Sélection multi-propriétés

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)

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.

  • Une valeur trop faible peut entraîner l'expiration du contexte de défilement lors d'intervalles longs entre les lectures de pages, ce qui provoque une perte de données.

  • Une valeur trop élevée peut générer une erreur de requête si les requêtes simultanées dépassent la limite max_open_scroll_context du serveur.

Oui

Aucune

strictMode

Indique s'il faut activer le mode strict. Si la valeur est définie sur true, la tâche de lecture s'arrête en cas d'erreur shard.failed afin d'éviter la lecture de données partielles.

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.

  • true : Le client se connecte à un nœud aléatoire du cluster, actualise périodiquement la liste des serveurs et envoie des requêtes aux nœuds découverts.

  • false : Envoie des requêtes uniquement au point de terminaison configuré.

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 : "dateFormat" : "yyyy-MM-dd||yyyy-MM-dd HH:mm:ss".

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 : multi.key et multi.mult. Pour plus d'informations, consultez le tableau de la section Fonctionnalités avancées.

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"
}
Remarque

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.

  • true : Supprime et recrée l'index avant l'écriture, ce qui supprime toutes les données existantes.

  • false : Conserve les données existantes dans l'index.

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.

  • true : Se connecte à un nœud aléatoire du cluster. Lorsque la découverte de nœuds est activée, le client interroge et actualise périodiquement la liste des serveurs.

  • false : Le client se connecte uniquement aux points de terminaison configurés dans la source de données.

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.

  • Si aliasMode est défini sur append, l'index actuel est ajouté au mappage d'alias. Un alias peut être mappé à plusieurs index.

  • Si aliasMode est défini sur exclusive, l'alias existant est supprimé, puis l'index actuel est ajouté au mappage d'alias. Un alias ne peut être mappé qu'à un seul index.

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 :

- id  // Le type id correspond à _id dans Elasticsearch et peut être considéré comme une clé primaire unique. Lors de l'écriture des données, les documents ayant le même id s'écrasent mutuellement et ne sont pas indexés.
- string
- text
- keyword
- long
- integer
- short
- byte
- double
- float
- date
- boolean
- binary
- integer_range
- float_range
- long_range
- double_range
- date_range
- geo_point
- geo_shape
- ip
- token_count
- array
- object
- nested

Remarques sur les types de colonne :

  • Pour une colonne de type text, vous pouvez configurer des paramètres tels que analyzer, norms et index_options. Exemple :

    {
            "name": "col_text",
            "type": "text",
            "analyzer": "ik_max_word"
            }
  • Pour une colonne de type date, vous pouvez utiliser l'une des méthodes suivantes pour analyser les données source. Utilisez la même méthode de manière cohérente.

    • Méthode 1 : Écrire directement la valeur du champ issue du lecteur dans le champ données es.

      • Définissez origin:true. Ce paramètre est requis pour écrire directement la valeur brute du champ dans les données es.

      • Configurez "format" pour indiquer que lors de la création d'un mappage à l'aide de l'outil d'écriture es, la propriété format doit être définie pour ce champ. Voici un exemple :

          {
             "parameter":{
               "column":[{
                   "name": "col_date",
                   "type": "date",
                   "format": "yyyy-MM-dd HH:mm:ss",
                   "origin": true
                }]
           }
        }
    • Méthode 2 (Conversion de fuseau horaire) : Si vous souhaitez que Data Integration effectue la conversion des fuseaux horaires, ajoutez le paramètre Timezone.

      Le "format" configuré spécifie le format d'heure que Data Integration utilise pour l'analyse lors de la conversion de fuseau horaire. Exemple :

        {
           "parameter" :{
             "column": [{
                "name": "col_date",
                "type": "date",
                "format": "yyyy-MM-dd HH:mm:ss",
               "Timezone": "UTC"
             }]
         }
      }
  • Pour une colonne de type geo_shape, vous pouvez configurer les attributs tree (geohash ou quadtree) et precision. Exemple :

    {
            "name": "col_geo_shape",
            "type": "geo_shape",
            "tree": "quadtree",
            "precision": "10m"
            }

Pour configurer des attributs Elasticsearch autres que type pour un champ dans column, utilisez le paramètre other_params. Lors de la mise à jour des mappages, ce paramètre décrit les autres attributs Elasticsearch du champ.

 {
       "name": "guid",
       "other_params":
        {
           "doc_values": false
          },
        "type": "text"
      }

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.

  • true : Conserve le comportement de mappage automatique d'Elasticsearch.

  • false : Valeur par défaut. Les mappages Elasticsearch sont générés et mis à jour en fonction de la configuration des colonnes de la tâche de synchronisation.

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 7.

Vous devez passer en mode script et ajouter le paramètre de version : "esVersion": "7".

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 :

  • index : Utilise en interne le Index.Builder du SDK Elasticsearch pour construire des requêtes par lots. Lorsque vous utilisez l'action index d'Elasticsearch pour insérer un document, elle vérifie d'abord si un ID est spécifié dans les données du document :

    • Si aucun ID n'est spécifié, Elasticsearch génère un ID unique et ajoute le document.

    • Si un ID est spécifié, Elasticsearch remplace l'intégralité du document. Il ne prend pas en charge la mise à jour de champs spécifiques uniquement.

      Remarque

      Cette opération de mise à jour n'est pas identique à une mise à jour partielle dans Elasticsearch.

  • update : Met à jour un document en fonction d'un ID spécifié par l'utilisateur. Si l'ID n'existe pas dans l'index, un nouveau document est inséré. Si l'ID existe, l'opération met à jour les champs de colonne spécifiés et laisse les autres champs du document inchangés. Chaque opération update récupère l'intégralité du document pour modifier des champs spécifiques. Cette opération update ne prend pas en charge le filtrage conditionnel et n'effectue les mises à jour qu'en fonction de l'ID spécifié. Étant donné que chaque mise à jour nécessite la récupération du document original, cette opération peut avoir un impact significatif sur les performances.

    Remarque

    Si vous définissez le type d'action sur update, vous devez configurer le paramètre primaryKeyInfo.

Non

index

primaryKeyInfo

Spécifie comment déterminer la clé primaire du document dans Elasticsearch.

  • Business Primary Key (pk) : La valeur _id est définie sur la valeur d'un champ spécifique.

    "parameter":{
    "primaryKeyInfo":{
    "type":"pk",
    "column":["id"]}
    }
  • Composite Primary Key (specific) : La valeur _id est une concaténation des valeurs de plusieurs champs, séparées par le délimiteur spécifié par Primary Key Delimiter.

    Remarque

    Les noms de champ correspondent aux champs à écrire par l'outil d'écriture. Dans l'interface sans code, la section Configure Primary Key Columns répertorie uniquement les champs qui existent déjà dans l'index Elasticsearch.

    "parameter":{
    "primaryKeyInfo":{
    "type":"specific",
    "fieldDelimiter":",",
    "column":["col1","col2"]}
    }
  • No Primary Key (nopk) : L'_id est généré automatiquement par le système lors de l'écriture des données dans Elasticsearch.

    "primaryKeyInfo":{
    "type":"nopk"
    }

Oui

specific

esPartitionColumn

Indique s'il faut activer les écritures partitionnées en définissant le paramètre de routage Elasticsearch.

  • Activer le partitionnement : Les valeurs des colonnes spécifiées sont concatenées sans délimiteur et le résultat est utilisé comme valeur de routage. Lors de l'écriture des données, le système insère ou met à jour les documents dans le shard spécifié. Si vous activez le partitionnement, vous devez spécifier les colonnes de partition.

    {    "esPartitionColumn": [
            {
                "name":"col1",
                "comment":"xx",
                "type":"STRING"
                }
            ],
        }
  • Si vous ne configurez pas ce paramètre, _id est utilisé pour le routage par défaut, ce qui permet de répartir les documents de manière homogène et d'éviter le déséquilibre des données.

Non

false

enableWriteNull

Indique s'il faut écrire les champs nuls de la source dans Elasticsearch. Valeurs valides :

  • true : Écrit les champs nuls. Après la synchronisation, la valeur du champ correspondant dans Elasticsearch est nulle.

  • false : N'écrit pas les champs nuls. Le champ n'apparaît pas dans le document Elasticsearch.

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.

    Remarque

    Une 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" et col2="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 object ou nested.

  • Syntaxe :

    • property

    • property.sub-property

    • property[0].sub-property

  • Configuration de l'éditeur de code :

    "multi":{
        "multi":true
    }
    Remarque

    Cette 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):  null
    Remarque
    • Si un nœud ancêtre dans le chemin est un tableau, le résultat est null. Par exemple, la récupération de level1.level2.level3 renvoie null car level2 est un tableau. Pour accéder à la propriété, vous devez spécifier un index, tel que level1.level2[0].level3 ou level1.level2[1].level3. La syntaxe wildcard level1.level2[*].level3 n'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 est null.

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-property

  • Effet 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"
    }
    Remarque
    • Dans 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 key doit ê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ésultat toString() 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
    }
    Remarque

    Cette 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, null est 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
    }
    Remarque

    Cette 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
    }
    Remarque

    Cette 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.