{
  "description": "Browse aymeric's, an independent, searchable archive of readable snapshots from followed feeds, preserved in Git with aggr.",
  "feed_url": "https://aggr.aymericbeaumet.com/sources/github.com/timescale/feed.json",
  "home_page_url": "https://aggr.aymericbeaumet.com/sources/github.com/timescale/",
  "items": [
    {
      "authors": [
        {
          "name": "jascha_eng"
        }
      ],
      "content_html": "<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pg_vectorsearch/actions/workflows/build.yml?query=branch%3Amain+event%3Apush\"><picture class=\"article-picture article-badge\" style=\"--image-width:160px;--image-ratio:160 / 24\"><img src=\"https://github.com/timescale/pg_vectorsearch/actions/workflows/build.yml/badge.svg?branch=main&amp;event=push\" width=\"160\" height=\"24\" alt=\"Build\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://timescale.github.io/pg_vectorsearch/coverage/\"><picture class=\"article-picture article-badge\" style=\"--image-width:160px;--image-ratio:160 / 24\"><img src=\"https://camo.githubusercontent.com/94d6957c816eb3e23de12a7667353594703591c1e342e0ec2e23e4dde4b807f0/68747470733a2f2f696d672e736869656c64732e696f2f656e64706f696e743f75726c3d68747470733a2f2f74696d657363616c652e6769746875622e696f2f70675f766563746f727365617263682f636f7665726167652d62616467652e6a736f6e\" width=\"160\" height=\"24\" alt=\"Coverage\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://scan.coverity.com/projects/timescale-pg_vectorsearch\"><picture class=\"article-picture article-badge\" style=\"--image-width:160px;--image-ratio:160 / 24\"><img src=\"https://camo.githubusercontent.com/b14b414026fcae54c331173f9b694d0fd26adaa1cba9e00a20df430d217ab016/68747470733a2f2f7363616e2e636f7665726974792e636f6d2f70726f6a656374732f74696d657363616c652d70675f766563746f727365617263682f62616467652e737667\" width=\"160\" height=\"24\" alt=\"Coverity\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a></p>\n<p>A PostgreSQL extension for high-performance approximate nearest neighbor (ANN) search.</p>\n<blockquote>\n<p><strong>Status: alpha.</strong> Meant for testing, not production. Upgrading between prereleases may not be possible; plan to drop and recreate the extension and its indexes. See the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pg_vectorsearch/blob/main/CHANGELOG.md\">changelog</a> for known issues.</p>\n</blockquote>\n<ul>\n<li><strong>PRISM index</strong> (100M+ vectors) — IVF-style, with hierarchical routing</li>\n<li><strong>RaBitQ quantization</strong> with theoretical error bounds for two-stage search</li>\n<li><strong>SIMD-optimized distance computation</strong> (AVX2, AVX512, NEON)</li>\n<li><strong>Dynamic updates</strong> — inserts, updates and deletes, with posting-list splits via <code>prism_rebalance</code> (see <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pg_vectorsearch#maintenance\">Maintenance</a>)</li>\n<li><strong>pgvector compatible</strong> — index existing <code>vector</code> and <code>halfvec</code> columns as-is (see <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pg_vectorsearch#existing-pgvector-tables\">Existing pgvector tables</a>)</li>\n</ul>\n<h2>PRISM Index</h2>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pg_vectorsearch/blob/main/images/prism-logo.jpg\"><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://github.com/timescale/pg_vectorsearch/raw/main/images/prism-logo.jpg\" alt=\"PRISM\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a></p>\n<p>PRISM (Partitioned Routing Index for Similarity Matching) is a PostgreSQL-native index access method that is conceptually similar to <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/pgvector/pgvector\">pgvector</a>'s IVFFlat, but it is built around state-of-the-art quantization, routing, and partitioning techniques. It is implemented in C for high performance and seamless integration with PostgreSQL.</p>\n<p>The result: an <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.tigerdata.com/blog/announcing-pg_vectorsearch-scalable-open-source-vector-search-postgresql\">index that is significantly faster</a> than pgvector's IVFFlat and HNSW, for both querying and index building. In fact, compared to graph-based HNSW, PRISM is faster at equivalent recall on a 100-million-vector dataset, on an instance with a quarter of the memory.</p>\n<p>To achieve this performance, PRISM uses a hierarchical centroid tree to partition vectors into clusters, and relies on the PostgreSQL buffer cache to keep that tree warm in memory. Vectors are <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/gaoj0017/RaBitQ\">RaBitQ</a>-quantized and stored in posting lists with a page layout optimized for SIMD distance computation. The RaBitQ encoding carries error bounds that let a search rule out vectors that cannot possibly be nearest neighbors, so far fewer of them need reranking against the full-precision vectors stored in the table.</p>\n<pre><code><span class=\"code-snippet\">Query Flow:\n1. Traverse centroid tree to find nearest clusters (buffer cache)\n2. Scan posting lists for candidates (buffer cache, async I/O)\n3. RaBitQ two-stage filtering: estimate → error bound → rerank\n4. Full-precision reranking from heap\n5. Return k nearest neighbors\n</span></code></pre>\n<p>For detailed architecture, see <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pg_vectorsearch/blob/main/docs/architecture.md\">docs/architecture.md</a>.</p>\n<h2>Usage</h2>\n<p>Install the extension first; see <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pg_vectorsearch#building\">Building</a>.</p>\n<p>There are two ways to use a PRISM index. Pick the one that matches where your vectors live:</p>\n<ul>\n<li><strong><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pg_vectorsearch#native-types\">Native types</a>.</strong> Starting fresh, or not using pgvector? Store vectors in <code>pg_vectorsearch</code>'s own <code>vec32</code> (float32) or <code>vec16</code> (float16) columns. No other extension is needed.</li>\n<li><strong><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pg_vectorsearch#existing-pgvector-tables\">Existing pgvector tables</a>.</strong> Already have <code>vector</code> or <code>halfvec</code> columns? Install <code>pg_vectorsearch</code> next to pgvector and build a PRISM index on those columns as they are. Your table and queries stay unchanged.</li>\n</ul>\n<p>Both paths build the same index and use the same operators (<code>&lt;-&gt;</code>, <code>&lt;#&gt;</code>, <code>&lt;=&gt;</code>) and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pg_vectorsearch#tuning\">tuning</a> knobs.</p>\n<h3>Native types</h3>\n<pre><code class=\"language-sql\"><span class=\"code-snippet\" data-language=\"SQL\"><span class=\"syntax-source syntax-sql\">CREATE EXTENSION pg_vectorsearch;\n\n<span class=\"syntax-comment syntax-line syntax-double-dash syntax-sql\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-sql\">--</span> PLAIN keeps the vector inline. EXTERNAL (the default) toasts a value\n</span><span class=\"syntax-comment syntax-line syntax-double-dash syntax-sql\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-sql\">--</span> over ~2 kB, and rerank then pays an extra fetch the planner does not cost.\n</span><span class=\"syntax-meta syntax-create syntax-sql\"><span class=\"syntax-keyword syntax-other syntax-create syntax-sql\">CREATE</span> <span class=\"syntax-keyword syntax-other syntax-sql\">TABLE</span> <span class=\"syntax-entity syntax-name syntax-function syntax-sql\">items</span></span> (\n    id <span class=\"syntax-storage syntax-type syntax-sql\">serial</span> <span class=\"syntax-storage syntax-modifier syntax-sql\">PRIMARY KEY</span>,\n    embedding vec32(<span class=\"syntax-constant syntax-numeric syntax-sql\">3</span>) STORAGE PLAIN\n);\n\n<span class=\"syntax-comment syntax-line syntax-double-dash syntax-sql\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-sql\">--</span> Load first; the index is sized from the row count at CREATE INDEX.\n</span><span class=\"syntax-comment syntax-line syntax-double-dash syntax-sql\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-sql\">--</span> 500 rows is enough for the planner to use the index.\n</span><span class=\"syntax-keyword syntax-other syntax-DML syntax-sql\">INSERT INTO</span> items (embedding)\n<span class=\"syntax-keyword syntax-other syntax-DML syntax-sql\">SELECT</span> ARRAY[i::<span class=\"syntax-storage syntax-type syntax-sql\">real</span>, (i % <span class=\"syntax-constant syntax-numeric syntax-sql\">7</span>)::<span class=\"syntax-storage syntax-type syntax-sql\">real</span>, (i % <span class=\"syntax-constant syntax-numeric syntax-sql\">5</span>)::<span class=\"syntax-storage syntax-type syntax-sql\">real</span>]::vec32\n<span class=\"syntax-keyword syntax-other syntax-DML syntax-sql\">FROM</span> generate_series(<span class=\"syntax-constant syntax-numeric syntax-sql\">1</span>, <span class=\"syntax-constant syntax-numeric syntax-sql\">1000</span>) i;\n\n<span class=\"syntax-comment syntax-line syntax-double-dash syntax-sql\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-sql\">--</span> For inner product or cosine, see Operator classes below.\n</span><span class=\"syntax-meta syntax-create syntax-sql\"><span class=\"syntax-keyword syntax-other syntax-create syntax-sql\">CREATE</span> <span class=\"syntax-keyword syntax-other syntax-sql\">INDEX</span> <span class=\"syntax-entity syntax-name syntax-function syntax-sql\">ON</span></span> items USING prism (embedding vec32_l2_ops);\n\n<span class=\"syntax-comment syntax-line syntax-double-dash syntax-sql\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-sql\">--</span> 0 = auto (~0.95 recall). Raise for recall, lower for speed.\n</span><span class=\"syntax-keyword syntax-other syntax-DML syntax-sql\">SET</span> <span class=\"syntax-constant syntax-other syntax-database-name syntax-sql\">prism</span>.<span class=\"syntax-constant syntax-other syntax-table-name syntax-sql\">nprobe</span> <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-sql\">=</span> <span class=\"syntax-constant syntax-numeric syntax-sql\">40</span>;\n\n<span class=\"syntax-keyword syntax-other syntax-DML syntax-sql\">SELECT</span> <span class=\"syntax-keyword syntax-operator syntax-star syntax-sql\">*</span> <span class=\"syntax-keyword syntax-other syntax-DML syntax-sql\">FROM</span> items\n<span class=\"syntax-keyword syntax-other syntax-DML syntax-sql\">ORDER BY</span> embedding <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-sql\">&lt;</span><span class=\"syntax-keyword syntax-operator syntax-math syntax-sql\">-</span><span class=\"syntax-keyword syntax-operator syntax-comparison syntax-sql\">&gt;</span> <span class=\"syntax-string syntax-quoted syntax-single syntax-sql\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-sql\">&#39;</span>[3,1,2]<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-sql\">&#39;</span></span>\n<span class=\"syntax-keyword syntax-other syntax-DML syntax-sql\">LIMIT</span> <span class=\"syntax-constant syntax-numeric syntax-sql\">5</span>;\n</span></span></code></pre>\n<p>Use <code>vec16</code> instead of <code>vec32</code> to halve the space vectors take in the table, with the matching <code>vec16_*</code> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pg_vectorsearch#operator-classes\">operator classes</a>.</p>\n<h3>Existing pgvector tables</h3>\n<p>If you already have a table with pgvector's <code>vector</code> or <code>halfvec</code> columns, you can build a PRISM index on it directly. Nothing about the table or your queries needs to change. <code>vec32</code> and <code>vec16</code> are binary-compatible with pgvector's <code>vector</code> and <code>halfvec</code> but have different names, so the two extensions can be installed side by side, even in the same schema.</p>\n<pre><code class=\"language-sql\"><span class=\"code-snippet\" data-language=\"SQL\"><span class=\"syntax-source syntax-sql\"><span class=\"syntax-comment syntax-line syntax-double-dash syntax-sql\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-sql\">--</span> The table you already have, included so the example runs on its own.\n</span>CREATE EXTENSION vector;\n\n<span class=\"syntax-meta syntax-create syntax-sql\"><span class=\"syntax-keyword syntax-other syntax-create syntax-sql\">CREATE</span> <span class=\"syntax-keyword syntax-other syntax-sql\">TABLE</span> <span class=\"syntax-entity syntax-name syntax-function syntax-sql\">documents</span></span> (\n    id        <span class=\"syntax-storage syntax-type syntax-sql\">bigserial</span> <span class=\"syntax-storage syntax-modifier syntax-sql\">PRIMARY KEY</span>,\n    body      <span class=\"syntax-storage syntax-type syntax-sql\">text</span>,\n    embedding vector(<span class=\"syntax-constant syntax-numeric syntax-sql\">384</span>)\n);\n<span class=\"syntax-meta syntax-create syntax-sql\"><span class=\"syntax-keyword syntax-other syntax-create syntax-sql\">CREATE</span> <span class=\"syntax-keyword syntax-other syntax-sql\">INDEX</span> <span class=\"syntax-entity syntax-name syntax-function syntax-sql\">documents_embedding_hnsw</span></span>\n    <span class=\"syntax-keyword syntax-other syntax-DDL syntax-create syntax-II syntax-sql\">ON</span> documents USING hnsw (embedding vector_l2_ops);\n\n<span class=\"syntax-comment syntax-line syntax-double-dash syntax-sql\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-sql\">--</span> Install pg_vectorsearch next to pgvector and build the index on the\n</span><span class=\"syntax-comment syntax-line syntax-double-dash syntax-sql\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-sql\">--</span> existing column. The column is not rewritten or copied.\n</span>CREATE EXTENSION pg_vectorsearch;\n\n<span class=\"syntax-meta syntax-create syntax-sql\"><span class=\"syntax-keyword syntax-other syntax-create syntax-sql\">CREATE</span> <span class=\"syntax-keyword syntax-other syntax-sql\">INDEX</span> <span class=\"syntax-entity syntax-name syntax-function syntax-sql\">documents_embedding_prism</span></span>\n    <span class=\"syntax-keyword syntax-other syntax-DDL syntax-create syntax-II syntax-sql\">ON</span> documents USING prism (embedding vec32_l2_ops);\n\n<span class=\"syntax-comment syntax-line syntax-double-dash syntax-sql\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-sql\">--</span> Your queries keep working as before. PRISM is normally faster, so\n</span><span class=\"syntax-comment syntax-line syntax-double-dash syntax-sql\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-sql\">--</span> the planner should prefer it over the HNSW index while both exist.\n</span><span class=\"syntax-comment syntax-line syntax-double-dash syntax-sql\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-sql\">--</span> Verify with an EXPLAIN:\n</span>EXPLAIN (COSTS OFF)\n<span class=\"syntax-keyword syntax-other syntax-DML syntax-sql\">SELECT</span> id, body\n<span class=\"syntax-keyword syntax-other syntax-DML syntax-sql\">FROM</span> documents\n<span class=\"syntax-keyword syntax-other syntax-DML syntax-sql\">ORDER BY</span> embedding <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-sql\">&lt;</span><span class=\"syntax-keyword syntax-operator syntax-math syntax-sql\">-</span><span class=\"syntax-keyword syntax-operator syntax-comparison syntax-sql\">&gt;</span> (<span class=\"syntax-keyword syntax-other syntax-DML syntax-sql\">SELECT</span> embedding <span class=\"syntax-keyword syntax-other syntax-DML syntax-sql\">FROM</span> documents <span class=\"syntax-keyword syntax-other syntax-DML syntax-sql\">WHERE</span> id <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-sql\">=</span> <span class=\"syntax-constant syntax-numeric syntax-sql\">42</span>)\n<span class=\"syntax-keyword syntax-other syntax-DML syntax-sql\">LIMIT</span> <span class=\"syntax-constant syntax-numeric syntax-sql\">10</span>;\n<span class=\"syntax-comment syntax-line syntax-double-dash syntax-sql\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-sql\">--</span>  Limit\n</span><span class=\"syntax-comment syntax-line syntax-double-dash syntax-sql\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-sql\">--</span>    InitPlan 1\n</span><span class=\"syntax-comment syntax-line syntax-double-dash syntax-sql\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-sql\">--</span>      -&gt;  Index Scan using documents_pkey on documents documents_1\n</span><span class=\"syntax-comment syntax-line syntax-double-dash syntax-sql\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-sql\">--</span>            Index Cond: (id = 42)\n</span><span class=\"syntax-comment syntax-line syntax-double-dash syntax-sql\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-sql\">--</span>    -&gt;  Index Scan using documents_embedding_prism on documents\n</span><span class=\"syntax-comment syntax-line syntax-double-dash syntax-sql\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-sql\">--</span>          Order By: (embedding &lt;-&gt; (InitPlan 1).col1)\n</span>\n<span class=\"syntax-comment syntax-line syntax-double-dash syntax-sql\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-sql\">--</span> Once you are happy with it, drop the HNSW index.\n</span><span class=\"syntax-meta syntax-drop syntax-sql\"><span class=\"syntax-keyword syntax-other syntax-create syntax-sql\">DROP</span> <span class=\"syntax-keyword syntax-other syntax-sql\">INDEX</span></span> documents_embedding_hnsw;\n</span></span></code></pre>\n<p>Use the PRISM <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pg_vectorsearch#operator-classes\">operator class</a> for the same distance metric as your HNSW index.</p>\n<h3>Operator classes</h3>\n<p>Pick the operator class for your distance metric and column type. L2 is the default.</p>\n<table>\n<thead>\n<tr>\n<th>Distance</th>\n<th>Operator</th>\n<th><code>vec32</code> / <code>vector</code></th>\n<th><code>vec16</code> / <code>halfvec</code></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>L2</td>\n<td><code>&lt;-&gt;</code></td>\n<td><code>vec32_l2_ops</code></td>\n<td><code>vec16_l2_ops</code></td>\n</tr>\n<tr>\n<td>Inner product</td>\n<td><code>&lt;#&gt;</code></td>\n<td><code>vec32_ip_ops</code></td>\n<td><code>vec16_ip_ops</code></td>\n</tr>\n<tr>\n<td>Cosine</td>\n<td><code>&lt;=&gt;</code></td>\n<td><code>vec32_cosine_ops</code></td>\n<td><code>vec16_cosine_ops</code></td>\n</tr>\n</tbody>\n</table>\n<p>When replacing an HNSW index, pgvector's <code>vector_&lt;metric&gt;_ops</code> maps to <code>vec32_&lt;metric&gt;_ops</code> and <code>halfvec_&lt;metric&gt;_ops</code> to <code>vec16_&lt;metric&gt;_ops</code>.</p>\n<h3>Tuning</h3>\n<p>Defaults are tuned from large-scale benchmarks; most deployments only ever adjust <code>prism.nprobe</code>. See the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pg_vectorsearch/blob/main/docs/tuning.md\">tuning guide</a> for every index parameter and GUC, their tradeoffs, and when changing them makes sense.</p>\n<h3>Maintenance</h3>\n<p>An insert appends to whichever posting list its vector routes to, so lists grow as rows arrive and never split on their own. Besides <code>REINDEX</code>, the <code>prism_rebalance</code> procedure splits oversized lists in place. See the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pg_vectorsearch/blob/main/docs/maintenance.md\">maintenance guide</a> for how it works and its current limitations.</p>\n<h2>Building</h2>\n<p><strong>Requirements:</strong></p>\n<ul>\n<li>PostgreSQL 18+ (with development headers)</li>\n<li>GNU C11 compiler (GCC 11+ or Clang 14+)</li>\n<li>Meson build system</li>\n<li>Optional: CBLAS, for faster RaBitQ encoding. See <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pg_vectorsearch/blob/main/docs/development.md#blas\">Development</a>.</li>\n</ul>\n<pre><code class=\"language-shell\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Release build</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">meson</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> setup builddir<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>buildtype</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-option syntax-shell\">=</span>release</span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Build and install to PostgreSQL</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">meson</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> install<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>C</span> builddir</span>\n</span></span></code></pre>\n<p>See the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pg_vectorsearch/blob/main/docs/development.md#build-options\">development guide</a> for build options.</p>\n<h2>Documentation</h2>\n<ul>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pg_vectorsearch/blob/main/docs/tuning.md\">Tuning</a> - Index parameters, GUCs, tradeoffs, defaults</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pg_vectorsearch/blob/main/docs/maintenance.md\">Maintenance</a> - Rebalancing and splitting posting lists</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pg_vectorsearch/blob/main/docs/architecture.md\">Architecture</a> - High-level design and data structures</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pg_vectorsearch/blob/main/docs/simd.md\">SIMD</a> - SIMD build options and distance computation</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pg_vectorsearch/blob/main/docs/development.md\">Development</a> - Build options, testing, CI scripts</li>\n</ul>\n<h2>References</h2>\n<h3>Research</h3>\n<ul>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/gaoj0017/RaBitQ\">RaBitQ</a> - Binary quantization with theoretical error bounds (SIGMOD 2024)</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://dl.acm.org/doi/10.1145/3600006.3613166\">SPFresh</a> - LIRE protocol for incremental updates (SOSP 2023)</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.microsoft.com/en-us/research/wp-content/uploads/2021/11/SPANN_finalversion1.pdf\">SPANN</a> - Billion-scale ANN with boundary replication (NeurIPS 2021)</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://services.google.com/fh/files/misc/scann_for_alloydb_whitepaper.pdf\">ScaNN for AlloyDB</a> - Hierarchical clustering (Google)</li>\n</ul>\n<h3>Related Projects</h3>\n<ul>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/pgvector/pgvector\">pgvector</a> - Vector type and operators for PostgreSQL</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pgvectorscale\">pgvectorscale</a> - DiskANN-based vector index for PostgreSQL</li>\n</ul>\n<h2>License</h2>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/timescale/pg_vectorsearch/blob/main/LICENSE\">The PostgreSQL License</a></p>\n",
      "date_modified": "2026-10-14T11:47:53+00:00",
      "date_published": "2026-10-14T11:47:53+00:00",
      "external_url": "https://github.com/timescale/pg_vectorsearch",
      "id": "urn:aggr:item:8864bb793ae5c3a5d9d1849501b17c6c2c9a4c2d",
      "summary": "A PostgreSQL extension for high-performance approximate nearest neighbor (ANN) search. Status: alpha. Meant for testing, not production. Upgrading between prereleases may not be possible; plan to drop and recreate the extension and its…",
      "tags": [
        "news"
      ],
      "title": "Pg_vectorsearch: An index that is faster than pgvector's IVFFlat and HNSW",
      "url": "https://aggr.aymericbeaumet.com/items/hnrss-org/2026-10-14-pg-vectorsearch-an-index-that-is-faster-than-pgvector-s/"
    }
  ],
  "language": "en",
  "title": "github.com/timescale",
  "version": "https://jsonfeed.org/version/1.1"
}