Skip to main content
This section covers sorting by a field. To sort by BM25 relevance score, see BM25 Scoring.
ParadeDB is highly optimized for quickly returning the Top K results out of the index. In SQL, this means queries that contain an ORDER BY...LIMIT:
In order for a Top K query to be executed by ParadeDB vs. vanilla Postgres, all of the following conditions must be met:
  1. All ORDER BY fields must be indexed. If they are text fields, they must use the literal tokenizer.
  2. At least one ParadeDB text search operator must be present at the same level as the ORDER BY...LIMIT.
  3. The query must have a LIMIT.
  4. With the exception of lower, ordering by expressions is not supported — only the raw fields themselves.
To verify that ParadeDB is executing the Top K, look for a Custom Scan with a TopKScanExecState in the EXPLAIN output:
If any of the above conditions are not met, the query cannot be fully optimized and you will not see a TopKScanExecState in the EXPLAIN output.

Tiebreaker Sorting

To guarantee stable sorting in the event of a tie, additional columns can be provided to ORDER BY. This is particularly important when sorting by pdb.score(...), as equal scores can result in non-deterministic orderings. As noted above, all tiebreaker columns must be indexed to receive the Top K optimization.
ParadeDB is currently able to handle 3 ORDER BY columns. If there are more than 3 columns, the ORDER BY will not be efficiently executed by ParadeDB.

Sorting by Text

If a text field is present in the ORDER BY clause, it must be indexed with the literal or literal normalized tokenizer. Sorting by lowercase text using lower(<text_field>) is also supported. To enable this, the expression lower(<text_field>) must be indexed with either the literal or literal normalized tokenizer. See indexing expressions for more information.
This allows sorting by lowercase to be optimized.

Sorting by JSON

Ordering by a JSON subfield directly is not yet supported. For example, this query will not receive an optimized Top K scan:
However, you can achieve an optimized Top K scan by projecting the JSON field, casting it to the desired type, and indexing it with pdb.alias. For example, to order by a numeric weight field within a JSON column:
You can then query and order by the exact underlying expression, which will now use the Top K optimization: