Documentation Index
Fetch the complete documentation index at: https://www.meilisearch.com/docs/llms.txt
Use this file to discover all available pages before exploring further.
When a relationship contains an array of related documents, foreign filters enable precise filtering with AND logic across items, unlike normal filters which use OR logic.
Array filter logic
Normal filters use OR logic across array items:
- Find films where
actors.country = "France" OR actors.age > 35
- Returns films with ANY actor who is French OR over 35 (possibly different actors)
Foreign filters use AND logic across array items:
- Find films where
_foreign(actors, country = "France" AND age > 35)
- Returns films with an actor who is BOTH French AND over 35 (same actor meets both conditions)
Why this matters
Precise filtering is essential when you need to find documents where a related item meets multiple conditions simultaneously. Without this capability, you’d need to denormalize data or post-process results in your application code.
Film cast example
Consider a film with three actors:
{
"id": "film_1",
"title": "Ocean's Eleven",
"actor_ids": ["actor_1", "actor_2", "actor_3"]
}
Where the actors are:
[
{"id": "actor_1", "name": "Actor A", "country": "USA", "age": 45},
{"id": "actor_2", "name": "Actor B", "country": "France", "age": 38},
{"id": "actor_3", "name": "Actor C", "country": "France", "age": 30}
]
Query 1: Normal filter (OR logic)
curl \
-X POST 'MEILISEARCH_URL/indexes/films/search' \
-H 'Content-Type: application/json' \
--data-binary '{
"filter": "actors.country = \"France\" OR actors.age > 35"
}'
Result: Film is included because:
- Actor B is French (country = “France”) ✓
- Actor A is over 35 (age > 35) ✓
Both conditions are met, but by different actors.
Query 2: Foreign filter (AND logic)
curl \
-X POST 'MEILISEARCH_URL/indexes/films/search' \
-H 'Content-Type: application/json' \
--data-binary '{
"filter": "_foreign(actors, country = \"France\" AND age > 35)"
}'
Result: Film is included because:
- Actor B is BOTH French AND over 35 ✓
A single actor meets both conditions.
Real-world examples
Find products with multiple required certifications
{
"id": "product_1",
"name": "Industrial Motor",
"certification_ids": ["cert_1", "cert_2", "cert_3"]
}
Find products that have both ISO 9001 and CE certifications issued after 2020:
curl \
-X POST 'MEILISEARCH_URL/indexes/products/search' \
-H 'Content-Type: application/json' \
--data-binary '{
"q": "motor",
"filter": "_foreign(certifications, (standard = \"ISO 9001\" OR standard = \"CE\") AND issued_year >= 2020)"
}'
Find articles with specific tag combinations
Find articles that have both the “security” AND “encryption” tags (same article, not different articles):
curl \
-X POST 'MEILISEARCH_URL/indexes/articles/search' \
-H 'Content-Type: application/json' \
--data-binary '{
"q": "cryptography",
"filter": "_foreign(tags, name = \"security\" AND name = \"encryption\")"
}'
Wait—this won’t work as expected because a single tag can’t have multiple names. For this use case, you’d want to check if an article has both tags, which would require a different approach (checking two separate arrays or normalizing differently).
Find employees with specific skill levels
Find employees with both Python AND JavaScript at advanced level:
curl \
-X POST 'MEILISEARCH_URL/indexes/employees/search' \
-H 'Content-Type: application/json' \
--data-binary '{
"q": "fullstack",
"filter": "_foreign(skills, (language = \"Python\" AND proficiency = \"advanced\") OR (language = \"JavaScript\" AND proficiency = \"advanced\"))"
}'
When to use precise filtering
Use foreign filters with AND logic when:
- A document has an array of related items
- You need to find items where a single related item meets multiple conditions
- You’re filtering on nested properties of array items
Use normal filters with OR logic when:
- You’re checking if any item in an array matches your criteria
- You need broader matching across multiple array items
Next steps
Foreign filters overview
Learn about foreign filters and filtering by joined data
Define relationships
Set up the relationships this filtering depends on