En esta página se explica cómo configurar un esquema personalizado para analizar mensajes HL7v2 que no se ajusten al estándar HL7v2.
Si vas a convertir mensajes HL7v2 a otro formato, como FHIR u OMOP, primero debes poder analizar e ingerir tus mensajes HL7v2 en un almacén HL7v2. Usa esta guía para asegurarte de que puedes analizar e ingerir correctamente mensajes HL7v2.
Información general
En ocasiones, es posible que tus mensajes HL7v2 no cumplan los estándares de HL7v2. Por ejemplo, tus mensajes HL7v2 pueden contener segmentos que no se incluyan en el estándar HL7v2 o los segmentos pueden estar desordenados. Al intentar ingerir mensajes no conformes, es posible que se produzcan errores.
Para ingerir los mensajes HL7v2 no conformes, debes modificar el objeto ParserConfig
al crear o editar un almacén HL7v2. En ParserConfig
, puedes configurar el análisis esquematizado en función de tipos y segmentos personalizados, determinar cómo se gestionan los mensajes HL7v2 rechazados y más.
Antes de configurar ParserConfig
, lee las siguientes secciones para entender los mensajes HL7v2, las definiciones de tipo y las definiciones de grupo.
Mensajes HL7v2
En esta sección se ofrece una breve descripción general de la estructura de los mensajes HL7v2, que será útil al configurar el analizador de esquemas personalizados.
Los mensajes HL7v2 se basan en eventos y describen transiciones de estado y actualizaciones parciales de los registros clínicos. Cada mensaje HL7v2 tiene un tipo que define su finalidad. Los tipos de mensaje usan un código de tres caracteres y se especifican en el encabezado del segmento principal obligatorio (MSH) del mensaje. Hay docenas de tipos de mensajes, entre los que se incluyen los siguientes:
ADT
: se usa para transmitir partes de los datos de administración de pacientes de un paciente.ORU
: se usa para transmitir los resultados de las observaciones.ORM
: se usa para transmitir información sobre un pedido.
Consulta la estructura de los mensajes HL7v2, que se componen de segmentos, campos, componentes y subcomponentes:
En la figura 1, se han etiquetado las siguientes partes del mensaje HL7v2: el segmento, el encabezado del segmento, los campos y los componentes.
De forma predeterminada, los mensajes HL7v2 usan los siguientes caracteres para separar la información. Puedes anular los delimitadores, separadores y terminadores de un mensaje HL7v2 por mensaje en el segmento MSH
.
Terminador de segmentos:
\r
Si tus mensajes HL7v2 usan un separador de segmentos diferente, consulta el ejemplo Terminador de segmentos y campo personalizados.
Separador de campos:
|
Separador de componentes:
^
Separador de subcomponentes:
&
Separador de repetición:
~
Caracteres de escape:
\
Definiciones de tipos y grupos
Para entender el analizador de esquemas, se utilizan definiciones de tipo y definiciones de grupo.
Definición de tipo
El término "tipos" abarca lo siguiente:
Tipos de segmentos HL7v2, como
MSH
(encabezado de segmento de mensaje),DG1
(diagnóstico) yPID
(identificación del paciente)Para ver una lista de todos los tipos de segmentos HL7v2, consulta Definiciones de segmentos.
Tipos de datos HL7v2, como
ST
(datos de cadena),TS
(marca de tiempo) ySI
(ID de secuencia)Para ver una lista de todos los tipos de datos predeterminados de HL7v2, consulta Tipos de datos.
Los tipos se especifican en el campo name
del objeto Type
.
Los tipos usan un formato modular que consta de un segmento y los campos, componentes y subcomponentes de ese segmento. La información de un objeto Type
indica cómo analizar o interpretar un segmento y responde a preguntas como las siguientes:
- ¿Qué campos contiene el segmento?
- ¿Cuáles son los tipos de datos de los campos?
En el siguiente ejemplo se muestra la definición de tipo de un segmento personalizado ZCD
:
{ "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 de 1
es ST
, que es un tipo de datos de cadena primitivo. El tipo de datos de 2
es A
, que es un tipo de datos personalizado.
La siguiente definición de tipo del tipo de datos personalizado A
muestra que también contiene otro tipo de datos personalizado, 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 ejemplo siguiente se muestra la definición de tipo del tipo de datos personalizado B
, que tiene un campo llamado 1
con el tipo de datos ST
y un campo llamado 2
que tiene el tipo de datos ST
repetido:
{ "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, puede estimar cómo será el segmento ZCD
del mensaje HL7v2 original. En este ejemplo se muestra el mensaje HL7v2 con el campo A
repetido una vez, lo que se permite porque maxOccurs
no está definido 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, se han etiquetado las siguientes partes de la definición de tipo: 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 proporcionan información sobre los tipos de segmentos que pueden aparecer en cada mensaje HL7v2.
Los grupos se especifican en la matriz groups
del objeto GroupOrSegment
.
Veamos el siguiente fragmento de una estructura de grupo de un mensaje HL7v2 ADT_A01
:
- El primer
segment
de la matrizmembers
esMSH
(encabezado de segmento de mensaje), porqueMSH
es obligatorio en todos los mensajes HL7v2. Un
group
llamadoGroup 1
.Este grupo solo puede aparecer un máximo de
2
veces y contiene el segmento personalizadoZCD
.Normalmente, un
group
contiene varios segmentos anidados y otros grupos agrupados de forma lógica, pero en este ejemploGroup 1
solo contiene un 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 sería el mensaje HL7v2 original si ZCD
se repitiera dos veces en el mensaje HL7v2, lo cual está permitido porque maxOccurs
en Group 1
está definido como 2
.
El resto del segmento ZCD
es desconocido si no se conoce la definición del tipo.
MSH|^~\&|||||20100308000000||ADT^A01|23701|1|2.3|| ZCD|ZCD_CONTENT ZCD|ZCD_CONTENT
En la figura 3, se han etiquetado las siguientes partes de la definición del grupo: el segmento y el encabezado del segmento.
Configurar un esquema personalizado en un almacén HL7v2
En las siguientes secciones se explican los componentes de un esquema personalizado y cómo configurarlo en un almacén HL7v2.
Configuración del tipo de almacén HL7v2
Una vez que conozcas la definición de tipo de un mensaje HL7v2, podrás especificar una configuración de tipo en un almacén HL7v2. Para especificar la configuración, añade una matriz de types
y una matriz de version
.
En el ejemplo siguiente se muestra cómo especificar la configuración de los tipos que se muestran en Definición de tipo en un almacén HL7v2.
Ten en cuenta que la configuración usa la matriz version
para especificar los campos mshField
y value
. Estos campos se corresponden con los campos y componentes del segmento MSH.
La matriz types
que especifiques solo se aplicará a los mensajes que tengan un segmento MSH que corresponda a los valores de mshField
y value
de la matriz version
. De esta forma, puedes ingerir mensajes HL7v2 con diferentes versiones en el mismo almacén 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 de grupos de almacenes HL7v2
Puedes usar grupos para configurar una estructura anidada a nivel de "miembro".
Los grupos se especifican en una
matriz members
a nivel de segmento. La estructura de un segmento es predecible y suele contener campos, componentes y subcomponentes, pero el segmento en sí puede estar en cualquier nivel del mensaje HL7v2.
Al igual que una configuración de tipo, una configuración de grupo usa un filtro version
para permitirte ingerir mensajes HL7v2 con diferentes versiones en el mismo almacén HL7v2.
En el ejemplo siguiente se muestra cómo especificar la configuración del grupo que se muestra en Definición de grupo en un almacén HL7v2:
{ "version": [ { "mshField": "12", "value": "2.3" } ], "messageSchemaConfigs": { "ADT_A01": { "members": [ { "segment": { "type": "MSH" } }, { "group": { "name": "Group 1", "maxOccurs": "2", "members": [ "segment": { "type": "ZCD" } ] } } ] } } }
Completar la configuración de un almacén HL7v2
Si combinas la configuración de tipo y la de grupo, puedes determinar cómo será la configuración completa del esquema personalizado en el almacén de HL7v2. También puede determinar que el esquema personalizado coincida 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
Despliega la siguiente sección para ver el esquema personalizado completo del almacén HL7v2 y, a continuación, crea un almacén HL7v2 que utilice el esquema personalizado:
Mostrar
{ "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" } }
Crear un almacén HL7v2 con el esquema personalizado
Para crear un almacén HL7v2 que utilice el esquema personalizado completo, completa esta sección.
Antes de usar los datos de la solicitud, haz las siguientes sustituciones:
- PROJECT_ID: el ID de tu Google Cloud proyecto
- LOCATION: la ubicación del conjunto de datos
- DATASET_ID: el conjunto de datos superior del almacén HL7v2
- HL7V2_STORE_ID: el ID del almacén 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 siguiente comando en el terminal para crear o sobrescribir 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
A continuación, ejecuta el siguiente comando para enviar tu solicitud 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 siguiente comando en el terminal para crear o sobrescribir 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
A continuación, ejecuta el siguiente comando para enviar tu solicitud 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 siguiente:
Ingiere y analiza el mensaje HL7v2 con el esquema personalizado
Para ingerir una versión codificada en base64 del mensaje HL7v2, completa esta sección.
Antes de usar los datos de la solicitud, haz las siguientes sustituciones:
- PROJECT_ID: tu ID de proyecto Google Cloud
- LOCATION: la ubicación del conjunto de datos principal
- DATASET_ID: el conjunto de datos superior del almacén HL7v2
- HL7V2_STORE_ID: el ID del almacén 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 siguiente comando en el terminal para crear o sobrescribir este archivo en el directorio actual:
cat > request.json << 'EOF' { "message": { "data": "TVNIfF5+XCZ8fHx8fDIwMTAwMTAxMDAwMDAwfHxBRFReQTAxXkEwMXwyMzcwMXwxfDIuM3x8DVpDRHxaQ0RfZmllbGRfMXxBX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMX5BX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMQ==" } } EOF
A continuación, ejecuta el siguiente comando para enviar tu solicitud 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 siguiente comando en el terminal para crear o sobrescribir este archivo en el directorio actual:
@' { "message": { "data": "TVNIfF5+XCZ8fHx8fDIwMTAwMTAxMDAwMDAwfHxBRFReQTAxXkEwMXwyMzcwMXwxfDIuM3x8DVpDRHxaQ0RfZmllbGRfMXxBX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMX5BX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMQ==" } } '@ | Out-File -FilePath request.json -Encoding utf8
A continuación, ejecuta el siguiente comando para enviar tu solicitud 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 siguiente:
Determinar la cardinalidad de un campo
Para determinar la cardinalidad de un campo en un mensaje HL7v2, puedes definir los siguientes campos en el almacén HL7v2:
minOccurs
: determina el número mínimo de veces que un grupo, un segmento, un campo, un componente o un subcomponente deben estar presentes o repetirse en los mensajes HL7v2 entrantes.maxOccurs
: determina el número máximo de veces que un grupo, un segmento, un campo, un componente o un subcomponente pueden estar presentes o repetirse en los mensajes HL7v2 entrantes.
Ignorar elementos que faltan
Define ignoreMinOccurs
como true
si quieres que la API HL7v2 acepte todos los mensajes HL7v2 entrantes, independientemente
de 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 ingerir mensajes HL7v2 porque les faltan campos obligatorios, te recomendamos que asignes el valor ignoreMinOccurs
a true
.
Tipo de campo comodín
El carácter comodín *
es un tipo especial que se usa en los campos. Si se usa *
, se indica al analizador HL7v2 que el campo se debe analizar en función de la estructura del mensaje HL7v2. Usar *
en lugar de un valor en un campo es útil cuando no quieres aplicar un tipo de datos estricto. Siempre que el contenido del campo cumpla el estándar HL7v2, la API Cloud Healthcare podrá analizar el mensaje 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 de 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": "*" } ] }
Siguientes pasos
Consulte más información sobre cómo configurar analizadores de esquemas personalizados en Ejemplos de analizadores de esquemas personalizados.