# Qdrant ES Gateway > Elasticsearch-compatible application search backed by Qdrant. Compatibility is intentionally scoped. ## Start here - [compatibility](https://dstockton.github.io/qdrant-es-gateway/markdown/compatibility.md) - [architecture](https://dstockton.github.io/qdrant-es-gateway/markdown/architecture.md) - [production](https://dstockton.github.io/qdrant-es-gateway/markdown/production.md) - [migration](https://dstockton.github.io/qdrant-es-gateway/markdown/migration.md) - [application-validation](https://dstockton.github.io/qdrant-es-gateway/markdown/application-validation.md) - [benchmarking](https://dstockton.github.io/qdrant-es-gateway/markdown/benchmarking.md) - [contributing](https://dstockton.github.io/qdrant-es-gateway/markdown/contributing.md) - [demo-app-compatibility](https://dstockton.github.io/qdrant-es-gateway/markdown/demo-app-compatibility.md) - [external-corpus-results](https://dstockton.github.io/qdrant-es-gateway/markdown/external-corpus-results.md) - [internals](https://dstockton.github.io/qdrant-es-gateway/markdown/internals.md) - [read-write-crossover](https://dstockton.github.io/qdrant-es-gateway/markdown/read-write-crossover.md) - [relevance](https://dstockton.github.io/qdrant-es-gateway/markdown/relevance.md) - [Shared metadata across gateway replicas](https://dstockton.github.io/qdrant-es-gateway/markdown/shared-catalog.md) - [Shared read cache](https://dstockton.github.io/qdrant-es-gateway/markdown/shared-read-cache.md) - [storage-findings](https://dstockton.github.io/qdrant-es-gateway/markdown/storage-findings.md) ## Articles (Markdown) - [Qdrant 1.20.0 through the gateway: almost identical read performance and an auth upgrade check](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-23-qdrant-1-20-gateway-upgrade.md) - [Script fields cannot be empty promises](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-20-script-fields-cannot-be-empty-promises.md) - [Hit concurrency metadata cannot be invented](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-19-hit-concurrency-metadata-cannot-be-invented.md) - [Requested doc values cannot silently disappear](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-19-doc-values-cannot-silently-disappear.md) - [Which dry plots need an irrigation inspection?](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-19-agriculture-irrigation-inspection.md) - [Query profiles cannot be empty](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-18-query-profiles-cannot-be-empty.md) - [Refreshing the production stack without opening old volumes](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-18-production-stack-refresh.md) - [Score explanations must explain the score](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-17-score-explanations-must-explain-the-score.md) - [Highlight snippets cannot vanish](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-17-highlight-snippets-cannot-vanish.md) - [Which batteries belong on the dispatch shortlist?](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-17-energy-dispatch-shortlist.md) - [AWS Retail Demo Store: compatible search requests, different trade-offs](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-17-aws-retail-demo-store-compatibility.md) - [Search controls cannot be decoration](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-16-search-controls-cannot-be-decoration.md) - [An empty alias batch is not success](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-16-empty-alias-batches-are-not-success.md) - [Testing a cache before building it](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-15-testing-a-cache-before-building-it.md) - [Find the next page across the whole catalogue](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-15-sorted-pages-look-past-first-candidates.md) - [Two gateways need one view of their mappings](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-15-sharing-mappings-between-gateway-replicas.md) - [Repeated searches get faster; fresh queries still cost more](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-15-shared-cache-warm-search-results.md) - [Rustls security fixes landed](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-15-rustls-security-fixes-landed.md) - [Reusing catalog connections helps misses and writes, with a warm-read warning](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-15-reusing-catalog-connections.md) - [Removing request-local SQLite reconstruction: modest gains, one worse tail](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-15-request-local-catalog-read-views.md) - [One Qdrant search thread improves tails, but hurts typical cold queries](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-15-qdrant-search-thread-tradeoff.md) - [Missing alias removals are not success](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-15-missing-alias-removals-are-not-success.md) - [Measure the request timeline before rewriting JSON handling](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-15-measuring-the-gateway-request-timeline.md) - [Fewer requests did not make this query faster](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-15-measuring-small-read-path-changes.md) - [Can I borrow the large-print edition today?](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-15-library-large-print-availability.md) - [Inside a cold search: a backend diagnostic, not another engine benchmark](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-15-inside-a-cold-search-backend-diagnostic.md) - [Sorting twenty records should not fetch ten thousand](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-15-indexed-query-performance.md) - [Keep your sparse token IDs intact](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-15-explicit-sparse-vectors-without-token-folding.md) - [Keep coordination durable, let response-cache fills be disposable](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-15-disposable-cache-fills-durable-coordination.md) - [Asking for less should not make sorting slower](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-15-disabling-totals-should-not-slow-sorting.md) - [Changing transport was not enough](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-15-changing-transport-was-not-enough.md) - [A reporting day is not always 24 hours](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-15-calendar-days-follow-local-time.md) - [One fewer catalog request, without a proven latency win](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-15-atomic-cache-miss-snapshots.md) - [The cheapest item may be on the next page](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-15-aggregations-beyond-the-first-page.md) - [A shared catalog is not a snapshot](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-15-a-shared-catalog-is-not-a-snapshot.md) - [Index names are a client contract](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-14-index-names-are-a-client-contract.md) - [Alias options must not disappear](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-14-alias-options-must-not-disappear.md) - [Who is still waiting for a first reply?](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-13-support-first-reply-queue.md) - [Creating an index is not a mapping update](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-13-creating-an-index-is-not-a-mapping-update.md) - [Alias add is not a retarget](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-13-alias-add-is-not-a-retarget.md) - [HEAD must not hide storage failures](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-12-head-must-not-hide-storage-failures.md) - [A missing point is not a failed upstream](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-12-a-missing-point-is-not-a-failed-upstream.md) - [Two passengers, one cancelled departure](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-11-travel-disruption-desk.md) - [Source filters should not leak sibling fields](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-11-source-filters-should-not-leak-siblings.md) - [Integer hit totals need the minus-one sentinel](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-11-integer-hit-totals-need-the-minus-one-sentinel.md) - [Disabled hit totals should skip the count](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-10-disabled-hit-totals-should-skip-the-count.md) - [Search-after needs more than one page](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-09-search-after-needs-more-than-one-page.md) - [OpenSearch wildcards keep the leading star](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-09-opensearch-wildcards-keep-the-leading-star.md) - [Is this coastal clip cleared for the UK edit?](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-09-media-clearance-shortlist.md) - [Invalid pages should not query Qdrant](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-08-invalid-pages-should-not-query-qdrant.md) - [Inner hits need the requested name](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-08-inner-hits-need-the-requested-name.md) - [Unsupported post filters must fail closed](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-07-post-filters-must-fail-closed.md) - [A post-filter is not an aggregation filter](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-07-post-filters-are-not-aggregation-filters.md) - [Packed, but where is the tracking number?](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-07-logistics-missing-tracking.md) - [Keyword multi-fields need one route](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-06-keyword-multifields-need-one-route.md) - [A page is not a total](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-06-a-page-is-not-a-total.md) - [Sort syntax must not change the order](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-05-sort-shapes-must-not-change-the-order.md) - [An evening class with room for one more](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-05-education-course-availability.md) - [Arrays are multi-valued fields, not scalar mismatches](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-05-arrays-are-multi-valued-fields.md) - [Optional should really is optional](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-04-optional-should-really-is-optional.md) - [Nested negation keeps its boundary](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-04-nested-negation-keeps-its-boundary.md) - [Pattern counts must scan the source](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-03-pattern-counts-must-scan-source.md) - [The pump is fixed. Take it off the queue.](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-03-manufacturing-maintenance-queue.md) - [Exists means not empty](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-03-exists-means-not-empty.md) - [Zero results still need a positive scroll](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-02-zero-results-still-need-a-positive-scroll.md) - [Mapping updates must not erase the map](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-02-mapping-updates-must-not-erase-the-map.md) - [Invalid UTF-8 is not source data](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-01-invalid-utf8-is-not-source-data.md) - [Alias batches are one routing change](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-10-01-alias-batches-are-one-routing-change.md) - [Bulk mutations need document IDs](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-30-bulk-mutations-need-document-ids.md) - [Bulk action metadata is a write boundary](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-30-bulk-action-metadata-is-a-write-boundary.md) - [Unchanged updates should not write](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-29-unchanged-updates-should-not-write.md) - [Partial updates should not erase sibling fields](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-29-partial-updates-merge-inner-objects.md) - [Bulk items should preserve the operation result](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-28-bulk-items-should-preserve-the-operation-result.md) - [A partial document is not an upsert source](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-28-a-partial-document-is-not-an-upsert-source.md) - [A partial update must preserve the document](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-27-partial-updates-must-preserve-the-document.md) - [Accurate bulk index results without per-item reads](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-27-bulk-index-results-without-per-item-reads.md) - [Standalone create now preserves existing documents](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-26-standalone-create-preserves-existing-documents.md) - [Index results should describe the write](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-26-index-results-should-describe-the-write.md) - [One index, one collection namespace](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-25-one-index-one-collection-namespace.md) - [Bulk create must not become upsert](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-25-bulk-create-must-not-overwrite.md) - [An alias must route the request](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-25-an-alias-must-route-the-request.md) - [0.1.2: safer defaults for production traffic](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-24-release-0-1-2.md) - [A missing update is not an upsert](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-24-missing-updates-are-not-upserts.md) - [A missing delete is not a successful delete](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-24-missing-deletes-are-not-successes.md) - [A timeout is a feature](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-24-a-timeout-is-a-feature.md) - [Oversized requests are not bad JSON](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-23-oversized-requests-are-not-bad-json.md) - [A missing document is a 404](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-23-missing-documents-are-404s.md) - [One replica is the safe default](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-22-one-replica-is-the-safe-default.md) - [No phantom indices after creation failures](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-22-no-phantom-indices-after-create-failures.md) - [A slash is part of the document ID](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-21-a-slash-is-part-of-the-id.md) - [When bulk errors did not mean errors](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-20-bulk-errors-mean-errors.md) - [Three nodes, one disappears, and the search keeps moving](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-19-three-nodes-one-goes-away.md) - [Making the bulk request limit real](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-19-making-the-bulk-limit-real.md) - [Keep the Elasticsearch client, change the engine](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-18-why-qdrant-es-gateway.md) - [Two collections, one stateless gateway](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-18-two-collections-one-stateless-gateway.md) - [Pattern queries without a client rewrite](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-18-pattern-queries-without-a-client-rewrite.md) - [Batching searches and paging through ordered results](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-18-multi-search-and-cursor-pagination.md) - [Compatibility includes the boring lifecycle calls](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-18-lifecycle-compatibility-for-real-apps.md) - [Launch video: keep the Elasticsearch client, change the engine](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-18-launch-video.md) - [A dress, a tea bag, and a null](https://dstockton.github.io/qdrant-es-gateway/markdown/2026-09-18-a-dress-a-tea-bag-and-a-null.md) ## Complete text - [All documentation and articles](https://dstockton.github.io/qdrant-es-gateway/llms-full.txt)