Search resource provides fine-grained control over search parameters
Search meta-resource can be used to define search parameters or override the existing one. Search resources take precedence over SearchParameters. This may be useful for performance optimization of built-in FHIR SearchParameters or for the implementation of complicated custom searches.
PUT /Search/Patient.namecontent-type:text/yamlaccept:text/yamlresourceType:Searchid:Patient.name# id of Search resourcename:name# name of the new search parameterresource:# link to the Patient resourceid:PatientresourceType:Entitywhere:"{{table}}.resource->>'name' ilike {{param}}"# sql for searchformat:"%?%"# parameter format for ilike order-by:"{{table}}.resource#>>'{name,0,family}'"# sql for ordering
Use {{table}} for table name and {{param}} for parameter in "where" and "order-by" expressions.
Provided format parameter will be passed to {{param}} (? will be replaced with the value of parameter). This feature may be useful writing ilike expressions.
Token search
You can define Search resources for different token syntax forms and :text modifier.
To refer to system and code in SQL query use {{param.system}} and {{param.code}} accordingly.
To refer to value of param with :text modifier use {{param.text}}
When using the :text modifier you also need to specify "text-format", refer to {{param.text}} with ?.
"text-format" is a format string which will be applied to{{param.text}} before inserting into SQL query. It is useful for wrapping text with % for like or ilike. For example text-format: '%?%'
PUT /Search/<resourceType>.<parameter>content-type:text/yamlaccept:text/yamlresourceType:Searchname:<parameter>resource: {id:<resourceType>,resourceType:Entity}param-parser:tokentoken:only-code:<SQL query for parameter={{param.code}}>no-system:<SQL query for parameter=|{{param.code}}>only-system:<SQL query for parameter={{param.system}}|>both:<SQL query for parameter={{param.system}}|{{param.code}}>text:<SQL query for parameter:text={{param.text}}>text-format:<format string {{param.text}}>
Reference search
Allows use different reference types in "where" expression. Reference can be defined in several ways:
{{param.resourceType}} for ResourceType and {{param.id}} for resource id
{{param.id}} for resource id
{{param.url}} for resource url
PUT /Search/<resourceType>.<parameter>content-type:text/yamlaccept:text/yamlresourceType:Searchname:<parameter>resource: {id:<resourceType>,resourceType:Entity}param-parser:reference
Multi: array parameter
If you set multi = 'array', parameters will be coerced as PostgreSQL array.
PUT /Patient/my-patient-1content-type:text/yamlaccept:text/yamlresourceType:Patientid:my-patient-1identifier: - value:id2
# create search resource PUT /Search/Patient.identifiercontent-type:text/yamlaccept:text/yamlresourceType:Searchid:Patient.identifierresource:resourceType:Entityid:Patientwhere:knife_extract_text({{table}}.resource, '[["identifier","value"]]') && {{param}}multi:array
# execute searches and retrieve two patients# check query-sql field in response bundleGET /Patient?identifier=id1,id2,id3content-type:text/yamlaccept:text/yaml
# execute search for new parameter# check query-sql field in response bundleGET /Patient?name=johncontent-type:text/yamlaccept:text/yamlGET /Patient?_sort=namecontent-type:text/yamlaccept:text/yaml
GET /ServiceRequest?identifier=foocontent-type:text/yamlaccept:text/yaml# will result in querying with knife_extract(...) && ARRAY['foo']
GET /ServiceRequest?identifier:text=foocontent-type:text/yamlaccept:text/yaml# will result in querying with array_to_string(knife_extract (...)) ilike '%foo%'
GET /ServiceRequest?identifier:not=foocontent-type:text/yamlaccept:text/yaml# will result fallback to default implementation NOT resource @> '{"identifier": [{"value": "foo"}]}'
Reference search by type/id
PUT /Search/Patient.generalPractitionercontent-type:text/yamlaccept:text/yamlresourceType:Searchid:Patient.generalPractitionername:generalPractitionerparam-parser:referencewhere:'{{table}}.resource->'generalPractitioner' @> jsonb_build_array(jsonb_build_object('id', {{param.id}}::text, 'resourceType', {{param.resourceType}}::text)) 'resource: {id:Patient,resourceType:Entity}
# search Patient by Practitioner referenceGET /Patient?generalPractitioner=Practitioner/pract-1content-type:text/yamlaccept:text/yaml
Reference search by id
PUT /Search/Patient.generalPractitionercontent-type:text/yamlaccept:text/yamlresourceType:Searchid:Patient.generalPractitionername:generalPractitionerparam-parser:referencewhere:'{{table}}.resource->'generalPractitioner' @> jsonb_build_array(jsonb_build_object('id', {{param.id}}::text)) 'resource: {id:Patient,resourceType:Entity}
# search Patient by Pratitoner referenceGET /Patient?generalPractitioner=pract-1content-type:text/yamlaccept:text/yaml
Reference search by url
PUT /Search/Patient.myProfilecontent-type:text/yamlaccept:text/yamlresourceType:Searchid:Patient.myProfilename:myProfileparam-parser:referencewhere:'{{table}}.resource#>'{meta,profile}' @> jsonb_build_array({{param.url}}::text) 'resource: {id:Patient,resourceType:Entity}
# search Patient by profileGET /Patient?myProfile=http://hl7.org/fhir/us/core/StructureDefinition/us-core-patientcontent-type:text/yamlaccept:text/yaml