---
title: BM25 Scoring
---

## Basic Usage

BM25 scores measure how relevant a score is for a given query. Higher scores indicate higher relevance.
The `paradedb.score(<key_field>)` function can be added to any query where an `@@@` operator is present.

```sql
SELECT id, paradedb.score(id)
FROM mock_items
WHERE description @@@ 'shoes'
ORDER BY paradedb.score(id)
LIMIT 5;
```

<Note>
  Sorting by a field with a limit other than `paradedb.score()`, while returning `paradedb.score()` in the query's target
  list defeat the "top N" optimization.  The results will still be sorted by the specified field, but not as efficiently.
</Note>

## Joined Scores

The following query demonstrates how to compute a "combined BM25 score" over a joined search. It joins `mock_items` with `orders`,
which were both created in the [quickstart](/documentation/getting-started/quickstart).

```sql
SELECT o.order_id, paradedb.score(o.order_id) + paradedb.score(m.id) as score
FROM orders o
JOIN mock_items m ON o.product_id = m.id
WHERE o.customer_name @@@ 'Johnson' AND (m.description @@@ 'shoes' OR m.description @@@ 'running')
ORDER BY score DESC, o.order_id
LIMIT 5;
```

## Score Refresh

The scores generated by the BM25 index may be influenced by dead rows that have not been cleaned up by the `VACUUM` process.

Running `VACUUM` on the underlying table will remove all dead rows from the index and ensures that only rows visible to the current
transaction are factored into the BM25 score.

```sql
VACUUM <table_name>;
```
