---
title: Overview
---

In addition to basic [match](/v2/full-text/match), [phrase](/v2/full-text/phrase), and
[term](/v2/full-text/term) queries, additional advanced query types are exposed as query builder functions.

Users familiar with Elasticsearch may notice that these query types are similar to those found in Elastic’s query DSL.
This is intentional — ParadeDB uses the same terminology as Elasticsearch for its query types.

## Basic Usage

Query builder functions use the `@@@` operator. `@@@` takes a column on the left-hand side and a query builder function on the
right-hand side. It means "find all rows where the column matches the given query."

For example:

```sql
SELECT description, rating, category
FROM mock_items
WHERE description @@@ pdb.regex('key.*rd');
```

<Accordion title="Expected Output">
```csv
       description        | rating |  category
--------------------------+--------+-------------
 Ergonomic metal keyboard |      4 | Electronics
 Plastic Keyboard         |      4 | Electronics
(2 rows)
```
</Accordion>

This uses the [regex](/v2/query-builder/term/regex) query builder function to match all rows where `description` matches the regex expression `key.*rd`.

## When to Use Query Builder Functions

For most use cases, we recommend using the [full text search](/v2/full-text) operators instead of query builder
functions. However, there are two scenarios where query builder functions are useful. The first is if you need an **advanced query type**, like the regex query.

The second is if you want to **force query pushdown** into the ParadeDB [custom scan](/welcome/architecture#custom-scan). In order for a query to be executed by ParadeDB,
it must use at least one of the ParadeDB operators. However, there are some cases where queries that don't contain a ParadeDB
operator can be more efficiently executed by ParadeDB vs. standard Postgres. For example, when filtering on indexed columns using simple SQL conditions like ranges or null checks.

In these scenarios, query builder functions provide ParadeDB-compatible equivalents of common SQL constructs, such as:

- `pdb.range`  is the equivalent of SQL range operators, i.e. `<`, `>`, etc.
- `pdb.exists` is the equivalent of `IS NOT NULL`
- `pdb.term` is the equivalent of `=` for non-text fields and for text fields that use the keyword tokenizer

```sql
-- Executed by ParadeDB
SELECT COUNT(*) FROM mock_items
WHERE rating @@@ pdb.exists();

-- Executed by standard Postgres
SELECT COUNT(*) FROM mock_items
WHERE rating IS NOT NULL;
```
