Nesta página, explicamos como configurar um esquema personalizado para analisar mensagens de HL7v2 que não estão em conformidade com o padrão HL7v2.
Se você estiver convertendo mensagens de HL7v2 em outro formato, como FHIR ou OMOP, primeiro poderá analisar e ingerir as mensagens do HL7v2 em um armazenamento HL7v2. Use este guia para garantir que seja possível analisar e ingerir mensagens de HL7v2.
Visão geral
Às vezes, as mensagens de HL7v2 podem não estar em conformidade com os padrões HL7v2. Por exemplo, suas mensagens de HL7v2 podem conter segmentos que não estão incluídos no padrão HL7v2 ou os segmentos podem estar fora de ordem. Ao tentar ingerir mensagens não conformes, você pode encontrar erros.
Para ingerir as mensagens de HL7v2 não conformes, é preciso
modificar o objeto ParserConfig
ao criar ou editar um armazenamento de HL7v2. Em ParserConfig
, é
possível configurar a análise esquematizada com base em tipos e segmentos personalizados, determinar como mensagens HL7v2 rejeitadas
são processadas e muito mais.
Antes de configurar ParserConfig
, leia as seções a seguir para entender as mensagens do HL7v2, as definições de tipo e as definições de grupo.
Mensagens HL7v2
Nesta seção, apresentamos uma breve visão geral da estrutura das mensagens de HL7v2, que será útil ao configurar o analisador de esquema personalizado.
As mensagens de HL7v2 são baseadas em eventos e descrevem transições de estado e atualizações parciais em registros clínicos. Cada mensagem HL7v2 tem um tipo que define a finalidade dela. Os tipos de mensagem usam um código de três caracteres e são especificados no cabeçalho do segmento principal (MSH) obrigatório da mensagem. Há dezenas de tipos de mensagens, incluindo:
ADT
: usado para transmitir partes dos dados de administração de pacientes de um paciente.ORU
: usado para transmitir os resultados de observação.ORM
: usado para transmitir informações sobre um pedido.
Revise a estrutura das mensagens do HL7v2, que incluem segmentos, campos, componentes e subcomponentes:
Na figura 1, as seguintes partes da mensagem HL7v2 são rotuladas: segmento, cabeçalho do segmento, campos e componentes.
Por padrão, as mensagens de HL7v2 usam os caracteres a seguir para
separar informações. É possível modificar os delimitadores, separadores e terminadores de uma mensagem HL7v2 por mensagem no segmento MSH
.
Terminador de trecho:
\r
Se as mensagens de HL7v2 usarem um separador de segmento diferente, consulte o exemplo Terminador de segmento personalizado e campo personalizado.
Separador de campo:
|
Separador de componentes:
^
Separador de subcomponentes:
&
Separador de repetição:
~
Caracteres de escape:
\
Definições de tipo e grupo
Entender o analisador de esquema envolve o uso de definições de tipo e de grupo.
Definição do tipo
O termo "tipos" engloba o seguinte:
Tipos de segmento HL7v2, como
MSH
(cabeçalho do segmento da mensagem),DG1
(diagnóstico) ePID
(identificação do paciente)Para uma lista de todos os tipos de segmento de HL7v2, consulte Definições de segmento.
Tipos de dados HL7v2, como
ST
(dados de string),TS
(carimbo de data/hora) eSI
(ID da sequência)Para uma lista de todos os tipos de dados padrão de HL7v2, consulte Tipos de dados.
Especifique os tipos no campo name
dentro do objeto Type
.
Os tipos usam um formato modular que consiste em um segmento e os campos, componentes e subcomponentes do segmento. As informações em um objeto Type
indicam como analisar ou interpretar um segmento e
respondem a perguntas como estas:
- Quais campos existem no segmento?
- Quais são os tipos de dados dos campos?
O exemplo a seguir mostra a definição do tipo para um segmento ZCD
personalizado:
{ "type": { "name": "ZCD", // Segment type "fields": [ { "name": "1", "type": "ST", // Primitive string data type "minOccurs": 1, // Must occur at least once "maxOccurs": 1 // Not repeated, because it can only occur once }, { "name": "2", "type": "A", // Custom data type "minOccurs": 1 // Repeated, because maxOccurs is not defined } ] } }
Neste exemplo, o segmento ZCD
contém dois campos, chamados 1
e 2
.
O tipo de dados de 1
é ST
, que é um tipo de dados de string primitivo. O tipo de dados de 2
é A
, que é um tipo de dados personalizado.
A definição a seguir para o tipo de dados personalizados A
mostra que ele também contém outro tipo de dados personalizado, chamado B
.
{ "type": { "name": "A", // Custom data type "fields": [ { "name": "1", "type": "ST", // Primitive string data type "minOccurs": 1, // Must occur at least once "maxOccurs": 1 // Not repeated, because it can only occur once }, { "name": "2", "type": "B", // Custom data type "minOccurs": 1, "maxOccurs": 1 } ] } }
O exemplo a seguir mostra a definição para o tipo de dados personalizados B
, que tem um campo chamado 1
com o tipo de dados ST
e um campo chamado 2
que tem um tipo de dados de repetição ST
:
{ "type": { "name": "B", // Custom data type "fields": [ { "name": "1", "type": "ST", // Primitive string data type "minOccurs": 1, // Must occur at least once "maxOccurs": 1 // Not repeated, because it can only occur once }, { "name": "2", "type": "ST" "minOccurs": 1, "maxOccurs": 1 } ] } }
Conhecendo as informações sobre o segmento e os tipos de dados, é possível estimar como é o segmento ZCD
na mensagem HL7v2 original. Este exemplo mostra a mensagem de HL7v2 com o campo A
repetido uma vez, o que é permitido porque maxOccurs
não está definido no campo A
:
ZCD|ZCD_field_1|A_field_1^B_component_1&B_component_2_repetition_1~A_field_1^B_component_1&B_component_2_repetition_2
Na figura 2, as seguintes partes da definição de tipo são rotuladas: segmento, cabeçalho do segmento, campos, componentes, subcomponentes e repetições.
Definição do grupo
Os grupos são definidos no nível do segmento e fornecem informações sobre quais tipos de segmentos podem aparecer em cada mensagem HL7v2.
Especifique grupos na matriz groups
dentro do objeto GroupOrSegment
.
Considere o seguinte snippet de uma estrutura de grupo para uma mensagem ADT_A01
de HL7v2:
- O primeiro
segment
na matrizmembers
éMSH
(cabeçalho do segmento da mensagem), porqueMSH
é obrigatório em todas as mensagens HL7v2. Um
group
chamadoGroup 1
.Esse grupo só pode ocorrer no máximo
2
vezes e contém o segmentoZCD
personalizado.Normalmente, um
group
contém vários segmentos aninhados agrupados logicamente e outros grupos, mas neste exemploGroup 1
contém apenas um segmento:ZCD
.
{ "ADT_A01": { "members": [ { "segment": { "type": "MSH" } }, { "group": { "name": "Group 1", "minOccurs": 1, "maxOccurs": "2", "members": [ { "segment": { "type": "ZCD" } } ] } } ] } }
Conhecendo as informações sobre os grupos, é possível estimar como será a
mensagem original do HL7v2 se ZCD
ocorrer duas vezes na mensagem do HL7v2,
o que é permitido porque maxOccurs
em Group 1
está definido como 2
.
O restante do segmento ZCD
é desconhecido sem conhecer também a
definição do tipo.
MSH|^~\&|||||20100308000000||ADT^A01|23701|1|2.3|| ZCD|ZCD_CONTENT ZCD|ZCD_CONTENT
Na Figura 3, as seguintes partes da definição do grupo são rotuladas: o segmento e o cabeçalho do segmento.
Configurar um esquema personalizado em um armazenamento HL7v2
Nas seções a seguir, explicamos os componentes de um esquema personalizado e como configurá-lo em um armazenamento HL7v2.
Configuração do tipo de armazenamento HL7v2
Após entender a definição do tipo de uma mensagem de HL7v2, especifique uma configuração de tipo em um armazenamento de HL7v2. Para especificar a configuração, adicione
uma matriz de types
e uma version
.
O exemplo a seguir mostra como especificar a configuração para os tipos mostrados na Definição de tipo em um armazenamento de HL7v2.
Observe que a configuração usa a matriz version
para especificar os campos mshField
e value
. Esses
campos correspondem a campos e componentes no segmento MSH.
A matriz types
que você especifica só se aplica a mensagens que têm um
segmento MSH que corresponde aos valores de mshField
e value
na
matriz version
. Isso permite ingerir mensagens de HL7v2 com versões diferentes
no mesmo armazenamento de HL7v2.
{ "types": [ { "version": [ { "mshField": "12", "value": "2.3" } ], "type": [ { "name": "ZCD", // Segment type "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "A", "minOccurs": 1 } ] }, { "name": "A", // Data type "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "B", "minOccurs": 1, "maxOccurs": 1 } ] }, { "name": "B", // Data type "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "ST" } ] } ] } ] }
Configuração do grupo de armazenamentos HL7v2
Você pode usar grupos para configurar uma estrutura aninhada no nível de uma "associação".
Os grupos são especificados em uma matriz members
no nível do segmento. A estrutura de um segmento é previsível e normalmente contém campos, componentes e subcomponentes, mas o segmento em si pode estar em qualquer nível da mensagem HL7v2.
Como uma configuração de tipo, uma configuração de grupo usa
um filtro version
para permitir a ingestão de mensagens de HL7v2 com versões diferentes no mesmo armazenamento de HL7v2.
Confira no exemplo a seguir como especificar a configuração do grupo mostrado em Definição de grupo em um armazenamento de HL7v2:
{ "version": [ { "mshField": "12", "value": "2.3" } ], "messageSchemaConfigs": { "ADT_A01": { "members": [ { "segment": { "type": "MSH" } }, { "group": { "name": "Group 1", "maxOccurs": "2", "members": [ "segment": { "type": "ZCD" } ] } } ] } } }
Conclua a configuração do armazenamento de HL7v2
Ao combinar as configurações de tipo e grupo, é possível determinar como será a configuração de esquema personalizado completa no armazenamento de HL7v2. Também é possível determinar se o esquema personalizado corresponde a uma mensagem de HL7v2 semelhante a esta:
MSH|^~\&|||||20100101000000||ADT^A01^A01|23701|1|2.3||
ZCD|ZCD_field_1|A_field_1^B_component_1&B_component_2_repetition_1~A_field_1^B_component_1&B_component_2_repetition_2
Expanda a seção a seguir para ver o esquema personalizado completo no armazenamento de HL7v2 e continue criando um armazenamento de HL7v2 que usa o esquema personalizado:
Abrir
{ "parserConfig": { "schema": { "schemas": [ { "version": [ { "mshField": "12", "value": "2.3" } ], "messageSchemaConfigs": { "ADT_A01": { "name": "ADT_A01", "members": [ { "segment": { "type": "MSH", "minOccurs": 1, "maxOccurs": 1 } }, { "group": { "name": "Group 1", "minOccurs": 1, "maxOccurs": "2", "members": [ { "segment": { "type": "ZCD" } } ] } } ] } } } ], "types": [ { "version": [ { "mshField": "12", "value": "2.3" } ], "type": [ { "name": "ZCD", // Segment type "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "A" "minOccurs": 1, "maxOccurs": 1 } ] }, { "name": "A", // Data type "fields": [ { "name": "1", "type": "ST" "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "B" "minOccurs": 1, "maxOccurs": 1 } ] }, { "name": "B", // Data type "fields": [ { "name": "1", "type": "ST" "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "ST" "minOccurs": 1 } ] } ] } ] }, "version": "V3" } }
Criar um armazenamento de HL7v2 com o esquema personalizado
Para criar um armazenamento de HL7v2 que usa o esquema personalizado completo, conclua esta seção.
Antes de usar os dados da solicitação, faça as substituições a seguir:
- PROJECT_ID: o ID do seu projeto do Google Cloud;
- LOCATION: o local do conjunto de dados;
- DATASET_ID: o conjunto de dados pai do armazenamento de HL7v2
- HL7V2_STORE_ID: o ID da loja de HL7v2
Solicitar corpo JSON:
{ "parserConfig": { "schema": { "schemas": [ { "version": [ { "mshField": "12", "value": "2.3" } ], "messageSchemaConfigs": { "ADT_A01": { "name": "ADT_A01", "members": [ { "segment": { "type": "MSH", "minOccurs": 1 } }, { "group": { "name": "Group 1", "minOccurs": 1, "members": [ { "segment": { "type": "ZCD" } } ] } } ] } } } ], "types": [ { "version": [ { "mshField": "12", "value": "2.3" } ], "type": [ { "name": "ZCD", "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "A", "minOccurs": 1 } ] }, { "name": "A", "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "B", "minOccurs": 1, "maxOccurs": 1 } ] }, { "name": "B", "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "ST", "minOccurs": 1, "maxOccurs": 1 } ] } ] } ] }, "version": "V3" } }
Para enviar a solicitação, escolha uma destas opções:
curl
Salve o corpo da solicitação em um arquivo chamado request.json
.
Execute o comando a seguir no terminal para criar ou substituir
esse arquivo no diretório atual:
cat > request.json << 'EOF' { "parserConfig": { "schema": { "schemas": [ { "version": [ { "mshField": "12", "value": "2.3" } ], "messageSchemaConfigs": { "ADT_A01": { "name": "ADT_A01", "members": [ { "segment": { "type": "MSH", "minOccurs": 1 } }, { "group": { "name": "Group 1", "minOccurs": 1, "members": [ { "segment": { "type": "ZCD" } } ] } } ] } } } ], "types": [ { "version": [ { "mshField": "12", "value": "2.3" } ], "type": [ { "name": "ZCD", "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "A", "minOccurs": 1 } ] }, { "name": "A", "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "B", "minOccurs": 1, "maxOccurs": 1 } ] }, { "name": "B", "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "ST", "minOccurs": 1, "maxOccurs": 1 } ] } ] } ] }, "version": "V3" } } EOF
Depois execute o comando a seguir para enviar a solicitação REST:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores?hl7V2StoreId=HL7V2_STORE_ID"
PowerShell
Salve o corpo da solicitação em um arquivo chamado request.json
.
Execute o comando a seguir no terminal para criar ou substituir
esse arquivo no diretório atual:
@' { "parserConfig": { "schema": { "schemas": [ { "version": [ { "mshField": "12", "value": "2.3" } ], "messageSchemaConfigs": { "ADT_A01": { "name": "ADT_A01", "members": [ { "segment": { "type": "MSH", "minOccurs": 1 } }, { "group": { "name": "Group 1", "minOccurs": 1, "members": [ { "segment": { "type": "ZCD" } } ] } } ] } } } ], "types": [ { "version": [ { "mshField": "12", "value": "2.3" } ], "type": [ { "name": "ZCD", "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "A", "minOccurs": 1 } ] }, { "name": "A", "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "B", "minOccurs": 1, "maxOccurs": 1 } ] }, { "name": "B", "fields": [ { "name": "1", "type": "ST", "minOccurs": 1, "maxOccurs": 1 }, { "name": "2", "type": "ST", "minOccurs": 1, "maxOccurs": 1 } ] } ] } ] }, "version": "V3" } } '@ | Out-File -FilePath request.json -Encoding utf8
Depois execute o comando a seguir para enviar a solicitação REST:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores?hl7V2StoreId=HL7V2_STORE_ID" | Select-Object -Expand Content
Você receberá uma resposta JSON semelhante a esta:
Ingerir e analisar a mensagem HL7v2 usando o esquema personalizado
Para ingerir uma versão codificada em base64 da mensagem HL7v2, preencha esta seção.
Antes de usar os dados da solicitação, faça as substituições a seguir:
- PROJECT_ID: é o ID do projeto do Google Cloud.
- LOCATION: o local do conjunto de dados pai
- DATASET_ID: o conjunto de dados pai do armazenamento de HL7v2
- HL7V2_STORE_ID: o ID da loja de HL7v2
Solicitar corpo JSON:
{ "message": { "data": "TVNIfF5+XCZ8fHx8fDIwMTAwMTAxMDAwMDAwfHxBRFReQTAxXkEwMXwyMzcwMXwxfDIuM3x8DVpDRHxaQ0RfZmllbGRfMXxBX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMX5BX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMQ==" } }
Para enviar a solicitação, escolha uma destas opções:
curl
Salve o corpo da solicitação em um arquivo chamado request.json
.
Execute o comando a seguir no terminal para criar ou substituir
esse arquivo no diretório atual:
cat > request.json << 'EOF' { "message": { "data": "TVNIfF5+XCZ8fHx8fDIwMTAwMTAxMDAwMDAwfHxBRFReQTAxXkEwMXwyMzcwMXwxfDIuM3x8DVpDRHxaQ0RfZmllbGRfMXxBX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMX5BX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMQ==" } } EOF
Depois execute o comando a seguir para enviar a solicitação REST:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages:ingest"
PowerShell
Salve o corpo da solicitação em um arquivo chamado request.json
.
Execute o comando a seguir no terminal para criar ou substituir
esse arquivo no diretório atual:
@' { "message": { "data": "TVNIfF5+XCZ8fHx8fDIwMTAwMTAxMDAwMDAwfHxBRFReQTAxXkEwMXwyMzcwMXwxfDIuM3x8DVpDRHxaQ0RfZmllbGRfMXxBX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMX5BX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMQ==" } } '@ | Out-File -FilePath request.json -Encoding utf8
Depois execute o comando a seguir para enviar a solicitação REST:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages:ingest" | Select-Object -Expand Content
Você receberá uma resposta JSON semelhante a esta:
Determinar a cardinalidade do campo
É possível determinar a cardinalidade de um campo em uma mensagem de HL7v2 definindo os seguintes campos no armazenamento de HL7v2:
minOccurs
: determina o número mínimo de vezes que um grupo, segmento, campo, componente ou subcomponente precisa estar presente ou repetido nas mensagens HL7v2 recebidas.maxOccurs
: determina o número máximo de vezes que um grupo, segmento, campo, componente ou subcomponente pode estar presente ou repetido nas mensagens HL7v2 recebidas.
Ignorar elementos ausentes
Defina ignoreMinOccurs
como true
se quiser que a API HL7v2 aceite todas as mensagens de HL7v2 recebidas, independentemente
de elementos ausentes. Isso significa que uma mensagem não será rejeitada se não houver grupos, segmentos, campos, componentes ou subcomponentes obrigatórios.
Se você não conseguir ingerir mensagens de HL7v2 porque faltam campos obrigatórios nas mensagens, defina ignoreMinOccurs
como true
.
Tipo de campo curinga
O caractere curinga, *
, é um tipo especial usado para campos. O uso de *
indica ao
analisador de HL7v2 que o campo precisa ser analisado com base na estrutura da
mensagem de HL7v2. Usar *
no lugar de um valor de um campo é útil
quando você não quer aplicar um tipo de dados de campo estrito. Contanto que o
conteúdo no campo siga o padrão HL7v2, a API Cloud Healthcare poderá
analisar a mensagem de HL7v2.
Por exemplo, considere a seguinte definição de tipo. O campo 2
usa um caractere curinga em vez de um tipo de dados de campo. A definição é
equivalente à primeira em Definição de tipo e não
exige que você especifique os tipos A
e B
:
"type": { "name": "ZCD" "fields": [ { "name": "1", "type": "ST" }, { "name": "2", "type": "*" } ] }
A seguir
Saiba como configurar analisadores de esquema personalizados com os exemplos de analisadores de esquema personalizado.