# Overview

Boolean operators combine multiple conditions to build complex queries.
They control how individual field conditions are logically combined to determine which documents match.

### Available Operators

| Operator | Description |
|----------|-------------|
| [`$must`](./must) | All conditions must match |
| [`$should`](./should) | At least one condition should match, or acts as a score booster when combined with `$must` |
| [`$mustNot`](./must-not) | Excludes documents matching any condition |
| [`$boost`](./boost) | Adjusts the score contribution of a boolean clause |

### How Boolean Operators Work Together

Boolean operators can be combined in a single query to express complex logic.
The operators work together as follows:

1. **`$must`** defines the required conditions. Documents must match ALL of these.
2. **`$should`** adds optional conditions:
   - When used alone: documents must match at least one condition
   - When combined with `$must`: conditions become optional score boosters
3. **`$mustNot`** filters out unwanted documents from the result set.

### Combining Operators

Here's an example that uses all three operators together:

<Tabs>

<Tab title="TypeScript">
```ts
// Find in-stock electronics, preferring wireless products, excluding budget items
await products.query({
  filter: {
    $must: {
      category: "electronics",
      inStock: true,
    },
    $should: [
      { name: "wireless" },
      { description: "bluetooth" },
    ],
    $mustNot: {
      description: "budget",
    },
  },
});
```
</Tab>

<Tab title="Python">
```python
# Find in-stock electronics, preferring wireless products, excluding budget items
products.query(filter={
    "$must": {"category": "electronics", "inStock": True},
    "$should": [{"name": "wireless"}, {"description": "bluetooth"}],
    "$mustNot": {"description": "budget"},
})
```
</Tab>

<Tab title="Redis CLI">
```bash
# Find in-stock electronics, preferring wireless products, excluding budget items
SEARCH.QUERY products '{"$must": {"category": "electronics", "inStock": true}, "$should": [{"name": "wireless"}, {"description": "bluetooth"}], "$mustNot": {"description": "budget"}}'
```
</Tab>

</Tabs>

This query:
1. **Requires** documents to be in the "electronics" category AND in stock
2. **Boosts** documents that mention "wireless" or "bluetooth" (but doesn't require them)
3. **Excludes** any documents containing "budget" in the description

### Nesting Boolean Operators

Boolean operators can be nested to create more complex logic:

<Tabs>

<Tab title="TypeScript">
```ts
// Find products that are either (premium electronics) OR (discounted sports items)
await products.query({
  filter: {
    $should: [
      {
        $must: {
          category: "electronics",
          description: "premium",
        },
      },
      {
        $must: {
          category: "sports",
          price: { $lt: 50 },
        },
      },
    ],
  },
});
```
</Tab>

<Tab title="Python">
```python
# Find products that are either (premium electronics) OR (discounted sports items)
products.query(filter={
    "$should": [
        {"$must": {"category": "electronics", "description": "premium"}},
        {"$must": {"category": "sports", "price": {"$lt": 50}}},
    ],
})
```
</Tab>

<Tab title="Redis CLI">
```bash
# Find products that are either (premium electronics) OR (discounted sports items)
SEARCH.QUERY products '{"$should": [{"$must": {"category": "electronics", "description": "premium"}}, {"$must": {"category": "sports", "price": {"$lt": 50}}}]}'
```
</Tab>

</Tabs>
