---
title: Quickstart
---
This guide will walk you through a few queries to give you a feel for ParadeDB.
## Create Example Table
ParadeDB comes with a helpful procedure that creates a table populated with mock data to help
you get started. Once connected with `psql`, run the following commands to create and inspect
this table.
```sql
CALL paradedb.create_bm25_test_table(
  schema_name => 'public',
  table_name => 'mock_items'
);
SELECT description, rating, category
FROM mock_items
LIMIT 3;
```
```csv
       description        | rating |  category
--------------------------+--------+-------------
 Ergonomic metal keyboard |      4 | Electronics
 Plastic Keyboard         |      4 | Electronics
 Sleek running shoes      |      5 | Footwear
(3 rows)
```
Next, let's create a BM25 index called `search_idx` on this table. A BM25 index is a covering index, which means that multiple columns can be included in the same index.
```sql
CREATE INDEX search_idx ON mock_items
USING bm25 (id, description, category, rating, in_stock, created_at, metadata, weight_range)
WITH (key_field='id');
```
As a general rule of thumb, any columns that you want to filter, `COUNT`, `GROUP BY`, or `ORDER BY` as part of a full text query should be added to the index for faster
performance.
  Note the mandatory `key_field` option. Every BM25 index needs a `key_field`,
  which should be the name of a column that will function as a row's unique
  identifier within the index. Additionally, the `key_field` must be the first field
  in the list of columns. See [choosing a key field](/documentation/indexing/create_index#choosing-a-key-field) for more details.
## Match Query
We're now ready to execute a basic text search query. We'll look for matches where `description` matches `running shoes` where `rating` is greater than `2`.
```sql
SELECT description, rating, category
FROM mock_items
WHERE description ||| 'running shoes' AND rating > 2
ORDER BY rating
LIMIT 5;
```
``` csv
     description     | rating | category
---------------------+--------+----------
 White jogging shoes |      3 | Footwear
 Generic shoes       |      4 | Footwear
 Sleek running shoes |      5 | Footwear
(3 rows)
```
`|||` is ParadeDB's custom [match disjunction](/v2/full-text/match#disjunction) operator, which means "find me all documents containing
`running OR shoes`.
If we want all documents containing `running AND shoes`, we can use ParadeDB's `&&&` [match conjunction](/v2/full-text/match#conjunction) operator.
```sql
SELECT description, rating, category
FROM mock_items
WHERE description &&& 'running shoes' AND rating > 2
ORDER BY rating
LIMIT 5;
```
``` csv
     description     | rating | category
---------------------+--------+----------
 Sleek running shoes |      5 | Footwear
(1 row)
```
## BM25 Scoring
Next, let's add BM25 scoring to the results, which allows us to sort matches by relevance. To do this, we'll use `paradedb.score`.
```sql
SELECT description, paradedb.score(id)
FROM mock_items
WHERE description ||| 'running shoes' AND rating > 2
ORDER BY score DESC
LIMIT 5;
```
``` csv
     description     |   score
---------------------+-----------
 Sleek running shoes |  6.833782
 Generic shoes       |  3.901802
 White jogging shoes | 3.4987166
(3 rows)
```
## Highlighting
Finally, let's also [highlight](/v2/full-text/highlight) the relevant portions of the documents that were matched.
To do this, we'll use `paradedb.snippet`.
```sql
SELECT description, paradedb.snippet(description), paradedb.score(id)
FROM mock_items
WHERE description ||| 'running shoes' AND rating > 2
ORDER BY score DESC
LIMIT 5;
```
``` csv
     description     |              snippet              |   score
---------------------+-----------------------------------+-----------
 Sleek running shoes | Sleek running shoes |  6.833782
 Generic shoes       | Generic shoes              |  3.901802
 White jogging shoes | White jogging shoes        | 3.4987166
(3 rows)
```
That's it! Next, let's [load your data](/documentation/getting-started/load) to start running real queries.