# Changelog ## [0.3.2](https://github.com/dstockton/qdrant-es-gateway/compare/v0.3.1...v0.3.2) (2026-10-20) ### Bug Fixes * reject unsupported search script fields ([#84](https://github.com/dstockton/qdrant-es-gateway/issues/84)) ([f025cf4](https://github.com/dstockton/qdrant-es-gateway/commit/f025cf48b5e3d747b082fb83e42be67daa2e4eaf)) ## [0.3.1](https://github.com/dstockton/qdrant-es-gateway/compare/v0.3.0...v0.3.1) (2026-10-20) ### Bug Fixes * reject unsupported doc value fields ([#82](https://github.com/dstockton/qdrant-es-gateway/issues/82)) ([3485d0d](https://github.com/dstockton/qdrant-es-gateway/commit/3485d0d8b1b52717673d3b40693e5382127ceccf)) ## [0.3.0](https://github.com/dstockton/qdrant-es-gateway/compare/v0.2.0...v0.3.0) (2026-10-19) ### Features * honor track total hits modes ([#52](https://github.com/dstockton/qdrant-es-gateway/issues/52)) ([562eb19](https://github.com/dstockton/qdrant-es-gateway/commit/562eb19cd440c702fe6ed8e3d391f51d1d26c09f)) * shared catalog, explicit sparse vectors and complete search reductions ([#64](https://github.com/dstockton/qdrant-es-gateway/issues/64)) ([ef9d2c6](https://github.com/dstockton/qdrant-es-gateway/commit/ef9d2c6c366f47515fcde61e7a6e9fa713c8a10e)) * verify retail and media application compatibility ([#50](https://github.com/dstockton/qdrant-es-gateway/issues/50)) ([9aef907](https://github.com/dstockton/qdrant-es-gateway/commit/9aef9076aaf3187a68b81c8b740ae9300ea81344)) ### Bug Fixes * apply pattern queries to count requests ([2b99044](https://github.com/dstockton/qdrant-es-gateway/commit/2b99044bd178eea632236dcbdb6eb5195af22d43)) * classify duplicate index creation ([#58](https://github.com/dstockton/qdrant-es-gateway/issues/58)) ([509e0f4](https://github.com/dstockton/qdrant-es-gateway/commit/509e0f44cc5221540bcef67b2dfb82cf5c913762)) * honor named collapse inner hits ([#47](https://github.com/dstockton/qdrant-es-gateway/issues/47)) ([3b5a17d](https://github.com/dstockton/qdrant-es-gateway/commit/3b5a17d2bb754bb7ec60e913fb2f56da129b6af1)) * honor OpenSearch integer hit totals ([#55](https://github.com/dstockton/qdrant-es-gateway/issues/55)) ([2c7b0b6](https://github.com/dstockton/qdrant-es-gateway/commit/2c7b0b6ad1307787abed2069e90ec17b7facb1ce)) * honor optional bool should clauses ([e7cd8c1](https://github.com/dstockton/qdrant-es-gateway/commit/e7cd8c1cc5fcee696ff27863fe71b694ba8da69b)) * keep post filters out of aggregations ([#44](https://github.com/dstockton/qdrant-es-gateway/issues/44)) ([4f1f6ef](https://github.com/dstockton/qdrant-es-gateway/commit/4f1f6ef6ec9e4bfd9513e7312e50e3d9dddb9884)) * match array-valued source fields ([493bc46](https://github.com/dstockton/qdrant-es-gateway/commit/493bc46d538994cf984c74a6307118a5c9a46854)) * parse Elasticsearch sort shapes ([cc1da5f](https://github.com/dstockton/qdrant-es-gateway/commit/cc1da5f0263905cf9def450ce49b1a2d25279e7d)) * preserve HEAD upstream failures ([#57](https://github.com/dstockton/qdrant-es-gateway/issues/57)) ([9d81c1d](https://github.com/dstockton/qdrant-es-gateway/commit/9d81c1d3e770e7b8d94f70a8a1b69c457d98eda1)) * preserve leading wildcard operators ([#49](https://github.com/dstockton/qdrant-es-gateway/issues/49)) ([a640fd1](https://github.com/dstockton/qdrant-es-gateway/commit/a640fd1cb5fd2cb6b0155741e798d7a6438a9281)) * preserve nested bool negation semantics ([c1e5432](https://github.com/dstockton/qdrant-es-gateway/commit/c1e5432a0f1d1c4c7bcec0f715e53dbc0dd10c69)) * preserve nested source filtering ([#53](https://github.com/dstockton/qdrant-es-gateway/issues/53)) ([cfe5ba2](https://github.com/dstockton/qdrant-es-gateway/commit/cfe5ba2dcabf666d6d0887eeca164438cc3e612d)) * reject empty alias action batches ([#72](https://github.com/dstockton/qdrant-es-gateway/issues/72)) ([79a7046](https://github.com/dstockton/qdrant-es-gateway/commit/79a7046aeda6bea182f65a0232382acca5a83aef)) * reject ignored search controls ([#74](https://github.com/dstockton/qdrant-es-gateway/issues/74)) ([aafd4e4](https://github.com/dstockton/qdrant-es-gateway/commit/aafd4e42ad4679163ee32cfb09757dfe0f9a5274)) * reject silent alias retargeting ([#60](https://github.com/dstockton/qdrant-es-gateway/issues/60)) ([ba94566](https://github.com/dstockton/qdrant-es-gateway/commit/ba945667de8ed8d561aa895cce5f1aea07838450)) * reject unsupported alias options ([#62](https://github.com/dstockton/qdrant-es-gateway/issues/62)) ([4f56581](https://github.com/dstockton/qdrant-es-gateway/commit/4f5658168dd58f5fb3450524b15c554141e8eeaa)) * reject unsupported hit concurrency metadata ([#80](https://github.com/dstockton/qdrant-es-gateway/issues/80)) ([85b0e22](https://github.com/dstockton/qdrant-es-gateway/commit/85b0e22365e502a55f54b41c9cc8be1bbabcd4bc)) * reject unsupported post filters ([#42](https://github.com/dstockton/qdrant-es-gateway/issues/42)) ([7e56704](https://github.com/dstockton/qdrant-es-gateway/commit/7e5670497fbe3141f1db749752ffd94328e1184a)) * reject unsupported search explanations ([#77](https://github.com/dstockton/qdrant-es-gateway/issues/77)) ([d6f8d6c](https://github.com/dstockton/qdrant-es-gateway/commit/d6f8d6c2bb87d89d72dd33c33c9ea00195860b4b)) * reject unsupported search highlighting ([#75](https://github.com/dstockton/qdrant-es-gateway/issues/75)) ([e1c1d73](https://github.com/dstockton/qdrant-es-gateway/commit/e1c1d73936631ae13cce662ddccadd4025e65168)) * reject unsupported search profiling ([#78](https://github.com/dstockton/qdrant-es-gateway/issues/78)) ([18f0e5c](https://github.com/dstockton/qdrant-es-gateway/commit/18f0e5c8b4ac8adf056cf0bc05e0f76204e74c18)) * report exact filter search totals ([#40](https://github.com/dstockton/qdrant-es-gateway/issues/40)) ([4934279](https://github.com/dstockton/qdrant-es-gateway/commit/493427991cdd4a24b7e5f3650225d91e6e3e1a5c)) * report missing alias removals ([#70](https://github.com/dstockton/qdrant-es-gateway/issues/70)) ([0d485a5](https://github.com/dstockton/qdrant-es-gateway/commit/0d485a5d678671c0205bfee7fc65551faca313d3)) * route keyword multifield filters consistently ([#39](https://github.com/dstockton/qdrant-es-gateway/issues/39)) ([e2d046c](https://github.com/dstockton/qdrant-es-gateway/commit/e2d046cf193aa44a4d353689e600eb0ec1d06c97)) * validate index names before provisioning ([#61](https://github.com/dstockton/qdrant-es-gateway/issues/61)) ([70d4abe](https://github.com/dstockton/qdrant-es-gateway/commit/70d4abeb1335157fa0f6cd85574b0b06f6500e5b)) * validate search pagination before querying ([#45](https://github.com/dstockton/qdrant-es-gateway/issues/45)) ([4841af5](https://github.com/dstockton/qdrant-es-gateway/commit/4841af51641f82617d791fa4b80972eb6ac99434)) * widen sorted search candidate window ([#51](https://github.com/dstockton/qdrant-es-gateway/issues/51)) ([0225386](https://github.com/dstockton/qdrant-es-gateway/commit/02253861cb9b6dd07752623c74037d7b346e4a2e)) ### Performance Improvements * add fenced shared caching and optimize catalogue reads ([#66](https://github.com/dstockton/qdrant-es-gateway/issues/66)) ([adc1931](https://github.com/dstockton/qdrant-es-gateway/commit/adc19315c6a4a67bc3665dbdfed56d39be7deff1)) ## [0.2.0](https://github.com/dstockton/qdrant-es-gateway/compare/v0.1.3...v0.2.0) (2026-10-03) ### Features * support explicit update upserts ([#17](https://github.com/dstockton/qdrant-es-gateway/issues/17)) ([116c8ed](https://github.com/dstockton/qdrant-es-gateway/commit/116c8ede79692b592dacb1d02b2575aa42d8304a)) * support standalone create API ([bd7bb07](https://github.com/dstockton/qdrant-es-gateway/commit/bd7bb07b5439111b4687c4764f3148ff11c52145)) * support standalone create API ([b3eb361](https://github.com/dstockton/qdrant-es-gateway/commit/b3eb361b655fa08528b6149b951a4a0280bfabf4)) ### Bug Fixes * apply alias actions atomically ([092d011](https://github.com/dstockton/qdrant-es-gateway/commit/092d011e9417fb8c42887c4ee55fd8a908bed44b)) * correct exists query semantics ([e291d03](https://github.com/dstockton/qdrant-es-gateway/commit/e291d03996f1085a3348c6595d4d1c32c08f8f34)) * grant release workflow publish permissions ([34aeb70](https://github.com/dstockton/qdrant-es-gateway/commit/34aeb70cfb5d9b6e76a5c31908989c4190bad6fe)) * keep release tags unprefixed ([#8](https://github.com/dstockton/qdrant-es-gateway/issues/8)) ([65bb846](https://github.com/dstockton/qdrant-es-gateway/commit/65bb8464bb2e554e66d381dba0c92e5fbdb62ab0)) * make release workflow dependency explicit ([ce13c14](https://github.com/dstockton/qdrant-es-gateway/commit/ce13c149215f0f908d4e11e034715bbe510b8d1a)) * merge Dependabot updates without branch protection ([da05dc6](https://github.com/dstockton/qdrant-es-gateway/commit/da05dc6a16afe9387c2823857f792a2c51a4ccaf)) * pin Release Please to a commit ([0837fb9](https://github.com/dstockton/qdrant-es-gateway/commit/0837fb97db0099246b6a0ad396d8d16af508ce6a)) * preserve bulk operation results ([#16](https://github.com/dstockton/qdrant-es-gateway/issues/16)) ([e0ed4fc](https://github.com/dstockton/qdrant-es-gateway/commit/e0ed4fc7bb11981a03c4410eb294cc02c4fda8c2)) * preserve mappings during updates ([24227bb](https://github.com/dstockton/qdrant-es-gateway/commit/24227bb2da7bfab07b05638b17acb6bb0dd5b3b7)) * preserve mappings during updates ([2bb49f2](https://github.com/dstockton/qdrant-es-gateway/commit/2bb49f2f5bf7ee3c24fe5917a3f2a29bdac7e74a)) * preserve source during partial updates ([#15](https://github.com/dstockton/qdrant-es-gateway/issues/15)) ([1af5aaf](https://github.com/dstockton/qdrant-es-gateway/commit/1af5aaf7c62f4d9d08276e2eac2b0f8877383e37)) * recursively merge partial updates ([#18](https://github.com/dstockton/qdrant-es-gateway/issues/18)) ([07d1c6e](https://github.com/dstockton/qdrant-es-gateway/commit/07d1c6e758df7ef65ff198171039e328f32bca29)) * reject duplicate bulk creates ([#11](https://github.com/dstockton/qdrant-es-gateway/issues/11)) ([16143a8](https://github.com/dstockton/qdrant-es-gateway/commit/16143a893dbd0295121612819559a4e047b78483)) * reject invalid UTF-8 request bodies ([03f76eb](https://github.com/dstockton/qdrant-es-gateway/commit/03f76eb3e6a0febf8840590d5b699e72087dad88)) * report accurate bulk index results ([6516a9b](https://github.com/dstockton/qdrant-es-gateway/commit/6516a9b9ff93924004fccd7fbdff7a930c6ec55e)) * report accurate standalone index results ([26357e5](https://github.com/dstockton/qdrant-es-gateway/commit/26357e5291c5369593fd41bf53852b4dfb3e2677)) * report accurate standalone index results ([e0bcd8d](https://github.com/dstockton/qdrant-es-gateway/commit/e0bcd8d24f027ec15a4670cee50d18a9e35bc0c5)) * require ids for bulk mutations ([4925928](https://github.com/dstockton/qdrant-es-gateway/commit/4925928c84f15fd610d18ba0ccc0444f65bd88d9)) * skip unchanged update writes ([b9e07fb](https://github.com/dstockton/qdrant-es-gateway/commit/b9e07fb737a351548c5f8be7d0504822ec40a586)) * support zero-size searches ([b93503a](https://github.com/dstockton/qdrant-es-gateway/commit/b93503ac685653632ed9c3250ae24ac32aff28bc)) * validate bulk action metadata ([df303e4](https://github.com/dstockton/qdrant-es-gateway/commit/df303e4a8ae58ceabe6e53cb7129846dac0d507e)) * validate bulk action metadata ([d3d51e5](https://github.com/dstockton/qdrant-es-gateway/commit/d3d51e5497ae3c76416d9fa9d381a4d01ea22569)) ## [0.1.3](https://github.com/dstockton/qdrant-es-gateway/compare/qdrant-es-gateway-v0.1.2...qdrant-es-gateway-v0.1.3) (2026-09-25) ### Bug Fixes * grant release workflow publish permissions ([34aeb70](https://github.com/dstockton/qdrant-es-gateway/commit/34aeb70cfb5d9b6e76a5c31908989c4190bad6fe)) * make release workflow dependency explicit ([ce13c14](https://github.com/dstockton/qdrant-es-gateway/commit/ce13c149215f0f908d4e11e034715bbe510b8d1a)) * merge Dependabot updates without branch protection ([da05dc6](https://github.com/dstockton/qdrant-es-gateway/commit/da05dc6a16afe9387c2823857f792a2c51a4ccaf)) * pin Release Please to a commit ([0837fb9](https://github.com/dstockton/qdrant-es-gateway/commit/0837fb97db0099246b6a0ad396d8d16af508ce6a)) ## 0.1.2 - 2026-09-24 - Added configurable upstream timeouts. - Bounded asynchronous payload writes. - Added SQLite busy handling and dependency advisory checks. ## Unreleased - Reject search `version: true` and `seq_no_primary_term: true` before index lookup or Qdrant work instead of returning hits without the requested concurrency metadata; explicit `false` remains accepted. - Reject `profile: true` before index lookup or Qdrant work instead of returning search results without the requested query and collector timing trees; explicit `false` remains accepted. - Reject `explain: true` before index lookup or Qdrant work instead of returning hits without the requested per-hit score explanations; explicit `false` remains accepted. - Reject `highlight` before index lookup or Qdrant work instead of returning hits without the requested Elasticsearch/OpenSearch highlight snippets. - Reject `min_score`, `terminate_after`, and per-search `timeout` before index lookup or Qdrant work instead of silently returning complete, unfiltered results without the requested execution semantics. - Reject missing or empty alias action lists with the Elasticsearch/OpenSearch HTTP 400 `illegal_argument_exception` response instead of acknowledging an empty catalogue transaction. - Return an `aliases_not_found_exception` when every alias removal misses instead of acknowledging a no-op; mixed batches still apply successful actions and retain the documented Elasticsearch/OpenSearch response-shape limitation. - Update the locked `rustls` runtime dependency to 0.23.46 to address RUSTSEC-2026-0346 through RUSTSEC-2026-0349. - Reject alias filters, routing, write-index/hidden flags, remove `must_exist`, and unknown action options before changing the catalogue instead of acknowledging semantics the gateway cannot apply. - Reject invalid index names before catalogue or Qdrant work and return an Elasticsearch/OpenSearch-shaped HTTP 400 `invalid_index_name_exception`, including the native 255-byte UTF-8 boundary. - Reject alias action batches whose final state would require a multi-index alias instead of silently retargeting the gateway's single-target alias; explicit atomic remove+add swaps remain supported. - Return an Elasticsearch/OpenSearch-shaped HTTP 400 `resource_already_exists_exception` without contacting Qdrant or changing mappings when index creation targets an existing index. - Recursively merge inner objects during partial document updates so changing one nested member preserves its siblings, while arrays and scalar values retain Elasticsearch's replacement behavior. - Support a separate `upsert` source in standalone and bulk partial updates, and avoid a redundant second existence read when a missing document is created by either supported upsert form. - Preserve successful bulk `create`, `update`, and `delete` operation metadata, including the concrete index name when requests use an alias. - Preserve the complete `_source` and refresh mapped filter/sort payload fields when an embedded-storage partial update changes a non-text field. - Report HTTP 201 with `result: "created"` and HTTP 200 with `result: "updated"` for successful bulk index items while preserving one batched Qdrant lookup and write per contiguous index batch. - Report HTTP 201 with `result: "created"` for new standalone index requests and HTTP 200 with `result: "updated"` when the ID already exists, including requests routed through aliases. - Support `PUT` and `POST //_create/` with HTTP 201 for a new document and an Elasticsearch-shaped HTTP 409 response without a write when the ID already exists; structured errors now retain the product header. - Return an item-level `version_conflict_engine_exception` without overwriting the stored document when a bulk `create` action targets an existing ID. - Route document and search requests made through a durable alias to the concrete index's Qdrant collections and deterministic ID namespace; alias inspection now returns the concrete-index response shape. - Reject index names that would collide in Qdrant's normalized search/document collection namespace before creating upstream state. - Return HTTP 404 with `result: "not_found"` when deleting a missing document, including non-error bulk item reporting. - Return `document_missing_exception` for updates to missing documents while preserving explicit `doc_as_upsert` creation, including correct bulk error and status reporting. - Return HTTP 404 with Elasticsearch's `found: false` document shape when a GET targets a missing document. - Return Elasticsearch-shaped HTTP 413 errors for requests that exceed `MAX_BODY_BYTES` or `MAX_BULK_BYTES`, including bodies rejected while streaming. - Default the Helm deployment to one replica so its SQLite metadata catalog and `ReadWriteOnce` volume are not presented as a safe horizontally scaled control plane. - Publish index metadata only after Qdrant setup succeeds, and clean up collections after partial creation failures. - Decode percent-encoded route segments so document IDs containing slashes, spaces, or Unicode retain their Elasticsearch identity. - Add GitHub Pages documentation with reviewed architecture, operations, lifecycle, pattern-query, and pagination articles. - Add `_msearch`, `search_after` cursors with returned sort values, and common `_refresh`, `_open`, `_close`, and `_settings` lifecycle request compatibility. - Extend the endpoint-only validation replay and document request-level compatibility for the AWS Retail Demo Store and Spinscale catalogue app. - Add a reproducible external-corpus benchmark path and a local importer for the public H&M product catalogue. - Document additional Elasticsearch-backed open-source application targets and larger public dataset options. ## 0.1.0 Initial vertical slice: Rust Axum gateway, Qdrant server-side BM25, durable mappings and aliases, deterministic ES IDs, CRUD, bulk, search/filter/count, health endpoints, Docker Compose quickstart, structured compatibility errors, and local compatibility analytics.