# The bool Query and Term-Level Queries — Elasticsearch

Source: https://www.skillbyai.com/en/elasticsearch/q-bool

> Combine scoring with filtering.

## must, filter, should, must_not

A `bool` query combines clauses. `must` clauses must match and contribute to the score. `filter` clauses must match but run in **filter context**: no scoring, and frequently used filters can be cached, so put every yes/no condition (status, price range, tenant id, dates) there. `should` clauses add to the score when they match; if a bool has no `must` or `filter`, at least one `should` must match (adjust with `minimum_should_match`). `must_not` excludes documents, also without scoring. **Term-level** queries (`term`, `terms`, `range`, `exists`, `prefix`, `ids`) do not analyse their input, so use them on `keyword`, numeric, date and boolean fields.

## A search box plus filters

Kibana Dev Tools console syntax; send the same requests with curl or a client library.

```http
GET /products/_search
{
  "query": {
    "bool": {
      "must": [
        { "multi_match": { "query": "rain jacket", "fields": [ "name^3", "description" ] } }
      ],
      "filter": [
        { "term":  { "in_stock": true } },
        { "terms": { "brand": [ "Northpeak", "Fjellgear" ] } },
        { "range": { "price": { "gte": 50, "lte": 200 } } }
      ],
      "should": [
        { "term": { "tags": "bestseller" } }
      ],
      "must_not": [
        { "term": { "status": "discontinued" } }
      ]
    }
  }
}
```

## Filters do not change the ranking

Moving a condition from must to filter keeps the same matching documents but stops it influencing scores, which is what you want for exact constraints and is cheaper.

**Quiz:** Where should an exact condition like tenant_id = 42 go in a bool query?

- [ ] In a function_score weight
- [ ] In must, using a match query
- [ ] In should, so it can be skipped
- [x] In filter, using a term query

*Answer:* In filter, using a term query. Filter context is exact, unscored and cacheable.
