WARNING: The 1.x versions of Elasticsearch have passed their EOL dates. If you are running a 1.x version, we strongly advise you to upgrade.
This documentation is no longer maintained and may be removed. For the latest information, see the current Elasticsearch documentation.
Combining Filters
editCombining Filters
editThe previous two examples showed a single filter in use. In practice, you will probably need to filter on multiple values or fields. For example, how would you express this SQL in Elasticsearch?
SELECT product FROM products WHERE (price = 20 OR productID = "XHDK-A-1293-#fJ3") AND (price != 30)
In these situations, you will need the bool filter. This is a compound
filter that accepts other filters as arguments, combining them in various
Boolean combinations.
Bool Filter
editThe bool filter is composed of three sections:
{
"bool" : {
"must" : [],
"should" : [],
"must_not" : [],
}
}
-
must -
All of these clauses must match. The equivalent of
AND. -
must_not -
All of these clauses must not match. The equivalent of
NOT. -
should -
At least one of these clauses must match. The equivalent of
OR.
And that’s it! When you need multiple filters, simply place them into the
different sections of the bool filter.
Each section of the bool filter is optional (for example, you can have a must
clause and nothing else), and each section can contain a single filter or an
array of filters.
To replicate the preceding SQL example, we will take the two term filters that
we used previously and place them inside the should clause of a bool
filter, and add another clause to deal with the NOT condition:
GET /my_store/products/_search
{
"query" : {
"filtered" : {
"filter" : {
"bool" : {
"should" : [
{ "term" : {"price" : 20}},
{ "term" : {"productID" : "XHDK-A-1293-#fJ3"}}
],
"must_not" : {
"term" : {"price" : 30}
}
}
}
}
}
}
|
Note that we still need to use a |
|
|
These two |
|
|
If a product has a price of |
Our search results return two hits, each document satisfying a different clause
in the bool filter:
Nesting Boolean Filters
editEven though bool is a compound filter and accepts children filters, it is
important to understand that bool is just a filter itself. This means you
can nest bool filters inside other bool filters, giving you the
ability to make arbitrarily complex Boolean logic.
Given this SQL statement:
SELECT document
FROM products
WHERE productID = "KDKE-B-9947-#kL5"
OR ( productID = "JODL-X-1937-#pV7"
AND price = 30 )
We can translate it into a pair of nested bool filters:
GET /my_store/products/_search
{
"query" : {
"filtered" : {
"filter" : {
"bool" : {
"should" : [
{ "term" : {"productID" : "KDKE-B-9947-#kL5"}},
{ "bool" : {
"must" : [
{ "term" : {"productID" : "JODL-X-1937-#pV7"}},
{ "term" : {"price" : 30}}
]
}}
]
}
}
}
}
}
|
Because the |
|
|
These two |
The results show us two documents, one matching each of the should clauses:
"hits" : [
{
"_id" : "2",
"_score" : 1.0,
"_source" : {
"price" : 20,
"productID" : "KDKE-B-9947-#kL5"
}
},
{
"_id" : "3",
"_score" : 1.0,
"_source" : {
"price" : 30,
"productID" : "JODL-X-1937-#pV7"
}
}
]
|
This |
|
|
These two fields match the |
This was a simple example, but it demonstrates how Boolean filters can be used as building blocks to construct complex logical conditions.