As fontes de dados do Elasticsearch fornecem canais bidirecionais de leitura e gravação para sincronizar dados entre o DataWorks e o Elasticsearch.
Aplicabilidade
Os grupos de recursos públicos suportam o Elasticsearch 5.x, enquanto Serverless resource groups (recommended) e os grupos de recursos dedicados para integração de dados suportam as versões 5.x, 6.x, 7.x e 8.x do Elasticsearch.
Para mais detalhes sobre os grupos de recursos serverless, consulte Use a Serverless resource group.
Para mais detalhes sobre os grupos de recursos dedicados para integração de dados, consulte Use a dedicated resource group for data integration.
O Elasticsearch é um mecanismo de busca corporativo e de código aberto, desenvolvido sob a licença Apache. Construído sobre o Lucene, ele oferece recursos de busca distribuída e análise de dados. A tabela a seguir mapeia os conceitos principais do Elasticsearch para seus equivalentes em bancos de dados relacionais.
|
Elasticsearch |
Banco de dados relacional |
|
Elasticsearch (instância) |
banco de dados relacional (instância) |
|
índice |
banco de dados |
|
tipo |
tabela |
|
documento |
linha |
|
campo |
coluna |
Uma instância do Elasticsearch pode conter vários índices. Cada índice armazena vários tipos, cada tipo contém vários documentos e cada documento é composto por vários campos. O plugin Elasticsearch Writer usa a API REST do Elasticsearch para gravar dados em lote no Elasticsearch.
Versões suportadas
O DataWorks suporta as versões 5.x, 6.x, 7.x e 8.x do Alibaba Cloud Elasticsearch, mas não oferece suporte para o Elasticsearch autogerenciado.
Limitações
As seguintes limitações se aplicam às leituras e gravações offline no Elasticsearch:
O Elasticsearch Reader busca informações de shard no servidor para a sincronização de dados. Todos os shards devem estar ativos durante a sincronização para evitar inconsistências nos dados.
Para o Elasticsearch 6.x ou superior, use um serverless resource group (recommended) ou um exclusive resource group for Data Integration.
Os campos
scaled_floatnão podem ser sincronizados.Os índices não podem ser sincronizados se os nomes de seus campos contiverem a palavra-chave
$ref.
Tipos de campo suportados
|
Tipo |
Leitura offline |
Gravação offline |
Gravação em tempo real |
|
binary |
Suportado |
Suportado |
Suportado |
|
boolean |
Suportado |
Suportado |
Suportado |
|
keyword |
Suportado |
Suportado |
Suportado |
|
constant_keyword |
Não suportado |
Não suportado |
Não suportado |
|
wildcard |
Não suportado |
Não suportado |
Não suportado |
|
long |
Suportado |
Suportado |
Suportado |
|
integer |
Suportado |
Suportado |
Suportado |
|
short |
Suportado |
Suportado |
Suportado |
|
byte |
Suportado |
Suportado |
Suportado |
|
double |
Suportado |
Suportado |
Suportado |
|
float |
Suportado |
Suportado |
Suportado |
|
half_float |
Não suportado |
Não suportado |
Não suportado |
|
scaled_float |
Não suportado |
Não suportado |
Não suportado |
|
unsigned_long |
Não suportado |
Não suportado |
Não suportado |
|
date |
Suportado |
Suportado |
Suportado |
|
date_nanos |
Não suportado |
Não suportado |
Não suportado |
|
alias |
Não suportado |
Não suportado |
Não suportado |
|
object |
Suportado |
Suportado |
Suportado |
|
flattened |
Não suportado |
Não suportado |
Não suportado |
|
nested |
Suportado |
Suportado |
Suportado |
|
join |
Não suportado |
Não suportado |
Não suportado |
|
integer_range |
Suportado |
Suportado |
Suportado |
|
float_range |
Suportado |
Suportado |
Suportado |
|
long_range |
Suportado |
Suportado |
Suportado |
|
double_range |
Suportado |
Suportado |
Suportado |
|
date_range |
Suportado |
Suportado |
Suportado |
|
ip_range |
Não suportado |
Suportado |
Suportado |
|
ip |
Suportado |
Suportado |
Suportado |
|
version |
Suportado |
Suportado |
Suportado |
|
murmur3 |
Não suportado |
Não suportado |
Não suportado |
|
aggregate_metric_double |
Não suportado |
Não suportado |
Não suportado |
|
histogram |
Não suportado |
Não suportado |
Não suportado |
|
text |
Suportado |
Suportado |
Suportado |
|
annotated-text |
Não suportado |
Não suportado |
Não suportado |
|
completion |
Suportado |
Não suportado |
Não suportado |
|
search_as_you_type |
Não suportado |
Não suportado |
Não suportado |
|
token_count |
Suportado |
Não suportado |
Não suportado |
|
dense_vector |
Não suportado |
Não suportado |
Não suportado |
|
rank_feature |
Não suportado |
Não suportado |
Não suportado |
|
rank_features |
Não suportado |
Não suportado |
Não suportado |
|
geo_point |
Suportado |
Suportado |
Suportado |
|
geo_shape |
Suportado |
Suportado |
Suportado |
|
point |
Não suportado |
Não suportado |
Não suportado |
|
shape |
Não suportado |
Não suportado |
Não suportado |
|
percolator |
Não suportado |
Não suportado |
Não suportado |
|
string |
Suportado |
Suportado |
Suportado |
Como funciona
O Elasticsearch Reader funciona da seguinte maneira:
Ele usa a API _searchscrollslice do Elasticsearch, combinando seu recurso de scroll slice com o particionamento multithread do Data Integration.
Ele converte os tipos de dados com base na configuração de mapeamento no Elasticsearch.
Para mais informações, consulte a documentação oficial do Elasticsearch.
O Elasticsearch Reader busca informações de shard no servidor para a sincronização de dados. Para evitar inconsistências nos dados, certifique-se de que todos os shards no lado do servidor permaneçam ativos durante a sincronização.
Configuração básica
Em ambientes de produção, remova os comentários do código antes de executar a tarefa.
{
"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.
}
Recursos avançados
-
Extração completa de documentos
Extraia todo o conteúdo de um documento do Elasticsearch para um único campo. Para detalhes de configuração, consulte Scenario 1: Full document pull.
-
Transformar dados semiestruturados em dados estruturados
Categoria
Descrição
Referências
Contexto
Os dados do Elasticsearch frequentemente possuem campos dinâmicos e aninhamento profundo. Este recurso transforma dados semiestruturados em dados estruturados para computação e armazenamento downstream.
—
Como funciona
A solução analisa dados JSON do Elasticsearch, usa expressões de caminho para achatar estruturas aninhadas e mapeia os resultados para tabelas estruturadas. Documentos complexos podem ser divididos em várias tabelas conforme a necessidade.
—
Soluções
Para dados JSON aninhados, use um caminho para acessar propriedades específicas.
-
propriedade
-
propriedade.subpropriedade
-
propriedade[0].subpropriedade
Para relacionamentos de um para muitos, expanda uma propriedade de array para dividir seus elementos em várias linhas.
propriedade[*].subpropriedade
Mescle e deduplique elementos de um array de strings em uma única propriedade.
propriedade[]
Combine várias propriedades em uma única propriedade.
propriedade1,propriedade2
Selecione a primeira propriedade não nula de uma lista.
propriedade1|propriedade2
-
Adicionar uma fonte de dados
Antes de desenvolver uma tarefa de sincronização no DataWorks, adicione a fonte de dados necessária ao DataWorks seguindo as instruções em Data source configuration. Visualize as descrições dos parâmetros no console do DataWorks para entender o significado dos parâmetros ao adicionar uma fonte de dados.
Tarefas de sincronização de dados
Para obter informações sobre o ponto de entrada e o procedimento de configuração de uma tarefa de sincronização, consulte os seguintes guias de configuração.
Tarefa de sincronização offline (tabela única)
Consulte Configure a task in the codeless UI ou Configure a task in the code editor.
Para a referência completa de parâmetros e uma demonstração de script, consulte Appendix 1: Script demo and parameter descriptions.
Tarefa de gravação em tempo real (tabela única)
Consulte Configure a real-time synchronization task in DataStudio (Legacy).
Sincronização em tempo real de banco de dados completo
Consulte Configure a real-time full-database synchronization task.
Apêndice 1: Demonstração de script e parâmetros
Configurar uma tarefa de sincronização em lote usando o editor de código
Para configurar uma tarefa de sincronização em lote no editor de código, defina os parâmetros relacionados no script de acordo com os requisitos de formato unificado. Para mais informações, consulte Script mode configuration. As informações a seguir descrevem os parâmetros obrigatórios para as fontes de dados ao configurar uma tarefa de sincronização em lote no editor de código.
Demonstração de script do Reader
{
"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.
}
Parâmetros do script do Reader
|
Parâmetro |
Descrição |
Obrigatório |
Padrão |
|
datasource |
O nome de uma fonte de dados existente no DataWorks. |
Sim |
Nenhum |
|
index |
O nome do index no Elasticsearch. |
Sim |
Nenhum |
|
type |
O nome do type de um index no Elasticsearch. |
Não |
Nome do índice |
|
search |
O corpo da consulta para o Elasticsearch. |
Sim |
Nenhum |
|
pageSize |
O número de registros a serem lidos por página. |
Não |
100 |
|
scroll |
Especifica por quanto tempo manter o contexto de scroll do Elasticsearch ativo para paginação.
|
Sim |
Nenhum |
|
strictMode |
Especifica se o modo estrito está ativado. Se definido como |
Não |
true |
|
sort |
O campo usado para ordenar os resultados. |
Não |
Nenhum |
|
retryCount |
O número de tentativas de repetição após uma falha. |
Não |
30 |
|
connTimeOut |
O tempo limite de conexão do cliente, em milissegundos. |
Não |
600.000 |
|
readTimeOut |
O tempo limite de leitura do cliente, em milissegundos. |
Não |
600.000 |
|
multiThread |
Especifica se várias threads serão usadas para requisições HTTP. |
Não |
true |
|
preemptiveAuth |
Especifica se a autenticação preemptiva será usada para requisições HTTP. |
Não |
false |
|
retrySleepTime |
O intervalo entre as tentativas, em milissegundos. |
Não |
10.000 |
|
discovery |
Especifica se a descoberta de nós está ativada.
|
Não |
false |
|
compression |
Especifica se o GZIP será usado para compactar o corpo da requisição. Ao usar o GZIP, ative a configuração http.compression no nó do Elasticsearch. |
Não |
false |
|
dateFormat |
Se um campo a ser sincronizado for do tipo data e o mapeamento de campo não especificar um formato, configure o parâmetro dateFormat. Essa configuração deve incluir todos os formatos dos campos do tipo data a serem sincronizados. Exemplo: |
Não |
Nenhum |
|
full |
Especifica se todo o conteúdo do documento será sincronizado como um único campo para o destino. Para mais informações, consulte Scenario 1: Full data pull. |
Não |
Nenhum |
|
multi |
Um recurso avançado com cinco casos de uso. Possui duas subpropriedades: |
Não |
Nenhum |
Demonstração de script do Writer
{
"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"
}
Uma instância do Elasticsearch em um ambiente VPC pode estar inacessível a partir do grupo de recursos padrão. Para garantir a conectividade para a sincronização de dados, use um serverless resource group (recommended) ou um grupo de recursos exclusivo para o Data Integration para se conectar à VPC. Para mais informações sobre como adicionar grupos de recursos, consulte Serverless resource group.
Parâmetros do script do Writer
|
Parâmetro |
Descrição |
Obrigatório |
Padrão |
|
datasource |
O nome da fonte de dados do Elasticsearch. Se a fonte de dados não existir no DataWorks, crie uma antes. Para mais informações, consulte Configure an Elasticsearch data source. |
Sim |
Nenhum |
|
index |
O nome do índice no Elasticsearch. |
Sim |
Nenhum |
|
type |
O tipo do índice no Elasticsearch. |
Não |
default |
|
cleanup |
Especifica se o índice de destino será excluído e recriado antes da gravação.
|
Não |
false |
|
batchSize |
O número de documentos por lote de gravação no Elasticsearch. |
Não |
1.000 |
|
trySize |
O número de tentativas de repetição após uma falha de gravação no Elasticsearch. |
Não |
30 |
|
timeout |
O tempo limite do cliente. |
Não |
600.000 |
|
discovery |
Especifica se a descoberta de nós está ativada para a tarefa.
|
Não |
false |
|
compression |
Especifica se a compactação está ativada para requisições HTTP. |
Não |
true |
|
multiThread |
Especifica se várias threads serão usadas para requisições HTTP. |
Não |
true |
|
ignoreWriteError |
Especifica se os erros de gravação serão ignorados. Se definido como true, o sistema ignora a operação com falha e continua gravando os dados subsequentes. |
Não |
false |
|
ignoreParseError |
Especifica se os erros de análise de formato de dados serão ignorados, continuando a gravação dos dados subsequentes. |
Não |
true |
|
alias |
Um alias do Elasticsearch funciona como uma visualização de banco de dados. Por exemplo, se você criar um alias chamado my_index_alias para o índice my_index, as operações em my_index_alias serão aplicadas ao my_index. Se configurado, um alias é criado para o índice especificado após a conclusão da importação de dados. |
Não |
Nenhum |
|
aliasMode |
O modo de alias após a conclusão da importação de dados. Os valores válidos são append e exclusive.
O sistema resolve o alias para o nome real do índice. Use aliases para migração de índices, consultas unificadas em vários índices e para implementar funcionalidades semelhantes a visualizações. |
Não |
append |
|
settings |
As configurações de criação de índice, no mesmo formato das configurações oficiais do Elasticsearch. |
Não |
Nenhum |
|
column |
O parâmetro column configura os campos em um documento. Para cada campo, você pode definir propriedades básicas como name e type, e propriedades avançadas como Analyzer, Format e Array. Os seguintes tipos de campo são suportados pelo Elasticsearch:
Observações sobre os tipos de coluna:
Para configurar atributos do Elasticsearch diferentes de type para um campo em column, use o parâmetro
Para gravar dados de origem no Elasticsearch como um array, analise os dados de origem no formato JSON ou use um delimitador específico. Para mais informações, consulte Appendix 2: Write data to Elasticsearch as an array. |
Sim |
Nenhum |
|
dynamic |
Especifica se o mapeamento dinâmico do Elasticsearch será usado para adicionar automaticamente mapeamentos para novos campos em um documento.
O type padrão no Elasticsearch 7.x é _doc. Ao usar mapeamentos automáticos, defina o type como _doc e o esVersion como Alterne para o modo de script e adicione o parâmetro de versão: Importante
Caso encontre erros de mapeamento de campo, ative este parâmetro para tentar resolver o problema. No entanto, isso pode causar inconsistências nos tipos de campo em relação ao esperado ou gerar anomalias nos dados. Avalie os riscos para sua estrutura de dados antes de ativá-lo. |
Não |
false |
|
actionType |
Especifica o tipo de ação de gravação. Os valores válidos são index e update:
|
Não |
index |
|
primaryKeyInfo |
Especifica como determinar a chave primária do documento no Elasticsearch.
|
Sim |
specific |
|
esPartitionColumn |
Especifica se as gravações particionadas serão ativadas ao definir o parâmetro de roteamento do Elasticsearch.
|
Não |
false |
|
enableWriteNull |
Especifica se os campos nulos da origem serão gravados no Elasticsearch. Valores válidos:
|
Não |
true |
Apêndice 2: Gravação de arrays no Elasticsearch
Grave dados de origem no Elasticsearch como um array usando um dos dois métodos a seguir.
-
Analisar dados no formato JSON
Por exemplo, se os dados de origem forem
"[1,2,3,4,5]", analise os dados definindo json_array=true. Eles serão gravados no Elasticsearch como um array."parameter" : { { "name":"docs_1", "type":"keyword", "json_array":true } } -
Analisar dados usando um delimitador
Por exemplo, se os dados de origem forem
"1,2,3,4,5", analise os dados definindo splitter=",". Eles serão gravados no Elasticsearch como um array.NotaUma tarefa suporta apenas um delimitador, pois o parâmetro splitter é global. Portanto, não é possível configurar delimitadores diferentes para vários campos de array. Por exemplo, se os dados de origem contiverem as colunas
col1="1,2,3,4,5"ecol2="6-7-8-9-10", não configure um delimitador separado para cada coluna."parameter" : { "column": [ { "name": "docs_2", "array": true, "type": "long" } ], "splitter":","// Note: The splitter parameter must be at the same level as the column parameter. }
Apêndice 3: Exemplos de cenários
Cenário 1: Extração completa de dados
Contexto: Extrai um documento inteiro do Elasticsearch para um único campo.
-
Configuração de exemplo:
## 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"]}
Cenário 2: Sincronizar propriedades de campos aninhados ou de objetos
Contexto: Usa um caminho para acessar propriedades de um campo
objectounested.-
Sintaxe:
propriedade
propriedade.subpropriedade
propriedade[0].subpropriedade
-
Configuração do editor de código:
"multi":{ "multi":true }NotaEste recurso não é suportado na interface sem código.
-
Configuração de exemplo:
## 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): nullNotaSe um nó ancestral no caminho for um array, o resultado será
null. Por exemplo, recuperarlevel1.level2.level3retornanullporquelevel2é um array. Para acessar a propriedade, especifique um índice, comolevel1.level2[0].level3oulevel1.level2[1].level3. A sintaxe de curingalevel1.level2[*].level3não é suportada.Chaves que contêm um ponto (
.) não são suportadas. Por exemplo, se os dados forem{"level1.level2":{"level3":"testlevel3_1"}}, o resultado seránull.
Cenário 3: Dividir uma propriedade de array em várias linhas
Contexto: Para relacionamentos de um para muitos, expanda um array dividindo cada elemento em uma linha separada.
Sintaxe:
property[*].sub-propertyEfeito de exemplo: Dados de origem como
{ "splitKey": [1, 2, 3, 4, 5] }são transformados em cinco linhas, com cada linha contendo um elemento do array.-
Configuração do editor de código:
"multi":{ "multi":true, "key": "headers" }NotaNa interface sem código, defina o parâmetro split multi-row array column name para obter o mesmo efeito gerando automaticamente a configuração de script correspondente.
O valor da propriedade especificada por
keydeve ser uma lista. Caso contrário, ocorrerá um erro.
-
Configuração de exemplo:
## 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
Cenário 4: Deduplicar e mesclar propriedades de array
Contexto: Deduplica elementos de array e os mescla em uma string separada por vírgulas. Isso também funciona com subpropriedades como
name1.name2. A deduplicação é baseada no resultadotoString()de cada elemento.-
Sintaxe:
property[].Incluir
[]no nome da coluna aciona essa operação de deduplicação e mesclagem. -
Configuração do editor de código:
"multi":{ "multi":true }NotaEste recurso não é suportado na interface sem código.
-
Configuração de exemplo:
## 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"
Cenário 5: Sincronizar seletivamente várias propriedades
Contexto: Retorna o primeiro valor de propriedade não nulo de uma lista especificada. Se todas as propriedades forem nulas ou estiverem ausentes,
nullserá retornado.-
Sintaxe:
property1|property2|...Incluir o caractere pipe (
|) no nome da coluna aciona essa seleção de múltiplas propriedades. -
Configuração do editor de código:
"multi":{ "multi":true }NotaEste recurso não é suportado na interface sem código.
-
Configuração de exemplo:
## 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"
Cenário 6: Mesclar e sincronizar várias propriedades
Contexto: Concatena vários valores de propriedade em uma única string separada por vírgulas.
-
Sintaxe:
property1,property2,...Incluir uma vírgula (
,) no nome da coluna aciona essa operação de mesclagem de múltiplas propriedades. -
Configuração do editor de código:
"multi":{ "multi":true }NotaEste recurso não é suportado na interface sem código.
-
Configuração de exemplo:
## 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\"}"
Referências
O Data Integration suporta muitas outras fontes de dados. Para a lista completa, consulte Supported data sources and synchronization solutions.