Questa pagina spiega come configurare uno schema personalizzato per analizzare i messaggi HL7v2 che non sono conformi allo standard HL7v2.
Se stai convertendo i messaggi HL7v2 in un altro formato, ad esempio FHIR o OMOP, devi prima essere in grado di analizzare e importare i messaggi HL7v2 in un archivio HL7v2. Utilizza questa guida per assicurarti di poter analizzare e importare correttamente i messaggi HL7v2.
Panoramica
A volte, i messaggi HL7v2 potrebbero non essere conformi agli standard HL7v2. Ad esempio, i messaggi HL7v2 potrebbero contenere segmenti non inclusi nello standard HL7v2 o i segmenti potrebbero essere fuori sequenza. Quando provi a eseguire l'importazione di messaggi non conformi, potresti riscontrare errori.
Per importare i messaggi HL7v2 non conformi, devi modificare l'oggetto ParserConfig
quando crei o modifichi un archivio HL7v2. In ParserConfig
, puoi configurare l'analisi schematizzata in base a tipi e segmenti personalizzati, determinare la modalità di gestione dei messaggi HL7v2 rifiutati e altro ancora.
Prima di configurare ParserConfig
, leggi le seguenti sezioni per comprendere i messaggi HL7v2, le definizioni di tipo e le definizioni di gruppo.
Messaggi HL7v2
Questa sezione fornisce una breve panoramica della struttura dei messaggi HL7v2, che sarà utile durante la configurazione dell'analizzatore dello schema personalizzato.
I messaggi HL7v2 sono basati su eventi e descrivono le transizioni di stato e gli aggiornamenti parziali dei record clinici. Ogni messaggio HL7v2 ha un tipo di messaggio che definisce lo scopo del messaggio. I tipi di messaggio utilizzano un codice di tre caratteri e sono specificati nell'intestazione del segmento principale obbligatoria (MSH) del messaggio. Esistono decine di tipi di messaggi, tra cui:
ADT
: utilizzato per trasmettere parti dei dati di amministrazione del pazienteORU
: utilizzato per trasmettere i risultati dell'osservazioneORM
: utilizzato per trasmettere informazioni su un ordine
Esamina la struttura dei messaggi HL7v2, che comprende segmenti, campi, componenti e sottocomponenti:
Nella figura 1 sono etichettate le seguenti parti del messaggio HL7v2: il segmento, l'intestazione del segmento, i campi e i componenti.
Per impostazione predefinita, i messaggi HL7v2 utilizzano i seguenti caratteri per separare le informazioni. Puoi ignorare i delimitatori, i separatori e i caratteri di terminazione di un messaggio HL7v2 su base messaggio nel segmento MSH
.
Carattere di terminazione del segmento:
\r
Se i messaggi HL7v2 utilizzano un separatore di segmenti diverso, consulta l'esempio Carattere di terminazione del segmento personalizzato e campo personalizzato.
Separatore di campo:
|
Separatore dei componenti:
^
Separatore dei sottocomponenti:
&
Separatore di ripetizione:
~
Caratteri di escape:
\
Definizioni di tipo e gruppo
Per comprendere l'interprete dello schema è necessario utilizzare le definizioni di tipo e le definizioni di gruppo.
Definizione del tipo
Il termine "tipi" comprende quanto segue:
Tipi di segmenti HL7v2, ad esempio
MSH
(Message Segment Header),DG1
(Diagnosis) ePID
(Patient Identification)Per un elenco di tutti i tipi di segmenti HL7v2, consulta Definizioni dei segmenti.
Tipi di dati HL7v2, ad esempio
ST
(dati di stringa),TS
(timestamp) eSI
(ID sequenza)Per un elenco di tutti i tipi di dati predefiniti HL7v2, consulta Tipi di dati.
Specifica i tipi nel campo name
all'interno dell'oggetto Type
.
I tipi utilizzano un formato modulare costituito da un segmento e dai relativi campi, componenti e subcomponenti. Le informazioni in un oggetto Type
indicano come analizzare o interpretare un segmento e rispondono a domande come le seguenti:
- Quali campi sono presenti nel segmento?
- Quali sono i tipi di dati dei campi?
L'esempio seguente mostra la definizione del tipo per un segmento ZCD
personalizzato:
{ "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 } ] } }
In questo esempio, il segmento ZCD
contiene due campi denominati 1
e 2
.
Il tipo di dati di 1
è ST
, un tipo di dati di stringa primitivi. Il tipo di dati di 2
è A
, un tipo di dati personalizzato.
La seguente definizione di tipo per il tipo di dati personalizzato A
mostra che contiene anche un altro tipo di dati personalizzato, denominato 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 } ] } }
Il seguente esempio mostra la definizione di tipo per il tipo di dati personalizzato B
, che ha un campo denominato 1
con tipo di dati ST
e un campo denominato 2
con tipo di dati ST
ripetuto:
{ "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 } ] } }
Conoscendo le informazioni sul segmento e sui tipi di dati, puoi stimare l'aspetto del segmento ZCD
nel messaggio HL7v2 originale. Questo esempio mostra il messaggio HL7v2 con il campo A
ripetuto una volta, il che è consentito perché maxOccurs
non è impostato sul 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
Nella figura 2, le seguenti parti della definizione del tipo sono etichettate: il segmento, l'intestazione del segmento, i campi, i componenti, i componenti secondari e le ripetizioni.
Definizione del gruppo
I gruppi vengono definiti a livello di segmento e forniscono informazioni sui tipi di segmenti che possono essere visualizzati in ogni messaggio HL7v2.
Specifica i gruppi nell'array groups
all'interno dell'oggetto GroupOrSegment
.
Prendi in considerazione il seguente snippet di una struttura di gruppo per un messaggio HL7v2 ADT_A01
:
- Il primo
segment
nell'arraymembers
èMSH
(Message Segment Header), perchéMSH
è obbligatorio in ogni messaggio HL7v2. Un
group
denominatoGroup 1
.Questo gruppo può verificarsi al massimo
2
volte e contiene il segmento personalizzatoZCD
.In genere, un
group
contiene più segmenti nidificati e altri gruppi raggruppati in modo logico, ma in questo esempioGroup 1
contiene un solo segmento:ZCD
.
{ "ADT_A01": { "members": [ { "segment": { "type": "MSH" } }, { "group": { "name": "Group 1", "minOccurs": 1, "maxOccurs": "2", "members": [ { "segment": { "type": "ZCD" } } ] } } ] } }
Conoscendo le informazioni sui gruppi, puoi stimare l'aspetto del messaggio HL7v2 originale se ZCD
si verifica due volte nel messaggio HL7v2, cosa consentita perché maxOccurs
in Group 1
è impostato su 2
.
Il resto del segmento ZCD
è sconosciuto se non si conosce anche la
definizione del tipo.
MSH|^~\&|||||20100308000000||ADT^A01|23701|1|2.3|| ZCD|ZCD_CONTENT ZCD|ZCD_CONTENT
Nella figura 3, le seguenti parti della definizione del gruppo sono etichettate: il segmento e l'intestazione del segmento.
Configura uno schema personalizzato in un archivio HL7v2
Le sezioni riportate di seguito spiegano i componenti di uno schema personalizzato e come configurarlo in un archivio HL7v2.
Configurazione del tipo di archivio HL7v2
Dopo aver compreso la definizione del tipo di un messaggio HL7v2, puoi specificare una configurazione del tipo in un archivio HL7v2. Per specificare la configurazione, aggiungi un array di types
e un array di version
.
L'esempio seguente mostra come specificare la configurazione per i tipi riportati in Definizione dei tipi in un archivio HL7v2.
Tieni presente che la configurazione utilizza l'array version
per
specificare i campi mshField
e value
. Questi
campi corrispondono ai campi e ai componenti nel segmento MSH.
L'array types
specificato si applica solo ai messaggi che hanno un segmento MSH corrispondente ai valori di mshField
e value
nell'array version
. In questo modo puoi importare messaggi HL7v2 con versioni diverse nello stesso archivio 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" } ] } ] } ] }
Configurazione del gruppo di datastore HL7v2
Puoi utilizzare i gruppi per configurare una struttura nidificata a livello di "appartenenza".
I gruppi vengono specificati in un array
members
a livello di segmento. La struttura di un segmento è prevedibile e in genere contiene campi, componenti e sottocomponenti, ma il segmento stesso può trovarsi a qualsiasi livello del messaggio HL7v2.
Come una configurazione di tipo, una configurazione di gruppo utilizza un filtro version
per consentirti di importare messaggi HL7v2 con versioni diverse nello stesso archivio HL7v2.
L'esempio seguente mostra come specificare la configurazione per il gruppo mostrato in Definizione gruppo in un archivio 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 configurazione dell'archivio HL7v2
Se combini la configurazione del tipo e la configurazione del gruppo, puoi determinare la configurazione completa dello schema personalizzato nel datastore HL7v2. Puoi anche determinare che lo schema personalizzato corrisponde a un messaggio HL7v2 simile al seguente:
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
Espandi la sezione seguente per visualizzare lo schema personalizzato completo nell'archivio HL7v2, quindi continua a creare un archivio HL7v2 che utilizzi lo schema personalizzato:
Espandi
{ "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 archivio HL7v2 con lo schema personalizzato
Per creare un archivio HL7v2 che utilizzi lo schema personalizzato completo, completa questa sezione.
Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:
- PROJECT_ID: l'ID del tuo progetto Google Cloud
- LOCATION: la posizione del set di dati
- DATASET_ID: il set di dati principale dell'archivio HL7v2
- HL7V2_STORE_ID: l'ID dell'archivio HL7v2
Corpo JSON della richiesta:
{ "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" } }
Per inviare la richiesta, scegli una delle seguenti opzioni:
curl
Salva il corpo della richiesta in un file denominato request.json
.
Esegui questo comando nel terminale per creare o sovrascrivere
questo file nella directory corrente:
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
Quindi, esegui il seguente comando per inviare la richiesta 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
Salva il corpo della richiesta in un file denominato request.json
.
Esegui questo comando nel terminale per creare o sovrascrivere
questo file nella directory corrente:
@' { "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
Quindi, esegui il seguente comando per inviare la richiesta 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
Dovresti ricevere una risposta JSON simile alla seguente:
Importa e analizza il messaggio HL7v2 utilizzando lo schema personalizzato
Per importare una versione codificata in base64 del messaggio HL7v2, completa questa sezione.
Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:
- PROJECT_ID: il tuo ID progetto Google Cloud
- LOCATION: la posizione del set di dati principale
- DATASET_ID: il set di dati principale dell'archivio HL7v2
- HL7V2_STORE_ID: l'ID dell'archivio HL7v2
Corpo JSON della richiesta:
{ "message": { "data": "TVNIfF5+XCZ8fHx8fDIwMTAwMTAxMDAwMDAwfHxBRFReQTAxXkEwMXwyMzcwMXwxfDIuM3x8DVpDRHxaQ0RfZmllbGRfMXxBX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMX5BX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMQ==" } }
Per inviare la richiesta, scegli una delle seguenti opzioni:
curl
Salva il corpo della richiesta in un file denominato request.json
.
Esegui questo comando nel terminale per creare o sovrascrivere
questo file nella directory corrente:
cat > request.json << 'EOF' { "message": { "data": "TVNIfF5+XCZ8fHx8fDIwMTAwMTAxMDAwMDAwfHxBRFReQTAxXkEwMXwyMzcwMXwxfDIuM3x8DVpDRHxaQ0RfZmllbGRfMXxBX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMX5BX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMQ==" } } EOF
Quindi, esegui il seguente comando per inviare la richiesta 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
Salva il corpo della richiesta in un file denominato request.json
.
Esegui questo comando nel terminale per creare o sovrascrivere
questo file nella directory corrente:
@' { "message": { "data": "TVNIfF5+XCZ8fHx8fDIwMTAwMTAxMDAwMDAwfHxBRFReQTAxXkEwMXwyMzcwMXwxfDIuM3x8DVpDRHxaQ0RfZmllbGRfMXxBX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMX5BX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMQ==" } } '@ | Out-File -FilePath request.json -Encoding utf8
Quindi, esegui il seguente comando per inviare la richiesta 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
Dovresti ricevere una risposta JSON simile alla seguente:
Determina la cardinalità del campo
Puoi determinare la cardinalità di un campo in un messaggio HL7v2 impostando i seguenti campi nell'archivio HL7v2:
minOccurs
: determina il numero minimo di volte in cui un gruppo, un segmento, un campo, un componente o un sottocomponente deve essere presente o ripetuto nei messaggi HL7v2 in entratamaxOccurs
: determina il numero massimo di volte in cui un gruppo, un segmento, un campo, un componente o un sottocomponente può essere presente o ripetuto nei messaggi HL7v2 in arrivo
Ignora gli elementi mancanti
Imposta ignoreMinOccurs
su true
se vuoi che l'API HL7v2 accetti tutti i messaggi HL7v2 in arrivo, indipendentemente dagli elementi mancanti. Ciò significa che un messaggio non verrà rifiutato se mancano gruppi, segmenti, campi, componenti o componenti secondari obbligatori.
Se non riesci a importare i messaggi HL7v2 perché mancano i campi obbligatori, ti consigliamo di impostare ignoreMinOccurs
su true
.
Tipo di campo jolly
Il carattere jolly *
è un tipo speciale utilizzato per i campi. L'utilizzo di *
indica al parser HL7v2 che il campo deve essere analizzato in base alla struttura del messaggio HL7v2. L'utilizzo di *
al posto di un valore per un campo è utile
quando non vuoi applicare un tipo di dati di campo rigoroso. A condizione che i contenuti nel campo rispettino lo standard HL7v2, l'API Cloud Healthcare può analizzare il messaggio HL7v2.
Ad esempio, considera la seguente definizione di tipo. Il campo 2
utilizza un carattere jolly anziché un tipo di dati di campo. La definizione è equivalente alla prima definizione in Definizione del tipo e non richiede di specificare i tipi A
e B
:
"type": { "name": "ZCD" "fields": [ { "name": "1", "type": "ST" }, { "name": "2", "type": "*" } ] }
Passaggi successivi
Scopri di più sulla configurazione degli analizzatori di schemi personalizzati con gli esempi di analizzatori di schemi personalizzati.