本頁面說明如何設定自訂結構定義,剖析不符合 HL7v2 標準的 HL7v2 訊息。
如果您要將 HL7v2 訊息轉換為其他格式 (例如 FHIR 或 OMOP),則必須先能夠剖析並擷取 HL7v2 訊息,再將其納入 HL7v2 儲存庫。請參閱本指南,確保您能順利剖析及攝入 HL7v2 訊息。
總覽
有時,HL7v2 訊息可能不符合 HL7v2 標準。舉例來說,HL7v2 訊息可能包含 HL7v2 標準中未包含的片段,或是片段順序不正確。嘗試擷取不符合規定的訊息時,可能會發生錯誤。
如要擷取不符規格的 HL7v2 訊息,您必須在建立或編輯 HL7v2 儲存庫時修改 ParserConfig
物件。在 ParserConfig
中,您可以根據自訂類型和片段設定結構化剖析,並決定如何處理遭拒的 HL7v2 訊息等。
設定 ParserConfig
前,請先閱讀下列章節,瞭解 HL7v2 訊息、類型定義和群組定義。
HL7v2 訊息
本節將簡要介紹 HL7v2 訊息的結構,這在設定自訂結構定義剖析器時會很有幫助。
HL7v2 訊息是以事件為基礎,可說明臨床記錄的狀態轉換和部分更新。每則 HL7v2 訊息都有一個訊息類型,用於定義訊息的用途。訊息類型會使用三個字元的代碼,並在訊息的必要主區段標頭 (MSH) 中指定。訊息類型有數十種,包括:
ADT
:用於傳輸部分病患管理資料ORU
:用於傳送觀察結果ORM
:用於傳送訂單相關資訊
查看 HL7v2 訊息的結構,其中包含區段、欄位、元件和子元件:
在圖 1 中,HL7v2 訊息的以下部分已標示:區段、區段標頭、欄位和元件。
根據預設,HL7v2 訊息會使用下列字元分隔資訊。您可以在 MSH
區段中,針對每則訊息覆寫 HL7v2 訊息的分隔符、分隔符和結束符。
區段結束字元:
\r
如果 HL7v2 訊息使用其他區段分隔符,請參閱「自訂區段結束符和自訂欄位」範例。
欄位分隔符:
|
元件分隔符:
^
子元件分隔符:
&
重複分隔符:
~
逸出字元:
\
類型和群組定義
如要瞭解結構定義剖析器,請使用類型定義和群組定義。
類型定義
「類型」一詞涵蓋以下內容:
HL7v2 區段類型,例如
MSH
(訊息區段標頭)、DG1
(診斷) 和PID
(病患身分)如需所有 HL7v2 區段類型的清單,請參閱「區段定義」。
HL7v2 資料類型,例如
ST
(字串資料)、TS
(時間戳記) 和SI
(序號 ID)如需所有 HL7v2 預設資料類型的清單,請參閱「資料類型」。
類型使用模組化格式,其中包含區隔和區隔的欄位、元件和子元件。Type
物件中的資訊會指出如何剖析或解讀片段,並回答下列問題:
- 區隔中包含哪些欄位?
- 欄位的資料類型為何?
以下範例顯示自訂 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 } ] } }
在這個範例中,ZCD
區段包含兩個欄位,分別命名為 1
和 2
。1
的資料類型是 ST
,這是原始字串資料類型。2
的資料類型是 A
,這是自訂資料類型。
以下是 A
自訂資料類型的類型定義,顯示該類型也包含另一個名為 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 } ] } }
以下範例顯示 B
自訂資料類型的類型定義,其中包含名為 1
的欄位,其資料類型為 ST
,以及名為 2
的欄位,其資料類型為重複的 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 } ] } }
瞭解區段和資料類型的相關資訊後,您就能預估原始 HL7v2 訊息中的 ZCD
區段長什麼樣子。以下範例顯示 HL7v2 訊息,其中 A
欄位重複一次,這是允許的做法,因為 maxOccurs
並未在 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
在圖 2 中,標示了類型定義的以下部分:區段、區段標頭、欄位、元件、子元件和重複。
群組定義
群組是在區段層級定義,可提供每個 HL7v2 訊息中可顯示的區段類型相關資訊。
您可以在 GroupOrSegment
物件內的 groups
陣列中指定群組。
請參考下列 ADT_A01
HL7v2 訊息的群組結構程式碼片段:
members
陣列中的第一個segment
是MSH
(訊息區段標頭),因為每則 HL7v2 訊息都需要MSH
。名為
Group 1
的group
。這個群組最多只能出現
2
次,且包含自訂ZCD
區段。通常,
group
會包含多個邏輯上已分組的巢狀區隔和其他群組,但在本例中,Group 1
只包含單一區隔:ZCD
。
{ "ADT_A01": { "members": [ { "segment": { "type": "MSH" } }, { "group": { "name": "Group 1", "minOccurs": 1, "maxOccurs": "2", "members": [ { "segment": { "type": "ZCD" } } ] } } ] } }
瞭解群組的相關資訊後,您就能預估如果 ZCD
在 HL7v2 訊息中出現兩次,原始 HL7v2 訊息會是什麼樣子。由於 Group 1
上的 maxOccurs
已設為 2
,因此允許 ZCD
在 HL7v2 訊息中出現兩次。ZCD
區段的其餘部分不明,除非您也知道類型定義。
MSH|^~\&|||||20100308000000||ADT^A01|23701|1|2.3|| ZCD|ZCD_CONTENT ZCD|ZCD_CONTENT
在圖 3 中,標示了群組定義的以下部分:區段和區段標頭。
在 HL7v2 儲存庫中設定自訂結構定義
以下各節將說明自訂結構定義的元件,以及如何在 HL7v2 儲存庫中設定結構定義。
HL7v2 儲存庫類型設定
瞭解 HL7v2 訊息的類型定義後,您就可以在 HL7v2 儲存庫中指定類型設定。如要指定設定,請新增 types
陣列和 version
陣列。
以下範例說明如何為 HL7v2 儲存庫中的「類型定義」中顯示的類型指定設定。
請注意,設定會使用 version
陣列指定 mshField
和 value
欄位。這些欄位與 MSH 區段中的欄位和元件對應。
您指定的 types
陣列僅適用於具有 MSH 區段的訊息,且該區段與 version
陣列中的 mshField
和 value
值相符。這可讓您將不同版本的 HL7v2 訊息擷取至同一個 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" } ] } ] } ] }
HL7v2 儲存庫群組設定
您可以使用群組,在「會員資格」層級設定巢狀結構。群組是在區隔層級的 members
陣列中指定。區段的結構可預測,通常包含欄位、元件和子元件,但區段本身可位於 HL7v2 訊息的任何層級。
與類型設定一樣,群組設定會使用 version
篩選器,讓您將不同版本的 HL7v2 訊息擷取至同一個 HL7v2 儲存庫。
以下範例說明如何為 HL7v2 儲存庫中的「Group definition」所顯示的群組指定設定:
{ "version": [ { "mshField": "12", "value": "2.3" } ], "messageSchemaConfigs": { "ADT_A01": { "members": [ { "segment": { "type": "MSH" } }, { "group": { "name": "Group 1", "maxOccurs": "2", "members": [ "segment": { "type": "ZCD" } ] } } ] } } }
完成 HL7v2 儲存庫設定
結合型別設定和群組設定後,您就能決定 HL7v2 儲存庫中的完整自訂結構定義設定會是什麼樣子。您也可以判斷自訂結構定義是否與 HL7v2 訊息相符,如下所示:
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
展開下列部分,查看 HL7v2 儲存庫的完整自訂結構定義,然後繼續建立使用自訂結構定義的 HL7v2 儲存庫:
展開
{ "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" } }
使用自訂結構定義建立 HL7v2 儲存庫
如要建立使用完整自訂結構定義的 HL7v2 儲存庫,請完成本節。
使用任何要求資料之前,請先替換以下項目:
- PROJECT_ID: Google Cloud 專案的 ID
- LOCATION:資料集位置
- DATASET_ID:HL7v2 存放區的父資料集
- HL7V2_STORE_ID:HL7v2 儲存庫 ID
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" } }
如要傳送要求,請選擇以下其中一個選項:
curl
將要求主體儲存在名為 request.json
的檔案中。在終端機中執行下列指令,在目前目錄中建立或覆寫此檔案:
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
接著,執行下列指令來傳送 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
將要求主體儲存在名為 request.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" } } '@ | Out-File -FilePath request.json -Encoding utf8
接著,執行下列指令來傳送 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
您應該會收到如下的 JSON 回應:
使用自訂結構定義擷取及剖析 HL7v2 訊息
如要擷取 base64 編碼版本的 HL7v2 訊息,請完成本節。
使用任何要求資料之前,請先替換以下項目:
- PROJECT_ID:您的 Google Cloud 專案 ID
- LOCATION:父資料集的位置
- DATASET_ID:HL7v2 存放區的父資料集
- HL7V2_STORE_ID:HL7v2 儲存庫 ID
JSON 要求主體:
{ "message": { "data": "TVNIfF5+XCZ8fHx8fDIwMTAwMTAxMDAwMDAwfHxBRFReQTAxXkEwMXwyMzcwMXwxfDIuM3x8DVpDRHxaQ0RfZmllbGRfMXxBX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMX5BX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMQ==" } }
如要傳送要求,請選擇以下其中一個選項:
curl
將要求主體儲存在名為 request.json
的檔案中。在終端機中執行下列指令,在目前目錄中建立或覆寫此檔案:
cat > request.json << 'EOF' { "message": { "data": "TVNIfF5+XCZ8fHx8fDIwMTAwMTAxMDAwMDAwfHxBRFReQTAxXkEwMXwyMzcwMXwxfDIuM3x8DVpDRHxaQ0RfZmllbGRfMXxBX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMX5BX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMQ==" } } EOF
接著,執行下列指令來傳送 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
將要求主體儲存在名為 request.json
的檔案中。在終端機中執行下列指令,在目前目錄中建立或覆寫此檔案:
@' { "message": { "data": "TVNIfF5+XCZ8fHx8fDIwMTAwMTAxMDAwMDAwfHxBRFReQTAxXkEwMXwyMzcwMXwxfDIuM3x8DVpDRHxaQ0RfZmllbGRfMXxBX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMX5BX2ZpZWxkXzJeQl9jb21wb25lbnRfMSZCX2NvbXBvbmVudF8yX3JlcGV0aXRpb25fMQ==" } } '@ | Out-File -FilePath request.json -Encoding utf8
接著,執行下列指令來傳送 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
您應該會收到如下的 JSON 回應:
判斷欄位基數
您可以透過在 HL7v2 儲存庫中設定下列欄位,判斷 HL7v2 訊息中欄位的基數:
minOccurs
:決定群組、區段、欄位、元件或子元件在傳入的 HL7v2 訊息中必須出現或重複的次數下限maxOccurs
:決定群組、區段、欄位、元件或子元件在傳入的 HL7v2 訊息中出現或重複的次數上限
忽略缺少的元素
如果您希望 HL7v2 API 無論是否缺少任何元素,都能接受所有傳入的 HL7v2 訊息,請將 ignoreMinOccurs
設為 true
。也就是說,如果訊息缺少必要的群組、區隔、欄位、元件或子元件,系統不會拒絕該訊息。
如果訊息缺少必要欄位,導致您無法擷取 HL7v2 訊息,建議您將 ignoreMinOccurs
設為 true
。
萬用字元欄位類型
萬用字元 *
是用於欄位的特殊類型。使用 *
可向 HL7v2 剖析器指出,應根據 HL7v2 訊息中的結構剖析欄位。如果您不想強制執行嚴格的欄位資料類型,可以使用 *
取代欄位值。只要欄位中的內容符合 HL7v2 標準,Cloud Healthcare API 就能剖析 HL7v2 訊息。
舉例來說,請考慮下列型別定義。欄位 2
使用萬用字元,而非欄位資料類型。這個定義等同於「類型定義」中的第一個定義,且不需要指定 A
和 B
類型:
"type": { "name": "ZCD" "fields": [ { "name": "1", "type": "ST" }, { "name": "2", "type": "*" } ] }
後續步驟
如要進一步瞭解如何設定自訂結構定義剖析器,請參閱「自訂結構定義剖析器範例」。