--- 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()` 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; ``` 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. ## 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 ; ```