<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Quinn Harper - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Quinn Harper - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/search-labs/author/quinn-harper</link>
    </image>
    <link>https://www.elastic.co/search-labs/author/quinn-harper</link>
    <atom:link href="https://www.elastic.co/search-labs/rss/author/quinn-harper.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[en]]></language>
    <lastBuildDate>Wed, 09 Sep 2026 22:16:03 GMT</lastBuildDate>
  <item>
    <title><![CDATA[One setting for production vector search: How vectordb_document mode tunes Elasticsearch automatically]]></title>
    <description><![CDATA[Benchmarks across four datasets show how one index setting applies bfloat16 vector quantization, cache preloading and parallel merges to improve vector search throughput and decrease storage.]]></description>
    <content:encoded><![CDATA[<p>We’re introducing one setting for production-ready vector search. The new <code>vectordb_document</code> index mode stores raw vectors as bfloat16 to halve their disk footprint and preloads vector data structures into the filesystem cache. It also lets segment merges run unthrottled and in parallel. In our benchmarks, it delivered up to 2× the queries per second (QPS) at high recall with <code>bbq_hnsw</code> and cut time to a search-ready index by roughly 20% with <code>bbq_disk</code>, with no tuning required. It’s available in Stateful Elasticsearch 9.5 and in Elasticsearch Serverless today.</p><p>Elasticsearch supports a diverse range of use cases, including observability metrics and logs and complex geospatial analysis. However, as vector search becomes a core component of modern architectures, the need for specialized optimization has grown. Achieving peak performance for vector-heavy workloads often requires navigating a complex space of configuration knobs. To reduce this operational toil, we wanted to provide opinionated, high-performance defaults through a single setting that simplifies performance tuning for production environments. The <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/dense-vector#dense-vector-vectordb-document-mode"><code>vectordb_document</code> index mode</a> is designed specifically for optimal vector search workloads.</p><h2>How to set up vectordb_document mode</h2><p>Setup is a single setting. When you’re creating an index, define the following in the index settings:</p>PUT my-index
{
  "settings" : {
    "index" : {
      "mode" : "vectordb_document"
     }
   }
}<p><code>vectordb_document</code> mode is available on all Elasticsearch subscription tiers, including Basic.</p><p>Most indices used for vector search also support other operations, such as aggregations or geo-search. They also support hybrid search. Because vector search is typically the most computationally demanding part of these mixed workloads, we recommend using the <code>vectordb_document</code> index mode to prioritize performance for your most intensive operations. An index in <code>vectordb_document</code> mode remains highly capable, supporting almost all operations available in the default standard mode, while optimizing specifically for the resource-heavy demands of vector search.</p><p>The <code>“_document”</code> suffix represents our roadmap. We're also developing a <code>“vectordb_columnar”</code> mode as another way to optimize vector search, suited to different data and access patterns.</p><h2>Elasticsearch vector search benchmarks across four datasets</h2><p>To validate these defaults, we performed extensive benchmarking across various datasets and two index types: <code>bbq_hnsw</code> and <code>bbq_disk</code>. We ran all benchmarks on a single-node Elasticsearch instance on AWS using a <code>c8gd.2xlarge</code> instance (Graviton 4, ARM64, local NVMe SSD) with a pod limited to 8GB RAM (2GB heap) and 4 CPUs, using a single shard.</p><p>Datasets:</p><p><strong>Dataset</strong></p><p><strong>Vectors</strong></p><p><strong>Dims</strong></p><p><strong>Use case</strong></p><p><code>laion-img-emb-512-20M-cosine</code></p><p>20 million</p><p>512</p><p>Pure vector search (low dim)</p><p><code>msmarco-v2-10M-jina-v5-1024</code></p><p>10 million</p><p>1024</p><p>Pure vector search (med dim)</p><p><code>dbpedia-openai-1M-3072-angular</code></p><p>1 million</p><p>3072</p><p>Pure vector search (high dim)</p><p><code>arxiv-for-fanns-large</code></p><p>2.7 million</p><p>4096</p><p>Filtered search</p><h3>bbq_hnsw: HNSW index performance with vectordb_document</h3><h4>Query throughput and recall</h4><p>On all four datasets, <code>vectordb_document</code> produced a better QPS–recall curve, and the shape of the advantage is itself informative. On <code>dbpedia-openai-1M</code>, <code>msmarco-v2-10M</code>, and <code>arxiv-for-fanns-large</code>, the curves start close together at low recall (essentially identical on arXiv) and separate as recall rises, reaching roughly 1.4×, 2.2×, and 2× at the high-recall end. On <code>laion-img-emb-512-20M</code>, the curves are apart from the start and settle at about 2× from recall 0.80 upward.</p><p>The gap widens with recall because higher recall is bought with oversampling, and oversampling is exactly where <code>vectordb_document</code> saves. The two effects compound. bfloat16 storage halves the bytes read per rescored candidate. More importantly for hierarchical navigable small world (HNSW), the oversample factor is applied to the graph search itself;  each segment is searched for k × oversample candidates, so cost scales with oversample times segment count. Unthrottled parallel merging leaves fewer, larger graphs (14–21 segments versus 22–29), and the graph and quantized vector files are preloaded into the filesystem cache, so <code>vectordb_document</code> pays far less for each increment of oversample.</p><p>Comparing identical search settings, rather than equal recall, makes the effect explicit. With rescoring switched off, the two modes are within 1%–28% of each other; at oversample 5, <code>vectordb_document</code> is 2–4× faster; at oversample 10, up to 10×. Those high-oversample settings sit off the QPS–recall frontier, which is why the curves above top out nearer 2×, but they isolate where the saving comes from.</p><p><strong>Oversample</strong></p><p><strong>DBpedia</strong></p><p><strong>LAION</strong></p><p><strong>MS MARCO</strong></p><p><strong>arXiv</strong></p><p>off</p><p>1.23×</p><p>1.28×</p><p>1.11×</p><p>1.01×</p><p>5</p><p>4.07×</p><p>2.66×</p><p>2.66×</p><p>2.05×</p><p>10</p><p>10.5×</p><p>2.33×</p><p>2.46×</p><p>4.03×</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7be4c804a0ed7c22/6a86d603e3ec262b84519f42/1.png" alt="Elasticsearch vector search QPS vs recall for bbq_hnsw on LAION 512-dim dataset showing 2x throughput with vectordb_document" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt231178fa23d0726e/6a86d61ceb4ccc9c18f20f42/2.png" alt="Elasticsearch vector search QPS vs recall for bbq_hnsw on MS MARCO 1024-dim dataset with vectordb_document mode enabled" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt80dfbad51b8f3bb9/6a86d63feb4ccc69c2f20f48/3.png" alt="Elasticsearch vector search QPS vs recall for bbq_hnsw on DBpedia 3072-dim dataset with vectordb_document mode enabled" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt85e29cf189fcc51b/6a86d65173f7435dda4861ed/4.png" alt="Elasticsearch vector search QPS vs recall for bbq_hnsw on arXiv 4096-dim filtered search with vectordb_document mode" /><h4>Indexing speed and merge behavior </h4><p>In our benchmarks, <code>vectordb_document</code> increased upload time by roughly 16%. This is expected: merges now run unthrottled and parallelized across threads, so they compete with indexing for CPU while documents are still being ingested. Measured indexing time rose 9%–26% across the four datasets. HNSW graph construction is CPU-bound, so that contention is felt directly.</p><p>The same changes make the post-upload phase much cheaper. Disabling auto-throttling removes merge rate limiting entirely (in default mode, DBpedia spent 57% of its merge time throttled), and bfloat16 halves the raw vector data, cutting total bytes merged by 42%–49%. Post-ingest merging finished 75%–86% sooner on three of the four datasets, which brings total time to a search-ready index to only about 6% above the baseline. DBpedia was the exception in the other direction: Its merge tail dominated, so total time actually fell 25%.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltaf89df79ce0e2185/6a86d6f4da6aead8bb379480/1.png" alt="Upload time comparison across four datasets for bbq_hnsw HNSW index with and without vectordb_document mode" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9162cec285c4f2a1/6a86d708a8b3231735cbfbbd/2.png" alt="Total ingest time including merges for bbq_hnsw HNSW index comparing default mode to vectordb_document mode" /><h3>bbq_disk: disk-based vector search performance with vectordb_document</h3><h4>bbq_disk query throughput and recall</h4><p>For <code>bbq_disk</code> indices, <code>vectordb_document</code> mode's impact on search throughput varied by dataset. On the lower-dimensional datasets, QPS was essentially unchanged at equal recall: <code>laion-img-emb-512-20M-cosine</code> (512 dims) and <code>msmarco-v2-10M-jina-v5-1024</code> (1024 dims) track each other closely across the recall range, with <code>vectordb_document</code> ahead in the lower recall end and a few percent behind at the high-recall end. On the higher-dimensional datasets, we saw a consistent gain of roughly 20% at equal recall: <code>dbpedia-openai-1M-3072-angular</code> (3072 dims) and <code>arxiv-for-fanns-large</code> (4096 dims).</p><p>Our interpretation is that this is mainly a rescoring effect. <code>vectordb_document</code> stores vectors as bfloat16, so each rescored candidate reads 2× dims bytes instead of 4× dims. The sweep supports this directly: The advantage grows with the query-time oversample factor, which is exactly what sets how many candidates get rescored. On DBpedia, the QPS ratio rises from 1.16× at oversample 3 to 4.3× at oversample 8, and on arXiv from 1.20× to 1.56×, while on laion and MS MARCO, it stays flat or drifts just below 1. Rescoring is simply a much larger share of the query on the smaller, higher-dimensional datasets; on the 10 million and 20 million ones, scanning 1-bit posting lists dominates.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc3dccb980e1e3a57/6a86d7ebeb4ccc0f68f20f4c/1.png" alt="Elasticsearch vector search QPS vs recall for bbq_disk on LAION 512-dim dataset with vectordb_document mode enabled" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltffd0c65e300e7985/6a86d80462f1e2732aafe73f/2.png" alt="Elasticsearch vector search QPS vs recall for bbq_disk on MS MARCO 1024-dim dataset with vectordb_document mode" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7574001d33d755e7/6a86d81a386ac33034adef66/3.png" alt="Elasticsearch vector search QPS vs recall for bbq_disk on DBpedia 3072-dim showing 20% gain with vectordb_document" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt45ec0bc4e1a47504/6a86d82aa1b20b40a18701ff/4.png" alt="Elasticsearch vector search QPS vs recall for bbq_disk on DBpedia 3072-dim showing 20% gain with vectordb_document" /><h4>Indexing speed and merge behavior </h4><p>Across the four datasets, <code>vectordb_document</code> cut total time to a fully merged, search-ready index by about 20%. Every dataset improved, from 6% on <code>msmarco-v2-10M</code> to 50% on <code>dbpedia-openai-1M</code>, where the post-upload merge phase alone fell from 322 seconds to 54 seconds. Upload time on its own is less clear-cut: On the day charted below, it finished 2%–15% sooner, depending on dataset, but on the earlier run set, it was marginally slower, so we read upload as unchanged to modestly faster and treat time-to-searchable as the real result.</p><p>The gain is almost entirely in merging. In default mode, Elasticsearch rate-limits how fast merges may write, and that limiter was binding hard: 75% of all merge time on DBpedia and 73% on laion was spent paused by it. <code>vectordb_document</code> disables the limiter, so paused time is zero and merge time drops 63% on DBpedia and 42% on laion. bfloat16 helps for the same reason: The limiter meters bytes written, so halving the raw vector data means less to write under the cap. The gradient across datasets follows the throttling rather than the byte count: arXiv, at 21% of merge time throttled, saw 30% less merge time, while MS MARCO, never throttled, got 55% fewer bytes but only 11% less merge time.</p><p>The two index types respond differently on ingest because merging costs something different in each. Merging <code>bbq_hnsw</code> segments means rebuilding HNSW graphs: CPU-bound work that competes directly with the equally CPU-bound graph construction on incoming documents, and on a 4-CPU pod that contention surfaces as a slower upload. <code>bbq_disk</code> merges are dominated by writing bytes rather than by CPU, so lifting the rate limiter spends I/O bandwidth that the local NVMe has to spare, and bfloat16 means that there are fewer bytes to write in the first place. Both index types reach a fully merged index far sooner; the difference is only whether the upload phase pays for it.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5792080b8d372fdd/6a86d85a8bbe584d8790e7cf/5.png" alt="Upload time comparison across four datasets for bbq_disk index with and without vectordb_document mode" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfc61269e37f0d5f4/6a86d86b762d1efd795cb927/6.png" alt="Total ingest time for bbq_disk index showing 20% faster time to search-ready with vectordb_document mode" /><h2>What vectordb_document sets under the hood</h2><h3><code>element_type</code> (<code>dense_vector</code>)</h3><ul><li><p><strong>Value: </strong>bfloat16.</p></li><li><p><strong>Impact: </strong>Stores each dimension of the raw vector as bfloat16 instead of the default float32, halving the storage of raw vectors with negligible impact on recall.</p></li><li><p><strong>Benefit: </strong>Lower disk footprint (reduced total cost of ownership [TCO]), faster fetching of vectors for rescoring.</p></li></ul><h3>Dynamic float array mapping</h3><ul><li><p><strong>Value: </strong>Float arrays with 32 or more values are dynamically mapped as <code>dense_vector</code>. (In the default mode, this threshold is 128.)</p></li><li><p><strong>Impact:</strong> No need to explicitly declare the field as a dense vector field; the system identifies it automatically.</p></li><li><p><strong>Benefit: </strong>Configuration simplicity.</p></li></ul><h3><code>exclude_source_vectors</code></h3><ul><li><p><strong>Value: </strong>true.</p></li><li><p><strong>Impact: </strong>Vectors are stored once in the vector index and not duplicated in <code>_source</code>. They’re omitted from <code>_source</code> in responses, but they can still be retrieved on request.</p></li></ul><p><strong>Benefit: </strong>Lower disk footprint; faster queries, since large vectors are no longer shipped with every <code>_source</code> fetch.</p><h3><code>index.store.preload</code></h3><ul><li><p><strong>Value: </strong>[<code>"vex"</code>, <code>"veq"</code>, <code>"veb"</code>, <code>"cenivf"</code>].</p></li><li><p><strong>Impact: </strong>Preloads search-time vector data structures into the filesystem cache whenever new segments are opened.</p></li><li><p><strong>Benefit: </strong>Reduced query latency.</p></li></ul><h3><code>index.merge.intra_merge_parallelism_enabled</code></h3><ul><li><p><strong>Value: </strong>true.</p></li><li><p><strong>Impact: </strong>Use parallel threads for segment merging to achieve optimal segment sizes.</p></li><li><p><strong>Benefit: </strong>Faster convergence to fewer, larger segments leads to better recall, lower query latency.</p></li></ul><h3><code>index.merge.scheduler.auto_throttle</code></h3><ul><li><p><strong>Value: </strong>false.</p></li><li><p><strong>Impact: </strong>Allows merges to proceed at full speed.</p></li><li><p><strong>Benefit: </strong>Merges reach optimal segment sizes sooner, resulting in better recall, lower query latency.</p></li></ul><p>While these defaults are optimized for the majority of use cases, most can be overridden individually to suit unique hardware constraints or extreme performance requirements, with one exception: <code>exclude_source_vectors: true</code> is locked in and cannot be changed on a <code>vectordb_document</code> index.</p><h2>Summary</h2><p>The <code>vectordb_document</code> index mode is a production-ready foundation for vector search: By adopting high-performance defaults, teams can focus on building features rather than on hand-tuning merge or storage settings or on adjusting preload settings. </p><p>Across four datasets, the picture is consistently favorable, though the balance differs by index type. With <code>bbq_hnsw</code>, QPS recall improved on every dataset, from roughly on par at low recall to as much as double at the high-recall end, in exchange for a modest ingest cost of about 16% longer upload and 6% longer time to a search-ready index. With <code>bbq_disk</code>, the trade runs the other way: Total time to a search-ready index dropped by about 20%, while search improved by about 20% at equal recall on the higher-dimensional datasets (3072 and 4096 dims) and was essentially unchanged on the lower-dimensional ones. The split comes down to what merging costs in each: Rebuilding HNSW graphs is CPU work that competes with indexing; whereas <code>bbq_disk</code> merges are write-bound and simply run faster once they’re unthrottled.</p><p>In both cases, the new defaults move the system in the direction that most users want, with no per-index tuning required. And, for the settings that genuinely depend on the data itself, such as the degree of quantization, auto-calibration now derives them for you. (See <a href="https://www.elastic.co/search-labs/blog/vector-quantization-auto-calibration-elasticsearch">How Elasticsearch auto-tunes vector quantization to hit your recall target</a>.)</p><p>Try it out by creating an index with the <code>vectordb_document</code> index mode in Stateful Elasticsearch 9.5 or in Serverless.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-vector-search-vectordb-document-mode</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-vector-search-vectordb-document-mode</guid>
    <category><![CDATA[Vector Database]]></category>
    <dc:creator><![CDATA[Mayya Sharipova,Gilad Gal,Quinn Harper]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt24f9f391ea8b5d02/6a86ce55bed19d4545af9b54/unnamed.jpg" length="0" type="image/jpeg"/>
    <pubDate>Thu, 20 Aug 2026 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>