En esta página, se explica cómo configurar un esquema personalizado para analizar mensajes de HL7v2 que no cumplan con el estándar HL7v2.
Si conviertes los mensajes HL7v2 en otro formato, como FHIR o OMOP, primero debes poder analizar y transferir tus mensajes HL7v2 a un almacén HL7v2. Usa esta guía para asegurarte de que puedas analizar y transferir mensajes HL7v2 de forma correcta.
Descripción general
A veces, es posible que tus mensajes HL7v2 no cumplan con los estándares HL7v2. Por ejemplo, es posible que tus mensajes HL7v2 contengan segmentos que no se incluyen en el estándar HL7v2 o los segmentos podrían estar desordenados. Cuando intentes transferir mensajes que no cumplan con las políticas, es posible que encuentres errores.
Para transferir los mensajes de HL7v2 que no cumplen con las especificaciones, debes modificar el objeto ParserConfig
cuando crees o edites un almacén HL7v2. Dentro de ParserConfig
, puedes configurar el análisis esquematizado en función de tipos y segmentos personalizados, determinar cómo se manejan los mensajes de HL7v2 rechazados y mucho más.
Antes de configurar ParserConfig
, lee las siguientes secciones para comprender los mensajes de HL7v2, las definiciones de tipo y las definiciones de grupo.
Mensajes de HL7v2
En esta sección, se proporciona una breve descripción general de la estructura de los mensajes de HL7v2, que será útil para configurar el analizador de esquemas personalizado.
Los mensajes de HL7v2 se basan en eventos y describen las transiciones de estado y las actualizaciones parciales de los registros clínicos. Cada mensaje de HL7v2 tiene un tipo de mensaje que define el propósito del mensaje. Los tipos de mensajes usan un código de tres caracteres y se especifican en el encabezado de segmento principal (MSH) obligatorio del mensaje. Existen decenas de tipos de mensaje, incluidos los siguientes:
ADT
: se usa para transmitir partes de los datos administrativos de pacientesORU
: se usa para transmitir los resultados de la observación.ORM
: Se usa para transmitir información sobre un pedido.
Revisa la estructura de los mensajes de HL7v2, que incluyen segmentos, campos, componentes y subcomponentes:
En la figura 1, las siguientes partes del mensaje de HL7v2 están etiquetadas: el segmento, el encabezado del segmento, los campos y los componentes.
De forma predeterminada, los mensajes de HL7v2 usan los siguientes caracteres para separar la información. Puedes anular los delimitadores, los separadores y los terminadores de un mensaje de HL7v2 por mensaje en el segmento MSH
.
Terminador de segmentos:
\r
Si tus mensajes de HL7v2 usan un separador de segmento diferente, consulta el ejemplo de terminador de segmento personalizado y campo personalizado.
Separador de campos:
|
Separador de componentes:
^
Separador de subcomponentes:
&
Separador de repeticiones:
~
Caracteres de escape:
\
Definiciones de tipos y grupos
Comprender el analizador de esquemas implica el uso de definiciones de tipo y definiciones de grupo.
Definición del tipo
El término “tipos” abarca lo siguiente:
Tipos de segmentos HL7v2, como
MSH
(Encabezado de segmento de mensaje),DG1
(Diagnóstico) ePID
(Identificación de pacientes)Para obtener una lista de todos los tipos de segmentos HL7v2, consulta Definiciones de segmentos.
Tipos de datos HL7v2, como
ST
(datos de string),TS
(marca de tiempo) ySI
(ID de secuencia)Para obtener una lista de todos los tipos de datos predeterminados de HL7v2, consulta Tipos de datos.
Debes especificar los tipos en el campo name
dentro del objeto Type
.
Los tipos usan un formato modular que consta de un segmento y los campos, componentes y subcomponentes del segmento. La información en un objeto Type
indica cómo analizar o interpretar un segmento y responde a preguntas como las siguientes:
- ¿Qué campos hay en el segmento?
- ¿Cuáles son los tipos de datos de los campos?
En el siguiente ejemplo, se muestra la definición de tipo para un 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 } ] } }
En este ejemplo, el segmento ZCD
contiene dos campos, llamados 1
y 2
.
El tipo de datos para 1
es ST
, que es un tipo de datos de string básico. El tipo de datos para 2
es A
, que es un tipo de datos personalizado.
La siguiente definición de tipo para el tipo de datos personalizado A
muestra que también contiene otro tipo de datos personalizados, llamado 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 } ] } }
En el siguiente ejemplo, se muestra la definición para el tipo de datos personalizado B
, que tiene un campo llamado 1
con el tipo de datos ST
y un campo llamado 2
que tiene un tipo de datos de ST
que se repite:
{ "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 } ] } }
Con la información sobre el segmento y los tipos de datos, puedes calcular cómo se ve el segmento ZCD
en el mensaje de HL7v2 original. En este ejemplo, se muestra el mensaje de HL7v2 con el campo A
repetido una vez, lo que puede hacer porque maxOccurs
no está configurado en el 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
En la figura 2, las siguientes partes de la definición del tipo están etiquetadas: el segmento, el encabezado del segmento, los campos, los componentes, los subcomponentes y las repeticiones.
Definición del grupo
Los grupos se definen a nivel de segmento y te indican información sobre qué tipos de segmentos pueden aparecer en cada mensaje de HL7v2.
Debes especificar los grupos en el arreglo groups
dentro del objeto GroupOrSegment
.
Considera el siguiente fragmento de una estructura de grupo para un mensaje de HL7v2 ADT_A01
:
- El primer elemento
segment
del arreglomembers
esMSH
(encabezado de segmento de mensaje), ya queMSH
es obligatorio en cada mensaje de HL7v2. Una
group
llamadaGroup 1
.Este grupo solo puede ocurrir un máximo de
2
veces y contiene el segmentoZCD
personalizado.Por lo general, un
group
contiene varios segmentos anidados de forma lógica y otros grupos, pero en este ejemplo,Group 1
solo contiene un único segmento:ZCD
.
{ "ADT_A01": { "members": [ { "segment": { "type": "MSH" } }, { "group": { "name": "Group 1", "minOccurs": 1, "maxOccurs": "2", "members": [ { "segment": { "type": "ZCD" } } ] } } ] } }
Con la información sobre los grupos, puedes estimar cómo se ve el mensaje de HL7v2 original si ZCD
ocurre dos veces en el mensaje de HL7v2, lo que está permitido hacer porque maxOccurs
en Group 1
se configura como 2
.
El resto del segmento ZCD
se desconoce sin también conocer la definición de tipo.
MSH|^~\&|||||20100308000000||ADT^A01|23701|1|2.3|| ZCD|ZCD_CONTENT ZCD|ZCD_CONTENT
En la figura 3, las siguientes partes de la definición del grupo están etiquetadas: el segmento y el encabezado del segmento.
Configura un esquema personalizado en un almacén de HL7v2
En las siguientes secciones, se explican los componentes de un esquema personalizado y cómo configurarlo en un almacén de HL7v2.
Configuración del tipo de almacén de HL7v2
Después de comprender la definición de tipo de un mensaje de HL7v2, puedes especificar una configuración de tipo en un almacén de HL7v2. Para especificar la configuración, agrega un array de types
y un array de version
.
En el siguiente ejemplo, se muestra cómo especificar la configuración para los tipos que se muestran en Definición de tipos en un almacén HL7v2.
Ten en cuenta que la configuración usa el array version
para especificar los campos mshField
y value
. Estos campos corresponden a los campos y componentes del segmento MSH.
El arreglo types
que especificas solo se aplica a los mensajes que tienen un segmento MSH que corresponde a los valores de mshField
y value
en el arreglo version
. Esto te permite transferir mensajes HL7v2 con diferentes versiones al mismo almacén 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" } ] } ] } ] }
Configuración del grupo de almacenes de HL7v2
Puedes usar grupos para configurar una estructura anidada en el nivel de una “membresía”.
Los grupos se especifican en un array members
a nivel de segmento. La estructura de un segmento es predecible y, por lo general, contiene campos, componentes y subcomponentes, pero el segmento en sí puede estar en cualquier nivel del mensaje de HL7v2.
Al igual que una configuración de tipo, una configuración de grupo usa un filtro version
para permitirte transferir mensajes de HL7v2 con diferentes versiones al mismo almacén de HL7v2.
En el siguiente ejemplo, se muestra cómo especificar la configuración para el grupo que se muestra en Definición de grupo en un almacén 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" } ] } } ] } } }
Completa la configuración del almacén de HL7v2
Cuando combinas la configuración de type y la de group, puedes determinar cómo se ve la configuración de esquema personalizada completa en el almacén de HL7v2. También puedes determinar que el esquema personalizado coincide con un mensaje HL7v2 similar al siguiente:
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
Expande la siguiente sección para ver el esquema personalizado completo en el almacén de HL7v2. Luego, continúa creando un almacén de HL7v2 que use el esquema personalizado:
Expandir
{ "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" } }
Crea un almacén de HL7v2 con el esquema personalizado
Para crear un almacén HL7v2 que use el esquema personalizado completo, completa esta sección.
Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:
- PROJECT_IDEl ID de tu proyecto de Google Cloud.
- LOCATION: La ubicación del conjunto de datos
- DATASET_ID: El conjunto de datos superior del almacén de HL7v2
- HL7V2_STORE_ID es el ID del almacén de HL7v2.
Cuerpo JSON de la solicitud:
{ "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 tu solicitud, elige una de estas opciones:
curl
Guarda el cuerpo de la solicitud en un archivo llamado request.json
.
Ejecuta el comando siguiente en la terminal para crear o reemplazar este archivo en el directorio actual:
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
Luego, ejecuta el siguiente comando para enviar tu solicitud de 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
Guarda el cuerpo de la solicitud en un archivo llamado request.json
.
Ejecuta el comando siguiente en la terminal para crear o reemplazar este archivo en el directorio actual:
@' { "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
Luego, ejecuta el siguiente comando para enviar tu solicitud de 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
Deberías recibir una respuesta JSON similar a la que se muestra a continuación:
Transfiere y analiza el mensaje de HL7v2 con el esquema personalizado
Para transferir una versión codificada en Base64 del mensaje de HL7v2, completa esta sección.
Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:
- PROJECT_ID: El ID del proyecto de Google Cloud.
- LOCATION es la ubicación del conjunto de datos superior.
- DATASET_ID es el conjunto de datos superior del almacén de HL7v2
- HL7V2_STORE_ID: Es el ID del almacén de HL7v2.
Cuerpo JSON de la solicitud:
{ "message": { "data": "TVNIfF5+XCZ8fHx8fDIwMTAwMTAxMDAwMDAwfHxBRFReQTAxXkEwMXwyMzcwMXwxfDIuM3x8DVpDRHxaQ0RfZmllbGRfMXxBX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMX5BX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMQ==" } }
Para enviar tu solicitud, elige una de estas opciones:
curl
Guarda el cuerpo de la solicitud en un archivo llamado request.json
.
Ejecuta el comando siguiente en la terminal para crear o reemplazar este archivo en el directorio actual:
cat > request.json << 'EOF' { "message": { "data": "TVNIfF5+XCZ8fHx8fDIwMTAwMTAxMDAwMDAwfHxBRFReQTAxXkEwMXwyMzcwMXwxfDIuM3x8DVpDRHxaQ0RfZmllbGRfMXxBX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMX5BX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMQ==" } } EOF
Luego, ejecuta el siguiente comando para enviar tu solicitud de 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
Guarda el cuerpo de la solicitud en un archivo llamado request.json
.
Ejecuta el comando siguiente en la terminal para crear o reemplazar este archivo en el directorio actual:
@' { "message": { "data": "TVNIfF5+XCZ8fHx8fDIwMTAwMTAxMDAwMDAwfHxBRFReQTAxXkEwMXwyMzcwMXwxfDIuM3x8DVpDRHxaQ0RfZmllbGRfMXxBX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMX5BX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMQ==" } } '@ | Out-File -FilePath request.json -Encoding utf8
Luego, ejecuta el siguiente comando para enviar tu solicitud de 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
Deberías recibir una respuesta JSON similar a la que se muestra a continuación:
Determina la cardinalidad de campo
Para determinar la cardinalidad de un campo en un mensaje de HL7v2, configura los siguientes campos en el almacén de HL7v2:
minOccurs
: determina la cantidad mínima de veces que un grupo, segmento, campo, componente o subcomponente debe estar presente o repetido en los mensajes HL7v2 entrantes.maxOccurs
: determina la cantidad máxima de veces que un grupo, segmento, campo, componente o subcomponente puede estar presente o repetido en mensajes HL7v2 entrantes.
Ignora los elementos faltantes
Establece ignoreMinOccurs
en true
si deseas que la API de HL7v2 acepte todos los mensajes HL7v2 entrantes sin importar los elementos que falten. Esto significa que un mensaje no se rechazará si le faltan grupos, segmentos, campos, componentes o subcomponentes obligatorios.
Si no puedes transferir mensajes de HL7v2 porque a los mensajes les faltan campos obligatorios, te recomendamos configurar ignoreMinOccurs
como true
.
Tipo de campo comodín
El carácter comodín, *
, es un tipo especial que se usa para los campos. El uso de *
indica al analizador de HL7v2 que el campo se debe analizar según la estructura en el mensaje de HL7v2. Usar *
en lugar de un valor para un campo es útil cuando no deseas aplicar un tipo de datos de campo estricto. Siempre que el contenido en el campo siga el estándar HL7v2, la API de Cloud Healthcare puede analizar el mensaje de HL7v2.
Por ejemplo, considera la siguiente definición de tipo. El campo 2
usa un carácter comodín en lugar de un tipo de datos de campo. La definición es equivalente a la primera definición en Definición de tipo y no requiere que especifiques los tipos A
y B
:
"type": { "name": "ZCD" "fields": [ { "name": "1", "type": "ST" }, { "name": "2", "type": "*" } ] }
¿Qué sigue?
Obtén más información sobre cómo configurar analizadores de esquema personalizados con Ejemplos del analizador de esquema personalizado.