filter
search parameter expects a filter expression. Filter expressions are made of attributes, values, and several operators.
filter
expects a filter expression containing one or more conditions. A filter expression can be written as a string, array, or mix of both.
Data types
Filters accept numeric and string values. Empty fields or fields containing an empty array will be ignored. Filters do not work withNaN
and infinite values such as inf
and -inf
as they are not supported by JSON. It is possible to filter infinite and NaN
values if you parse them as strings, except when handling _geo
fields.
For best results, enforce homogeneous typing across fields, especially when dealing with large numbers. Meilisearch does not enforce a specific schema when indexing data, but the filtering engine may coerce the type of
value
. This can lead to undefined behavior, such as when big floating-point numbers are coerced into integers.Conditions
Conditions are a filter’s basic building blocks. They are written in theattribute OPERATOR value
format, where:
attribute
is the attribute of the field you want to filter onOPERATOR
can be=
,!=
,>
,>=
,<
,<=
,TO
,EXISTS
,IN
,NOT
,AND
, orOR
value
is the value theOPERATOR
should look for in theattribute
Examples
A basic condition requesting movies whosegenres
attribute is equal to horror
:
Filter operators
Equality (=
)
The equality operator (=
) returns all documents containing a specific value for a given attribute:
=
is case-insensitive.
The equality operator does not return any results for null
and empty arrays.
Inequality (!=
)
The inequality operator (!=
) returns all documents not selected by the equality operator. When operating on strings, !=
is case-insensitive.
The following expression returns all movies without the action
genre:
Comparison (>
, <
, >=
, <=
)
The comparison operators (>
, <
, >=
, <=
) select documents satisfying a comparison. Comparison operators apply to both numerical and string values.
The expression below returns all documents with a user rating above 85:
TO
TO
is equivalent to >= AND <=
. The following expression returns all documents with a rating of 80 or above but below 90:
EXISTS
The EXISTS
operator checks for the existence of a field. Fields with empty or null
values count as existing.
The following expression returns all documents containing the release_date
field:
Vector filters
When using AI-powered search, you may also useEXISTS
to filter documents containing vector data:
_vectors EXISTS
: matches all documents with an embedding_vectors.{embedder_name} EXISTS
: matches all documents with an embedding for the given embedder_vectors.{embedder_name}.userProvided EXISTS
: matches all documents with a user-provided embedding on the given embedder_vectors.{embedder_name}.documentTemplate EXISTS
: matches all documents with an embedding generated from a document template. Excludes user-provided embeddings_vectors.{embedder_name}.regenerate EXISTS
: matches all documents with an embedding scheduled for regeneration_vectors.{embedder_name}.fragments.{fragment_name} EXISTS
: matches all documents with an embedding generated from the given multimodal fragment. Excludes user-provided embeddings
_vectors
is only compatible with the EXISTS
operator.
IS EMPTY
The IS EMPTY
operator selects documents in which the specified attribute exists but contains empty values. The following expression only returns documents with an empty overview
field:
IS EMPTY
matches the following JSON values:
""
[]
{}
null
values as empty. To match null
fields, use the IS NULL
operator.
Use NOT
to build the negated form of IS EMPTY
:
IS NULL
The IS NULL
operator selects documents in which the specified attribute exists but contains a null
value. The following expression only returns documents with a null
overview
field:
NOT
to build the negated form of IS NULL
:
IN
IN
combines equality operators by taking an array of comma-separated values delimited by square brackets. It selects all documents whose chosen field contains at least one of the specified values.
The following expression returns all documents whose genres
includes either horror
, comedy
, or both:
CONTAINS
experimental
CONTAINS
filters results containing partial matches to the specified string pattern, similar to a SQL LIKE
.
The following expression returns all dairy products whose names contain "kef"
:
This is an experimental feature. Use the experimental features endpoint to activate it:
STARTS WITH
STARTS WITH
filters results whose values start with the specified string pattern.
The following expression returns all dairy products whose name start with "kef"
:
NOT
The negation operator (NOT
) selects all documents that do not satisfy a condition. It has higher precedence than AND
and OR
.
The following expression will return all documents whose genres
does not contain horror
and documents with a missing genres
field:
Filter expressions
You can build filter expressions by grouping basic conditions usingAND
and OR
. Filter expressions can be written as strings, arrays, or a mix of both.
Filter expression grouping operators
AND
AND
connects two conditions and only returns documents that satisfy both of them. AND
has higher precedence than OR
.
The following expression returns all documents matching both conditions:
OR
OR
connects two conditions and returns results that satisfy at least one of them.
The following expression returns documents matching either condition:
Creating filter expressions with string operators and parentheses
Meilisearch reads string expressions from left to right. You can use parentheses to ensure expressions are correctly parsed. For instance, if you want your results to only includecomedy
and horror
documents released after March 1995, the parentheses in the following query are mandatory:
release_date
.
When creating an expression with a field name or value identical to a filter operator such as
AND
or NOT
, you must wrap it in quotation marks: title = "NOT" OR title = "AND"
.Creating filter expressions with arrays
Array expressions establish logical connectives by nesting arrays of strings. Array filters can have a maximum depth of two. Expressions with three or more levels of nesting will throw an error. Outer array elements are connected by anAND
operator. The following expression returns horror
movies directed by Jordan Peele
:
OR
operator. The following expression returns either horror
or comedy
films:
horror
and comedy
movies directed by Jordan Peele
:
Combining arrays and string operators
You can also create filter expressions that use both array and string syntax. The following filter is written as a string and only returns movies not directed byJordan Peele
that belong to the comedy
or horror
genres: