---
type: "doc"
source: "source/search_filter.html"
---
\[%settitle \_filter Parameter%\] \[%file newheader%\] \[%file newnavbar%\]
### \_filter Parameter
| Responsible Owner: [\[%wgt fhir%\]]([%wg fhir%]) Work Group | [Standards Status](versions#std-process):[Normative](versions#std-process) |
| --- | --- |
#### Introduction
`_filter` is a parameter that can be used with the [Search Operation](search). Filter requests have access to the same set of search parameters that are available to the search operation in that resource context on the server (e.g., [standard parameters](search#standard), [parameters for each resource](search#parameters), etc.). The `_filter` parameter provides a syntax for expressing a set of query expressions on the underlying resources.
Examples of filters:
- `Patient: name co "pet"` - all patients with the characters "pet" in a given or family name
- `Patient: given eq "peter" and birthdate ge 2014-10-10` - all patients with a given name of peter, born on or after 10-Oct 2014
- `Observation: code eq http://loinc.org|1234-5` - all observations with the LOINC code "1234-5"
- `Observation: patient.name co "pet"` - all observations on a patient with the characters "pet" in a given or family name
- `Observation: related[type eq "has-component"].target pr true` - all observations that have component observations (note: this uses one of the search parameters defined for this mechanism, see below)
- `Observation: related[type eq has-component].target re Observation/4` - all observations that have Observation/v as a component
- `Observation: patient.id eq 3425 and code-value-quantity eq code$loinc|12907-2,value$ge150|http://unitsofmeasure.org|mmol/L` - all observations for a particular patient that have a LOINC code of "12907-2" (Sodium \[Moles/volume\] in Red Blood Cells) AND a value greater than "150 mmol/L"
- `Patient: given eq "peter" and birthdate ge 2014-10-10 and _has:Observation:patient:code eq http://loinc.org|1234-5` - all patients with a given name of peter, born on or after 10-Oct 2014 that have an observation referring to them with a LOINC code of 1234-5
The \_filter syntax has the following features:
- A filter can be a logical one (x or x, or x and x, or not x).
- A filter can contain other filters in a set of parentheses: "()".
- A filter can be a test - path operation value, where operation is taken from the table below, and value is either a "true", "false", a JSON string, or a token (any sequence of non-whitespace characters, excluding ")" and "\]". Values are never case sensitive.
- A 'path' is a name, with chained searches done by name.name etc.as per existing source. There can also be a filter: name\[filter\].name.
- Reverse chaining is also allowed, using \_has:Resource:index1:index2 as the parameter
- The name is one of the defined search parameters that are used with the other search mechanism, with some special exemptions defined below.
Note: The only difference between a "string" value and a "token" value is that a string can contain spaces and ')' and '\]'. There is otherwise no significant difference between them.
Formal grammar for the syntax:
filter = paramExp / logExp / ("not") "(" filter ")"
logExp = filter ("and" / "or" filter)+
paramExp = paramValue SP compareOp SP compValue
compareOp = (see table below)
compValue = string / numberOrDate / token
string = json string
token = any sequence of non-whitespace characters (by Unicode rules) except "\]" and ")"
paramValue = hasSpecifier / paramPath
hasSpecifier = "\_has:" resource ":" index ":" index
resource = ALPHA (DIGIT / ALPHA)\*
index = nameCharStart (nameChar)\*
paramPath = paramName (("\[" filter "\]") "." paramValue)
paramName = nameCharStart (nameChar)\*
nameCharStart = "\_" / ALPHA
nameChar = "\_" / "-" / DIGIT / ALPHA
numberOrDate = DIGIT (DateChar)\*
dateChar = DIGIT / "T" / "-" / "." / "+" / ":" / "Z"
Notes about using the syntax:
- Logical expressions are evaluated left to right, with no precedence between "and" and "or". If there is ambiguity, use parentheses to be explicit.
- The compareOp is always evaluated against the set of values produced by evaluating the param path.
- The parameter names are those defined by the specification for search parameters, except for those defined below.
- The date format is a standard XML (i.e., XSD) dateTime (including timezone).
#### Operators
This table summarizes the comparison operations available:
| Operation | Definition |
| --- | --- |
| eq | an item in the set has an equal value |
| ne | An item in the set has an unequal value |
| co | An item in the set contains this value |
| sw | An item in the set starts with this value |
| ew | An item in the set ends with this value |
| gt / lt / ge / le | A value in the set is (greater than, less than, greater or equal, less or equal) the given value |
| ap | A value in the set is approximately the same as this value.
Note that the recommended value for the approximation is 10% of the stated value (or for a date, 10% of the gap between now and the date), but systems may choose other values where appropriate |
| sa | The value starts after the specified value |
| eb | The value ends before the specified value |
| pr | The set is empty or not (value is false or true) |
| po | True if a (implied) date period in the set overlaps with the implied period in the value |
| ss | True if the value subsumes a concept in the set |
| sb | True if the value is subsumed by a concept in the set |
| in | True if one of the concepts is in the nominated value set by URI, either a relative, literal or logical vs |
| ni | True if none of the concepts are in the nominated value set by URI, either a relative, literal or logical vs |
| re | True if one of the references in set points to the given URL |
For detailed rules about the operators eq, ne, le, ge, lt, gt, sa, and eb see [Search Prefixes](search#prefix).
The interpretation of the operation depends on the type of the search parameter it is being evaluated against. This table contains those details:
| Operation | String | Number | Date | Token | Reference | Quantity |
| --- | --- | --- | --- | --- | --- | --- |
| eq | Character sequence is the same (case insensitive) | Number is the same incl same precision | Date is the same including same precision and timezone if provided | Token is the same, including namespace if specified (case insensitive) | n/a | Unit and value are the same |
| ne | (same) |
| Co | Character sequence matches somewhere (case insensitive) | An item in the set's implicit imprecision includes the stated value | An item in the set's implicit period includes the stated value | n/a | n/a | n/a? |
| sw | Character sequence matches from first digit (left most, when L->R) (case insensitive) | n/a | n/a | n/a | n/a | n/a |
| ew | Character sequence matches up to last digit (right most, when L->R) (case insensitive) | n/a | n/a | n/a | n/a | n/a |
| gt / lt / ge / le | Based on Integer comparison of Unicode code points of starting character (trimmed) (case insensitive) | Based on numerical comparison | Based on date period comparison per 2.2.2.3 | n/a | n/a | Based on numerical comparison if units are the same (or are canonicalized) |
| pr | | | | | | |
| po | n/a | n/a | Based on date period comparison per 2.2.2.3 | | n/a | n/a |
| ss | n/a | n/a | n/a | Based on logical subsumption; potentially catering for mapping between tx | n/a | n/a |
| sb | n/a | n/a | n/a | Based on logical subsumption; potentially catering for mapping between tx | n/a | n/a |
| in | n/a | n/a | n/a | Based on logical subsumption; potentially catering for mapping between tx | n/a | n/a |
| re | n/a | n/a | n/a | n/a | Relative or absolute url | n/a |
Note:
- For token, the format is the same as the existing search parameter.
- For convenience, the codes "loinc", "snomed", "rxnorm" and "ucum" are predefined and can be used in place of their associated full namespace.
- The evaluation of composite search parameters is very complex; only the codes `eq` and `ne` are appropriate in this case
\[%file newfooter%\]