All notable changes to this project will be documented in this file. The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.9.0 - 2026-06-18
- Added support for passing DB functions into search queries.
0.8.0 - 2026-05-21
- BREAKING:
Matchhas been split into two classes:MatchAnyandMatchAll. - BREAKING: Search modifiers are now composable functions applied to search
values or query expressions:
Boost(...),Const(...),Fuzzy(...),Slop(...), andTokenized(...). Query expressions no longer accept modifier kwargs likeboost=,const=,distance=,slop=, ortokenizer=.
0.7.0 - 2026-05-05
- Add equality comparison for Tokenizer types so that repeated
makemigrationscalls do not repeatedly create the same migration.
0.6.0 - 2026-03-23
- Added support for
icuandedge_ngramtokenizers.
- BREAKING: Removed the
Empty,ParseWithField, andRangequery expressions from the public search API. - BREAKING: Updated tokenizers to be configured with a function-based API instead of using strings. Before:
"simple('lowercase=false')After:Tokenizer.simple(options={"lowercase": False})
0.5.0 - 2026-03-23
IndexExpressionclass for indexing computed expressions inBM25Index. Supports Django expressions (e.g.,Lower('title'),F('rating') + 1) with optional tokenizer configuration. For non-text expressions, usespdb.alias.
- BREAKING: More like this queries now go through the main
ParadeDBpath like all other queries - BREAKING: Proximity queries have a new API that exposes the full SQL api:
Proximity("running").within(1, ProxRegex("sho.*"), ordered=True).within(2, "stores").boost(1.2)
0.4.0 - 2026-02-28
Matchquery expression requiring explicitoperator='AND'oroperator='OR'for text-match queries, replacing implicit bare-string matching. (#37)- 6 new query expression types:
Empty(match-nothing),Exists(field existence),FuzzyTerm(dedicated fuzzy term viapdb.fuzzy_term()),ParseWithField(field-scoped query parsing viapdb.parse_with_field()),Range(range queries viapdb.range()with typed PostgreSQL ranges), andTermSet(set membership viapdb.term_set()with typed arrays). (#44) - Diagnostics helpers:
paradedb_indexes(),paradedb_index_segments(),paradedb_verify_index(),paradedb_verify_all_indexes()wrapping ParadeDBpdb.*diagnostic table functions. (#39) - Django management commands:
paradedb_indexes,paradedb_index_segments,paradedb_verify_index,paradedb_verify_all_indexes(requires"paradedb"inINSTALLED_APPS). (#39) - Non-exact facets:
exactparameter onAggandfacets()— passexact=Falsefor approximate facet aggregations. (#39) - Partial index support:
BM25Indexnow accepts aconditionparameter (DjangoQobject) to create partial BM25 indexes with aWHEREclause. (#41) - Concurrent index creation:
BM25Index.create_sql()now correctly forwards theconcurrentlykwarg soAddIndexConcurrentlyworks. (#41) - Top-level package re-exports: all public API symbols are now importable directly from
paradedb(e.g.,from paradedb import ParadeDB, Match, Score, BM25Index). (#43) - Centralised API constants:
api.json,api.py, andapi.pyiproviding a single source of truth for all ParadeDB SQL operators, functions, and types. (#44) - Schema compatibility checking:
scripts/check_schema_compat.pyandapiignore.jsonfor bidirectional validation against ParadeDB's SQL schema. (#44) - Schema compatibility CI workflow triggered on each ParadeDB release with failure notifications via GitHub Issues and Slack. (#46)
- Inline fuzzy parameters (
distance,prefix,transposition_cost_one) onMatchandTermquery expressions. (#40) ProxRegexitems (pdb.prox_regex(...)) can now be mixed with plain strings insideProximityArray. (#48)
- BREAKING:
ParadeDB('shoes')(bare strings) no longer works for text matching — useParadeDB(Match('shoes', operator='AND'))instead. (#37) - BREAKING: Fuzzy search is no longer a standalone
Fuzzy(...)expression — useMatch('shoez', operator='OR', distance=1)orTerm('shoez', distance=1). (#37, #40) - BREAKING:
operatorkwarg removed fromParadeDB(...)— pass it viaMatch(...)instead. (#51) - JSON field aggregations now use native
json_fieldsindex configuration with dot notation (metadata.color) instead of column aliases. (#42) - Tokenizer quoting improved to support invocation syntax like
whitespace('lowercase=false')without over-quoting. (#40) - Tokenizer resolution now uses a validated lookup backed by
api.jsonconstants. (#44) - All hardcoded ParadeDB SQL strings replaced with constants from
paradedb.api. (#44) Matchnow validates invalid combinations (tokenizer + fuzzy, multi-term fuzzy + boost/const) eagerly at construction time. (#57)TermSetenforces homogeneous element types. (#50)MoreLikeThisvalidation tightened for key field, fields, stopwords, and numeric options. (#50, #58)- README quickstart rewritten to use
MockItemDjangomodel withmock_itemsdataset. (#36)
BM25Index.create_sql()now properly passesconcurrentlykwarg, fixing silent failures with Django'sAddIndexConcurrently. (#41)- Multi-term fuzzy queries generate correct SQL (
ARRAY[...]::pdb.fuzzy(N)instead of invalid per-element casts). (#42, #57) - Tokenizer + fuzzy ordering for single-term queries corrected. (#42)
api.jsonloaded from package data when installed (source-tree fallback for dev). (#49)boost/constvalidated as finite numbers; snippet numeric options validated as non-negative integers. (#49)
- BREAKING:
PQclass removed — use DjangoQobjects withMatchclauses. (#37, #40) - BREAKING:
Fuzzystandalone expression removed — use inline fuzzy params onMatchandTerm. (#37, #40) TERMremoved fromParadeOperatorliteral type (onlyANDandORremain). (#37)
0.3.0 - 2026-02-19
Proximityquery expression with unordered (##) and ordered (##>) formsMatch(...)query expression for explicitAND/ORliteral matchingtokenizer=override support onMatch(...)queriestokenizersupport onPhrase(...)- Scoring modifiers across query expressions via
boostandconst - Extended fuzzy options on
Match(...)/Term(...):distance,prefix,transposition_cost_one Parse(..., conjunction_mode=...)passthrough supportPhrasePrefix(...)support viapdb.phrase_prefix(...)RegexPhrase(...)support viapdb.regex_phrase(...)ProximityRegex(...)support viapdb.prox_regex(...)within proximity queriesProximityArray(...)support viapdb.prox_array(...)within proximity queriesRangeTerm(...)support viapdb.range_term(...)- ParadeDB operators over ad-hoc SQL expressions
- Added validation for incompatible argument combinations:
operatoron non-stringParadeDB(...)terms is rejected- mixed fuzzy operators in one query are rejected
- multiple
Proximity(...)terms in one query are rejected (useProximityArray(...))
- Removed wrapper-side scoring validation for
boost/const; scoring options are forwarded to ParadeDB/PostgreSQL. - Compatibility and packaging metadata were updated for broader support:
Django
4.2+, Python3.10+, and refreshed project metadata/dependencies.
0.2.0 - 2026-02-13
Snippetsannotation wrapper forpdb.snippets(...), including support for custom tags,max_num_chars,limit/offset, andsort_by(scoreorposition).SnippetPositionsannotation wrapper forpdb.snippet_positions(...)to return byte-offset ranges for matched terms.- Expanded
BM25Indextokenizer DSL with:tokenizers(multiple tokenizers per field), positionalargs,named_args, and alias-aware configuration.
BM25Indexnow enforces explicit tokenizer declarations when tokenizer config keys are provided (filters,stemmer,args,named_args,alias), and requires explicit tokenizers forjson_keys.- Deprecated tokenizer
optionskey was removed in favor ofnamed_args. - Hybrid RRF example was refactored to a single ORM query approach (no Python post-join).
- Project quality tooling moved from
pre-committoprek, with CI updates for linting/test matrix and Codecov reporting.
- Validation and error reporting for invalid tokenizer config shapes (mixed
single/multi-tokenizer configuration and malformed
tokenizerslists). - SQL generation coverage for tokenizer configuration and snippet functions.
0.1.1 - 2026-02-04
- Release automation was corrected to publish to PyPI from the release workflow path instead of relying on tag-push behavior.
0.1.0 - 2025-01-30
BM25Indexfor declarative BM25 index creation in Django modelsParadeDBlookup wrapper with&&&,|||,###operators- Boolean composition support via Django
Qobjects - Search expressions:
Phrase,FuzzyTerm,Parse,Term,Regex,All MoreLikeThisquery filter for similarity searchScoreannotation for BM25 relevance scoresSnippetannotation for highlighted text excerptsParadeDBQuerySetwith.facets()method for aggregationsParadeDBManagerfor easy model integration- JSON field key indexing support
- Full Django ORM integration with
Qobjects and standard filters