你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure API for FHIR 的 FHIR 搜索示例

重要

Azure API for FHIR 将于 2026 年 9 月 30 日停用。 按照迁移策略在该日期之前转换到 Azure Health Data Services FHIR® 服务。 由于 Azure API for FHIR 停用,在 2025 年 4 月 1 日开始前不会允许新的部署。 Azure Health Data Services FHIR 服务是 Azure API for FHIR 的演化版本,可让客户管理 FHIR、DICOM 和医疗技术服务,并集成到其他 Azure 服务。

下面是使用快速医疗保健互操作性资源(FHIR®)搜索操作的示例,包括搜索参数和修饰符、链和反向链搜索、复合搜索、查看搜索结果的下一个 POST 条目集以及使用请求进行搜索。 有关搜索的详细信息,请参阅 FHIR 搜索概述

搜索结果参数

_include

_include 跨资源搜索包含资源的指定参数的资源。 例如,可以跨 MedicationRequest 资源进行搜索,以仅查找包含特定患者的处方信息(即 reference 参数 patient)的资源。 下面的示例提取从中MedicationRequests引用的所有MedicationRequests患者和所有患者。

 GET [your-fhir-server]/MedicationRequest?_include=MedicationRequest:patient

注意

“include”和“revinclude”限制为 100 项

_revinclude

_revinclude 允许从与 _include 相反的方向进行搜索。 例如,可以搜索患者,然后反向包含引用该患者的所有出现情况:

GET [your-fhir-server]/Patient?_revinclude=Encounter:subject

_elements

_elements 将搜索结果缩小为字段子集,通过省略不必要的数据来减小响应大小。 该参数接受以逗号分隔的基元素列表。

GET [your-fhir-server]/Patient?_elements=identifier,active

在此请求中,你将获得一组患者,其中每个资源仅包括标识符和患者的活动状态。 此响应中的资源包含一个 meta.tagSUBSETTED ,指示它们是一组不完整的结果。

搜索修饰符

:not

:not 允许查找属性不为 true 的资源。 例如,可以搜索性别不是女性的患者。

GET [your-fhir-server]/Patient?gender:not=female

在返回值中你将获得性别不是女性的所有患者条目,包括空值(未指定性别的条目)。 这与搜索性别为男性的患者不同,因为这样不会包括没有特定性别的条目。

:missing

当值为 true 时,:missing 会返回没有指定元素值的所有资源,并且当值为 false 时,它会返回包含指定元素 的所有资源。 对于简单的数据类型元素, :missing=true 匹配元素包含扩展但具有空值的所有资源。 以下示例演示如何查找在出生日期上缺少信息的所有 Patient 资源。

GET [your-fhir-server]/Patient?birthdate:missing=true

:exact

:exact 用于 string 参数,并返回与参数精确匹配的结果,例如大小和字符串联。

GET [your-fhir-server]/Patient?name:exact=Jon

此请求返回名称与 Jon 完全相同的 Patient 资源。 如果资源中的患者名称为 JonathanjoN,则搜索将忽略并跳过该资源,因为它与指定的值不完全匹配。

:contains

:contains 用于 string 参数,并搜索与所搜索字段的字符串中指定值部分匹配的资源。 contains 不区分大小写,允许字符串联。 例如:

GET [your-fhir-server]/Patient?address:contains=Meadow

此请求将返回具有address包含字符串“Meadow”的值的所有Patient资源。 这意味着,可以将包含“Meadowers”或“59 Meadow ST”等值的地址作为搜索结果返回。

若要执行涵盖多个引用参数的一系列搜索操作,可以使用一个句点 . 将引用参数一个一个地追加到服务器请求中,从而“链接”一系列引用参数。 例如,如果要查看所有 DiagnosticReport 资源,其中这些资源具有对包含特定 namePatient 资源的 subject 引用:

 GET [your-fhir-server]/DiagnosticReport?subject:Patient.name=Sarah

此请求将返回患者主体名称为“Sarah”的所有 DiagnosticReport 资源。 字段 Patient 之后的句点 .subject 参数的引用参数执行链式搜索。

常规搜索(不是链式搜索)的另一种常见用法是查找特定患者的所有出现情况。 Patients 通常具有一个或多个 Encounter主题。 下面搜索所提供的id资源Patient的所有Encounter资源。

GET [your-fhir-server]/Encounter?subject=Patient/78a14cbe-8968-49fd-a231-d43e6619399f

使用链接搜索,可以找到与特定信息段匹配的所有Encounter资源,例如 birthdatePatient

GET [your-fhir-server]/Encounter?subject:Patient.birthdate=1987-02-20

这将允许跨具有指定出生日期值的所有患者搜索 Encounter 资源。

此外,可以使用符号 & 在一个请求中多次执行链式搜索,从而在一个请求中搜索多个条件。 在这种情况下,链式搜索会“独立”搜索每个参数,而不是搜索仅同时满足所有条件的条件:

GET [your-fhir-server]/Patient?general-practitioner:Practitioner.name=Sarah&general-practitioner:Practitioner.address-state=WA

这会返回所有以“Sarah”作为 generalPractitionerPatient 资源,并返回地址为 WA 州的 generalPractitioner。 换句话说,如果一名病人有来自纽约州的莎拉和州西澳大利亚州法案都引用为病人, generalPractitioner则两者都返回。

对于搜索必须是涵盖AND所有条件作为组的操作的情况,请参阅复合搜索中的示例。

通过链式搜索,可以根据资源引用的属性搜索资源。 使用反向链搜索,你可以以另一种方式执行此操作。 可以使用 _has 参数,根据引用资源的资源属性搜索资源。 例如, Observation 资源具有引用患者资源的搜索参数 patient 。 使用以下命令查找特定code引用Observation的所有患者资源。

GET [base]/Patient?_has:Observation:patient:code=527

此请求返回通过代码527引用Observation的病人资源。

此外,反向链式搜索可以具有递归结构。 例如,以下搜索具有 Observation 来自特定用户的 janedoe审核事件的所有患者。

GET [base]/Patient?_has:Observation:patient:_has:AuditEvent:entity:agent:Practitioner.name=janedoe

注意

在 Azure API for FHIR 和由 Azure Cosmos DB 支持的开源 FHIR 服务器中,链式搜索和反向链式搜索均属于 MVP 实现。 为在 Azure Cosmos DB 上完成链式搜索,该实现会逐步执行搜索表达式并发出子查询,从而解析匹配的资源。 此操作将针对表达式的各个级别执行。 如果查询返回超过 100 个结果,则将引发错误。

若要一次性搜索满足多个条件的资源,请使用组合搜索,该搜索将单个参数值序列与符号 $联接在一起。 结果是与联接搜索参数指定的所有条件匹配的资源的交集。 此类搜索参数称为复合搜索参数,它们定义了一个新参数,该参数将多个参数组合在一个嵌套结构中。 例如,以下搜索查找包含Observation钾值小于或等于 9.2 的所有DiagnosticReport资源。

GET [your-fhir-server]/DiagnosticReport?result.code-value-quantity=2823-3$lt9.2

此请求指定包含 2823-3 代码的组件,在本例中中,该代码为钾离子。 位于 $ 符号之后,它会指定组件的值范围,使用 lt 表示“小于或等于”,并指定 9.2 作为钾离子值范围。

搜索下一个条目集

每个单一搜索查询可返回的最大条目数为 1000。 如果超过 1,000 个与搜索查询匹配的条目,则可以使用以下过程查看大于 1000 的条目。
如以下Bundle结果所示,请使用延续标记urlsearchset

    "resourceType": "Bundle",
    "id": "98731cb7-3a39-46f3-8a72-afe945741bd9",
    "meta": {
        "lastUpdated": "2021-04-22T09:58:16.7823171+00:00"
    },
    "type": "searchset",
    "link": [
        {
            "relation": "next",
            "url": "[your-fhir-server]/Patient?_sort=_lastUpdated&ct=WzUxMDAxNzc1NzgzODc5MjAwODBd"
        },
        {
            "relation": "self",
            "url": "[your-fhir-server]/Patient?_sort=_lastUpdated"
        }
    ],

然后对字段 relation: next下提供的 URL 执行 GET 请求。

GET [your-fhir-server]/Patient?_sort=_lastUpdated&ct=WzUxMDAxNzc1NzgzODc5MjAwODBd

这会返回搜索结果的下一组条目。 searchset这是一组完整的搜索结果条目,延续标记url是服务器提供的链接,用于检索前 1000 个未显示在前 1000 个条目的条目。

使用 POST 进行搜索

前面提到的所有搜索示例都使用了 GET 请求。 还可以使用请求_search执行POST搜索操作。

POST [your-fhir-server]/Patient/_search?_id=45

此请求返回 Patient 值为 45 的资源 id 。 与 GET 请求一样,服务器确定哪一组资源满足条件,并在 HTTP 响应中返回捆绑资源。

使用 POST 进行搜索的另一个示例,其中查询参数作为表单正文提交,如下所示。

POST [your-fhir-server]/Patient/_search
content-type: application/x-www-form-urlencoded

name=John

后续步骤

本文介绍了如何使用不同的搜索参数、修饰符和 FHIR 搜索工具进行搜索。 有关 FHIR 搜索的详细信息,请参阅

注意

FHIR® 是 HL7 的注册商标,经 HL7 许可使用。