<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Data Lab Tech TV</title>
    <description>The latest articles on DEV Community by Data Lab Tech TV (@datalabtechtv).</description>
    <link>https://dev.to/datalabtechtv</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3216967%2F2889d541-d0d9-4677-9415-8264496c9da4.webp</url>
      <title>DEV Community: Data Lab Tech TV</title>
      <link>https://dev.to/datalabtechtv</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/datalabtechtv"/>
    <language>en</language>
    <item>
      <title>My first project in Go was an S3-compatible object store with IAM</title>
      <dc:creator>Data Lab Tech TV</dc:creator>
      <pubDate>Fri, 27 Mar 2026 10:23:24 +0000</pubDate>
      <link>https://dev.to/datalabtechtv/my-first-project-in-go-was-an-s3-compatible-object-store-with-iam-1n8e</link>
      <guid>https://dev.to/datalabtechtv/my-first-project-in-go-was-an-s3-compatible-object-store-with-iam-1n8e</guid>
      <description>&lt;p&gt;A few months back, if you use self-hosted object stores, you know that MinIO essentially &lt;a href="https://github.com/minio/minio/issues/21647#issuecomment-3439134621" rel="noopener noreferrer"&gt;pulled the plug&lt;/a&gt; on their open source project. I was so disappointed and frustrated with this decision, that I decided to try and build my own. Since I have a YouTube channel, I thought this could be some interesting content as well, so I ended up making a series of six videos, where I share a few details about the development process and my journey with Go. I've been coding since 1999, and I am a pretty experienced Python dev (over a decade), but I hadn't used a lower level language in years. It was a great experience to get back to the root!&lt;/p&gt;

&lt;p&gt;If you're wondering if this was vibe coded, it was not. I used ChatGPT to learn a lot of concepts, since I was new to Go, but 99% is good old manual coding. Nothing against vibe coding, but it's just not what I do.&lt;/p&gt;

&lt;p&gt;I've since moved to cover other subjects in my channel, but it's likely I'll go back to LabStore in the future, after I complete the videos I've got planned next. Developing such a large project alone, in 2 week cycles, writing a blog post about it and recording a video on it, is not easy, so I was burning out, and had to switch gears a bit.&lt;/p&gt;

&lt;p&gt;Anyway, I'd like to share the videos, blog posts, and the GitHub repo, if you're interested in taking a look. This was a project of love!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=hwYFlcNJOCw&amp;amp;list=PLeKtvIdgbljNrxAATsvk216jNwt-jyxUe" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=hwYFlcNJOCw&amp;amp;list=PLeKtvIdgbljNrxAATsvk216jNwt-jyxUe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://datalabtechtv.com/tags/object-store/" rel="noopener noreferrer"&gt;https://datalabtechtv.com/tags/object-store/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/IllumiKnowLabs/labstore" rel="noopener noreferrer"&gt;https://github.com/IllumiKnowLabs/labstore&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can install it with &lt;code&gt;go&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/IllumiKnowLabs/labstore/cmd/labstore@v0.1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And also use the docker image to setup a server elsewhere:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 6789:6789 ghcr.io/illumiknowlabs/labstore:v0.1.0 serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>go</category>
      <category>objectstore</category>
      <category>s3</category>
      <category>iam</category>
    </item>
    <item>
      <title>Data Lakehouse with dbt and DuckLake</title>
      <dc:creator>Data Lab Tech TV</dc:creator>
      <pubDate>Thu, 26 Jun 2025 07:27:16 +0000</pubDate>
      <link>https://dev.to/datalabtechtv/data-lakehouse-with-dbt-and-ducklake-5egn</link>
      <guid>https://dev.to/datalabtechtv/data-lakehouse-with-dbt-and-ducklake-5egn</guid>
      <description>&lt;p&gt;Now that you can use &lt;a href="https://duckdb.org/" rel="noopener noreferrer"&gt;DuckDB&lt;/a&gt; to power your data lakehouse through &lt;a href="https://ducklake.select/" rel="noopener noreferrer"&gt;DuckLake&lt;/a&gt;, you'll also save space on snapshots due to the ability to reference parts of parquet files (yes, you can keep all old versions, with little impact to storage), and you'll get improved performance for small change operations due to data inlining, which lets data be stored directly within the metadata database (&lt;a href="https://www.sqlite.org/" rel="noopener noreferrer"&gt;SQLite&lt;/a&gt;, &lt;a href="https://www.postgresql.org/" rel="noopener noreferrer"&gt;PostgreSQL&lt;/a&gt;, etc.).&lt;/p&gt;

&lt;p&gt;With a little help from &lt;a href="https://docs.getdbt.com/" rel="noopener noreferrer"&gt;dbt&lt;/a&gt; and an &lt;a href="https://github.com/duckdb/dbt-duckdb/issues/564" rel="noopener noreferrer"&gt;unreleased branch&lt;/a&gt; of &lt;a href="https://github.com/duckdb/dbt-duckdb" rel="noopener noreferrer"&gt;dbt-duckdb&lt;/a&gt; adapter, I was able to design a data lakehouse strategy, covering data ingestion, transformation, and exporting, almost exclusively based on SQL, on top of DuckDB and the newly released DuckLake!&lt;/p&gt;

&lt;p&gt;The code is available as open source on GitHub, at &lt;a href="https://github.com/DataLabTechTV/datalab" rel="noopener noreferrer"&gt;DataLabTechTV/datalab&lt;/a&gt;, and the &lt;code&gt;README&lt;/code&gt; will cover most of the details you need to understand it and get it running. I wrote a &lt;a href="https://datalabtechtv.com/posts/data-lakehouse-dbt-ducklake/" rel="noopener noreferrer"&gt;blog post&lt;/a&gt; where I covered some of the most interesting components or issues, and provided a few comments about the whole process. You can also see data lab in action, and learn more about it, by watching the &lt;a href="https://youtu.be/zn69Q7FiFfo?si=WBwDJYKPQx-_zTIa" rel="noopener noreferrer"&gt;video&lt;/a&gt; that I just uploaded about it this week!&lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>duckdb</category>
      <category>ducklake</category>
      <category>dbt</category>
    </item>
    <item>
      <title>PostgreSQL Maximalism</title>
      <dc:creator>Data Lab Tech TV</dc:creator>
      <pubDate>Wed, 28 May 2025 07:56:52 +0000</pubDate>
      <link>https://dev.to/datalabtechtv/postgresql-maximalism-1mdd</link>
      <guid>https://dev.to/datalabtechtv/postgresql-maximalism-1mdd</guid>
      <description>&lt;p&gt;I'm working on a 4-part YouTube series about PostgreSQL extensions, and how to use Postgres for pretty much anything. If you're interested in learning a bit about this, I'll be releasing it over the next few weeks, so drop in at &lt;a href="https://www.youtube.com/@DataLabTechTV" rel="noopener noreferrer"&gt;@DataLabTechTV&lt;/a&gt;, for all things data! Part 1, introducing the use cases I'll be covering, is already up.&lt;/p&gt;

&lt;p&gt;You can read my unedited research notes, for the full series, at my &lt;a href="https://datalabtechtv.com/posts/postgresql-maximalism/" rel="noopener noreferrer"&gt;website&lt;/a&gt;, but I'll also reproduce it below. If you have questions, suggestions, or ideas, feel free to comment down below, or you can hit me up on any of my socials, listed on the website.&lt;/p&gt;

&lt;h2&gt;
  
  
  Research
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Document Store
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/docs/current/hstore.html" rel="noopener noreferrer"&gt;Built-In Key-Value Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/docs/16/functions-xml.html" rel="noopener noreferrer"&gt;Built-In XML Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.postgresql.org/docs/current/functions-json.html" rel="noopener noreferrer"&gt;Built-In JSON Support&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Native types and functions for writing and reading JSON data.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/supabase/pg_jsonschema" rel="noopener noreferrer"&gt;pg_jsonschema&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Adds JSON schema validation functions for robustness.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Column Store and Analytics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/Mooncake-Labs/pg_mooncake" rel="noopener noreferrer"&gt;pg_mooncake&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;"Postgres-Native Data Warehouse"&lt;/li&gt;
&lt;li&gt;Provides column stores in PostgreSQL (Iceberg, Delta Lake).&lt;/li&gt;
&lt;li&gt;Uses DuckDB to query.&lt;/li&gt;
&lt;li&gt;Unlike &lt;code&gt;pg_duckdb&lt;/code&gt; and &lt;code&gt;pg_analytics&lt;/code&gt;, &lt;code&gt;pg_mooncake&lt;/code&gt; can write out data to Iceberg or Delta Lake formats via transactional &lt;code&gt;INSERT&lt;/code&gt;/&lt;code&gt;UPDATE&lt;/code&gt;/&lt;code&gt;DELETE&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/duckdb/pg_duckdb" rel="noopener noreferrer"&gt;pg_duckdb&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Developed by &lt;a href="https://docs.hydra.so/overview" rel="noopener noreferrer"&gt;Hydra&lt;/a&gt; and &lt;a href="https://motherduck.com/docs/getting-started/" rel="noopener noreferrer"&gt;MotherDuck&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;MotherDuck integration.&lt;/li&gt;
&lt;li&gt;Maybe this will replace &lt;code&gt;pg_mooncake&lt;/code&gt; when DuckDB extends integration with Iceberg or Delta Lake.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/paradedb/pg_analytics" rel="noopener noreferrer"&gt;pg_analytics&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Part of &lt;a href="https://www.paradedb.com/" rel="noopener noreferrer"&gt;ParadeDB&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Based on &lt;a href="https://duckdb.org/docs/stable/" rel="noopener noreferrer"&gt;DuckDB&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Recently archived and deprecated in favor of &lt;code&gt;pg_search&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://www.paradedb.com/blog/introducing_lakehouse" rel="noopener noreferrer"&gt;pg_lakehouse&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Precursor to &lt;code&gt;pg_analytics.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Based on &lt;a href="https://datafusion.apache.org/" rel="noopener noreferrer"&gt;Apache DataFusion&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Used to be a part of the ParadeDB codebase.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/hydradatabase/columnar" rel="noopener noreferrer"&gt;columnar&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Developed by Hydra.&lt;/li&gt;
&lt;li&gt;Also used in &lt;code&gt;pg_timeseries&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Time Series Store and Real-Time
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/timescale/timescaledb" rel="noopener noreferrer"&gt;timescaledb&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;A solution by Timescale.&lt;/li&gt;
&lt;li&gt;Provides a lot more functions to handle time series than &lt;code&gt;pg_timeseries&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Low latency makes it adequate for real-time analytics.&lt;/li&gt;
&lt;li&gt;Supports incremental views through &lt;a href="https://docs.timescale.com/use-timescale/latest/continuous-aggregates/" rel="noopener noreferrer"&gt;continuous aggregates&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Has some overlap with &lt;code&gt;pg_mooncake&lt;/code&gt;, but can't write to Iceberg or Delta Lake, using them directly as the storage layer.&lt;/li&gt;
&lt;li&gt;Supports &lt;a href="https://docs.timescale.com/use-timescale/latest/data-tiering/" rel="noopener noreferrer"&gt;tiered storage&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/tembo-io/pg_timeseries" rel="noopener noreferrer"&gt;pg_timeseries&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;A solution by Tembo.&lt;/li&gt;
&lt;li&gt;"The Timescale License would restrict our use of features such as compression, incremental materialized views, and bottomless storage."&lt;/li&gt;
&lt;li&gt;Supports &lt;a href="https://tembo.io/docs/product/stacks/analytical/timeseries#using-incremental-views" rel="noopener noreferrer"&gt;incremental materialized views&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Vector Store
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/pgvector/pgvector" rel="noopener noreferrer"&gt;pgvector&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Vector database.&lt;/li&gt;
&lt;li&gt;Approximate indexing

&lt;ul&gt;
&lt;li&gt;HNSW: &lt;a href="https://en.wikipedia.org/wiki/Hierarchical_navigable_small_world" rel="noopener noreferrer"&gt;Hierarchical Navigable Small World&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;IVFFlat: Inverted File Flat&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Supported by GCP Cloud SQL and AWS RDS.&lt;/li&gt;

&lt;li&gt;How does it compare to &lt;code&gt;pg_search&lt;/code&gt;?&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/timescale/pgvectorscale/" rel="noopener noreferrer"&gt;pgvectorscale&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;A solution by Timescale.&lt;/li&gt;
&lt;li&gt;Learns from Microsoft's &lt;a href="https://github.com/microsoft/DiskANN" rel="noopener noreferrer"&gt;DiskANN&lt;/a&gt;:

&lt;ul&gt;
&lt;li&gt;"Graph-structured Indices for Scalable, Fast, Fresh and Filtered Approximate Nearest Neighbor Search"&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Efficiency layer over &lt;code&gt;pgvector&lt;/code&gt; via:

&lt;ul&gt;
&lt;li&gt;StreamingDiskANN indexing approach&lt;/li&gt;
&lt;li&gt;Statistical Binary Quantization&lt;/li&gt;
&lt;li&gt;Label-based filtered vector search&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Artificial Intelligence
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/timescale/pgai" rel="noopener noreferrer"&gt;pgai&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;A solution by Timescale.&lt;/li&gt;
&lt;li&gt;"A suite of tools to develop RAG, semantic search, and other AI applications"&lt;/li&gt;
&lt;li&gt;Takes advantage of &lt;code&gt;pgvectorscale&lt;/code&gt; for improved performance.&lt;/li&gt;
&lt;li&gt;Features

&lt;ul&gt;
&lt;li&gt;Loading datasets from Hugging Face.&lt;/li&gt;
&lt;li&gt;Computing vector embeddings.&lt;/li&gt;
&lt;li&gt;Chunking text.&lt;/li&gt;
&lt;li&gt;Semantic search or RAG via OpenAI, Ollama, or Cohere.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/tembo-io/pg_vectorize" rel="noopener noreferrer"&gt;pg_vectorize&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;A solution by Tembo (powers their VectorDB stack).&lt;/li&gt;
&lt;li&gt;Similar to &lt;code&gt;pgai&lt;/code&gt;, supporting RAG and semantic search, but relies directly on &lt;code&gt;pgvector&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Supports Hugging Face's Sentence-Transformers as well as OpenAI's embeddings.&lt;/li&gt;
&lt;li&gt;Supports direct interaction with LLMs.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/neondatabase-labs/pgrag" rel="noopener noreferrer"&gt;pgrag&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Rust-based, experimental solution by Neon.&lt;/li&gt;
&lt;li&gt;Complete pipeline support from text extraction (PDF, DOCX) to chat completion based on ChatGPT's API.&lt;/li&gt;
&lt;li&gt;Support for &lt;a href="https://huggingface.co/BAAI/bge-small-en-v1.5" rel="noopener noreferrer"&gt;bge-small-en-v1.5&lt;/a&gt; or OpenAI's embeddings.&lt;/li&gt;
&lt;li&gt;Distance computation and ranking based on &lt;code&gt;pgvector&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Reranking based on &lt;a href="https://huggingface.co/jinaai/jina-reranker-v1-tiny-en" rel="noopener noreferrer"&gt;jina-reranker-v1-tiny-en&lt;/a&gt; also available.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Full-Text Search
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.postgresql.org/docs/16/functions-textsearch.html" rel="noopener noreferrer"&gt;Built-In Full-Text Search Support&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Generalized Inverted Index (GIN).&lt;/li&gt;
&lt;li&gt; &lt;code&gt;tsvector&lt;/code&gt; and &lt;code&gt;tsquery&lt;/code&gt; data types.&lt;/li&gt;
&lt;li&gt;Text preprocessing pipeline configurations usable by &lt;code&gt;to_tsvector&lt;/code&gt; and &lt;code&gt;to_tsquery&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;english&lt;/code&gt; configuration runs the following operations:

&lt;ul&gt;
&lt;li&gt;Tokenize text by spaces and punctuation;&lt;/li&gt;
&lt;li&gt;Convert to lower case;&lt;/li&gt;
&lt;li&gt;Remove stop words;&lt;/li&gt;
&lt;li&gt;Apply Porter stemmer.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Example ranking/scoring functions  &lt;code&gt;ts_rank&lt;/code&gt; and &lt;code&gt;ts_rank_cd&lt;/code&gt;.&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/paradedb/paradedb" rel="noopener noreferrer"&gt;ParadeDB&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Search and Analytics.

&lt;ul&gt;
&lt;li&gt;Search

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pg_search&lt;/code&gt; (ParadeDB's rust-based version)

&lt;ul&gt;
&lt;li&gt;Previously named &lt;code&gt;pg_bm25&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;This is huge and it takes a long long time to compile!&lt;/li&gt;
&lt;li&gt;Adds a ton of Lucene-like features, based on &lt;a href="https://github.com/quickwit-oss/tantivy" rel="noopener noreferrer"&gt;&lt;/a&gt;, a Rust-based Lucene alternative.&lt;/li&gt;
&lt;li&gt;Still doesn't provide a text-based query parser.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Analytics

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pg_analytics&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;This has been deprecated, due to refocus on &lt;code&gt;pg_search&lt;/code&gt;, even for analytics.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Part of &lt;a href="https://www.paradedb.com/" rel="noopener noreferrer"&gt;ParadeDB&lt;/a&gt;.&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://www.postgresql.org/docs/current/pgtrgm.html" rel="noopener noreferrer"&gt;pg_trgm&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Built-in extension.&lt;/li&gt;
&lt;li&gt;Character-based trigrams.&lt;/li&gt;
&lt;li&gt;Useful for fuzzy search based on string similarity (e.g., product name matching).&lt;/li&gt;
&lt;li&gt;Can be optimized via GIN and GiST indexes.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://www.postgresql.org/docs/current/fuzzystrmatch.html" rel="noopener noreferrer"&gt;pg_fuzzystrmatch&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Built-in extension.&lt;/li&gt;
&lt;li&gt;Provides functions to match and measure similar-sounding strings.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/eulerto/pg_similarity" rel="noopener noreferrer"&gt;pg_similarity&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Text similarity functions.&lt;/li&gt;
&lt;li&gt;Supported by GCP Cloud SQL and AWS RDS.&lt;/li&gt;
&lt;li&gt;Last commit over 5 years ago.&lt;/li&gt;
&lt;li&gt;Has forks to fix compilation with the latest versions of PostgreSQL.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Graph Store
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.pgrouting.org/latest/en/index.html" rel="noopener noreferrer"&gt;pgrouting&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Extension of PostGIS&lt;/li&gt;
&lt;li&gt;Graph algorithms&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/skaiworldwide-oss/agensgraph" rel="noopener noreferrer"&gt;AgensGraph&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL fork, not an extension.&lt;/li&gt;
&lt;li&gt;If it doesn't integrate, why use this instead of a more specialized graph database, like Neo4j?&lt;/li&gt;
&lt;li&gt;Architecture diagram shows that it has its own separate graph storage layer.&lt;/li&gt;
&lt;li&gt;Query language

&lt;ul&gt;
&lt;li&gt;SQL (ANSI)&lt;/li&gt;
&lt;li&gt;Cypher (&lt;a href="https://opencypher.org/" rel="noopener noreferrer"&gt;openCypher&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/skaiworldwide-oss/AgensGraphViewer" rel="noopener noreferrer"&gt;Visualization&lt;/a&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/apache/age" rel="noopener noreferrer"&gt;age&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Extension inspired by AgensGraph.&lt;/li&gt;
&lt;li&gt;Query language

&lt;ul&gt;
&lt;li&gt;ANSI SQL&lt;/li&gt;
&lt;li&gt;Cypher (&lt;a href="https://opencypher.org/" rel="noopener noreferrer"&gt;openCypher&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;No Gremlin support (&lt;a href="https://github.com/apache/age/issues/431" rel="noopener noreferrer"&gt;yet&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/apache/age-viewer" rel="noopener noreferrer"&gt;Visualization&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;No graph algorithms.&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/raitraidma/pggraph" rel="noopener noreferrer"&gt;pggraph&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;SQL implementations of Dijkstra and Kruskal.&lt;/li&gt;
&lt;li&gt;DOA (Dead On Arrival), this has been abandoned for 9 years.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Message Queue
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/tembo-io/pgmq" rel="noopener noreferrer"&gt;pgmq&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;A solution by Tembo.&lt;/li&gt;
&lt;li&gt;Type: extension.&lt;/li&gt;
&lt;li&gt;Official libraries for Rust and Python.&lt;/li&gt;
&lt;li&gt;Community libraries for Dart, Go, Elixir, Java, Kotlin, JavaScript, TypeScript, .NET.&lt;/li&gt;
&lt;li&gt;Actively maintained.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/pgq/pgq" rel="noopener noreferrer"&gt;pgq&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;A solution by Skype and a part of SkyTools.&lt;/li&gt;
&lt;li&gt;Type: extension.&lt;/li&gt;
&lt;li&gt;Official library for Python (last released for Python 3.8).&lt;/li&gt;
&lt;li&gt;Still maintained, but no meaningful changes over the last two years.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pgq.github.io/extension/pgq/files/external-sql.html" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/rpdelaney/pg-message-queue" rel="noopener noreferrer"&gt;pg_message_queue&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Type: extension.&lt;/li&gt;
&lt;li&gt;Abandoned for over 8 years.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://pgqueuer.readthedocs.io/" rel="noopener noreferrer"&gt;pgqueuer&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Type: Python library.&lt;/li&gt;
&lt;li&gt;Needs to be setup via &lt;code&gt;pgq install&lt;/code&gt;, which creates required tables and indexes.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/timgit/pg-boss" rel="noopener noreferrer"&gt;pg-boss&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Type: JavaScript library.&lt;/li&gt;
&lt;li&gt;Setup is done in-code, by creating the queue.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/QueueClassic/queue_classic" rel="noopener noreferrer"&gt;queue_classic&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Type: Ruby library.&lt;/li&gt;
&lt;li&gt;Postgres connection is setup via an environment variable.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Description
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Documents
&lt;/h3&gt;

&lt;p&gt;Document formats, like JSON, XML, or YAML, model hierarchical data that follow a tree-like structure.&lt;/p&gt;

&lt;p&gt;This kind of data is frequently stored in document databases like MongoDB (BSON), or simply using a key-value store, like RocksDB, where the value can only be deserialized and used in-code.&lt;/p&gt;

&lt;p&gt;Postgres natively supports JSON via its &lt;code&gt;json&lt;/code&gt; and &lt;code&gt;jsonb&lt;/code&gt; data types, as well as XML via its &lt;code&gt;xml&lt;/code&gt; data type. It also supports key-value storage via the &lt;code&gt;hstore&lt;/code&gt; extension, which is available by default. While the &lt;code&gt;xml&lt;/code&gt; data type supports XML validation via the &lt;code&gt;xmlschema_valid&lt;/code&gt; function, for JSON there is an extension called &lt;code&gt;pg_jsonschema&lt;/code&gt; that adds support for validation based on a JSON Schema.&lt;/p&gt;

&lt;h3&gt;
  
  
  Analytics and Time Series
&lt;/h3&gt;

&lt;p&gt;Transactional and analytics operations have different requirements. By default, Postgres is row-oriented, which is ideal for transactions (e.g., updating a user profile), but for analytics it's usually more efficient to rely on column-oriented storage (e.g., averaging movie ratings, per age group). In this context, partitioning data is often a requirement as well, as to reduce complexity thus increasing performance.&lt;/p&gt;

&lt;p&gt;On the data engineering community, formats like Apache Iceberg or Delta Lake, which add a metadata layer on top of Apache Parquet, are becoming a requirement for data lakehouse architectures. This layer tracks snapshots (data versioning), schema structure, partition information, and parquet file locations.&lt;/p&gt;

&lt;p&gt;Another trend in the DE community is DuckDB, an in-process column-oriented database.  Built for analytics, DuckDB is able to support medium scale data science tasks on a single laptop, and that's why we love it! Think of it as a counterpart to SQLite, which is a well-liked row-oriented in-process database.&lt;/p&gt;

&lt;p&gt;Column-oriented and analytics has been brought to Postgres via extensions like &lt;code&gt;pg_mooncake&lt;/code&gt;, &lt;code&gt;pg_duckdb&lt;/code&gt;, or &lt;code&gt;pg_analytics&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;There are also time series specific extensions that support real time and analytics by providing additional features, like incremental views, or functions like &lt;code&gt;time_bucket_gapfill&lt;/code&gt; (add missing dates), or &lt;code&gt;locf&lt;/code&gt; and &lt;code&gt;interpolate&lt;/code&gt; to fill-in missing values.&lt;/p&gt;

&lt;p&gt;Time series specific extensions include the well-known &lt;code&gt;timeseriesdb&lt;/code&gt;, or the more recent &lt;code&gt;pg_timeseries&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vectors and AI
&lt;/h3&gt;

&lt;p&gt;One of the fundamental requirements of vector stores is that they provide efficient vector similarity calculations. This is usually achieved through specialized indexing that supports approximated similarity computations.&lt;/p&gt;

&lt;p&gt;Extensions like the well-known &lt;code&gt;pgvector&lt;/code&gt;, or its complement &lt;code&gt;pgvectorscale&lt;/code&gt;, both support querying nearest-neighbors, on &lt;code&gt;pgvector&lt;/code&gt; via HNSW and IVFFlat indexes, and on &lt;code&gt;pgvectorscale&lt;/code&gt; via a StreamDiskANN index. Nearest-neighbors can be computed based on multiple distance functions, such as Euclidean/L2, cosine, or Jaccard.&lt;/p&gt;

&lt;p&gt;Regardless of whether AI operations belongs in the database, extensions to facilitate text embedding and LLM integration still exist, integrating with &lt;code&gt;pgvector&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;AI extensions include &lt;code&gt;pgai&lt;/code&gt; and &lt;code&gt;pg_vectorize&lt;/code&gt;, both supporting direct LLM querying, text embedding, and RAG and similarity search. In both extensions, text embedding is made possible either based on Hugging Face models, by querying OpenAI's embedding API, or via Ollama's API, which also powers the direct access to LLMs and RAG features. There is also &lt;code&gt;pgrag&lt;/code&gt;, a more recent, experimental extension focused on delivering a complete pipeline for RAG, being the only one that supports text extraction from PDF or DOCX files, as well as a specialized reranking model to help improve the outcome before generating the text completion.&lt;/p&gt;

&lt;p&gt;All this is made possible by accessing Python APIs under the hood, via PL/Python. While these features can be convenient at times, I tend to think that they do not belong in the database, but rather on its own Python codebase. The database should be exclusively concerned with storage and retrieval, so, unless there are performance reasons that justify integrating complex data processing features with the database, I believe this should be avoided. An example of this is &lt;code&gt;pgvector&lt;/code&gt; and &lt;code&gt;pgvectorscale&lt;/code&gt;, where indexing approaches were required to efficiently solve the vector distance computations — and indexing belongs in the database.&lt;/p&gt;

&lt;h3&gt;
  
  
  Search
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Built-In
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Full-Text Search
&lt;/h5&gt;

&lt;p&gt;PostgreSQL provides basic full-text search features out-of-the-box with its Generalized Inverted Index (GIN), &lt;code&gt;tsvector&lt;/code&gt; and &lt;code&gt;tsquery&lt;/code&gt; data types, and corresponding functions and operators (e.g., &lt;code&gt;@@&lt;/code&gt; for matching a &lt;code&gt;tsvector&lt;/code&gt; with a &lt;code&gt;tsquery&lt;/code&gt;, or &lt;code&gt;||&lt;/code&gt; for concatenating &lt;code&gt;tsvector&lt;/code&gt;), supporting negation (&lt;code&gt;!!&lt;/code&gt;), conjunction (&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;), disjunction (&lt;code&gt;||&lt;/code&gt;), and phrase queries (&lt;code&gt;&amp;lt;-&amp;gt;&lt;/code&gt;). Documents and queries can be parsed using &lt;code&gt;to_tsvector&lt;/code&gt; or &lt;code&gt;to_tsquery&lt;/code&gt;, which default to the &lt;code&gt;english&lt;/code&gt; configuration — tokenizes text by spaces and punctuation, normalizes to lower case, removes stop words, and applies Porter stemmer.&lt;/p&gt;

&lt;p&gt;Since PostgreSQL 11, there is the &lt;code&gt;websearch_to_tsquery&lt;/code&gt; function, which gives us the ability to parse keyword queries directly, like we do on Google or with Apache Lucene, however there are differences.&lt;/p&gt;

&lt;p&gt;For example, parsing the following keyword query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"data science" "state of the art" algorithms models
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Would result in the PostgreSQL equivalent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="s1"&gt;'data'&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'scienc'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="s1"&gt;'state'&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'art'&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="s1"&gt;'algorithm'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="s1"&gt;'model'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which is essentially a conjunction (AND) of the two phrases and the two terms, along with stemming and stop word handling.&lt;/p&gt;

&lt;p&gt;However, search engines commonly default to disjunction (OR). Since results are often ranked, search engines just push results with a less and less matched tokens to the end of the results list.&lt;/p&gt;

&lt;p&gt;We can rank the matched documents, either by using &lt;code&gt;ts_rank&lt;/code&gt;, which is based on term frequency and proximity, or by using &lt;code&gt;ts_rank_cd&lt;/code&gt;, which factors in cover density ranking (i.e., query term distance in the document). However, in order to retrieve documents that only partially match the query, we'd need to manually parse the query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;phraseto_tsquery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'data science'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;phraseto_tsquery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'state of the art'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;to_tsquery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'algorithm | model'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which is query-dependent and require us to build a query parser to handle this outside of SQL. If we do that, we can rank our documents by creating the GIN index:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_doc_fulltext&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;
&lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;GIN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to_tsvector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'english'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And using the following query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="k"&gt;search&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt;
        &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;to_tsvector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'english'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;phraseto_tsquery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'data science'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;phraseto_tsquery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'state of the art'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;to_tsquery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'algorithm | model'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt;
        &lt;span class="n"&gt;doc&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;ts_rank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="k"&gt;search&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;@@&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that Postgres uses the designation "rank" to refer to the score. For example, in the docs, when describing the weights for &lt;code&gt;to_tsrank&lt;/code&gt;, they use phrases like "2 divides the rank by the document length", where "rank" is really the returned score (no ranks are returned by &lt;code&gt;ts_rank&lt;/code&gt; or &lt;code&gt;ts_rank_cd&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Also note that these functions do not return the raw score, so the following won't be equivalent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;ts_rank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ts_rank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="k"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Fuzzy String Matching
&lt;/h5&gt;

&lt;p&gt;By default, Postgres also provides two extensions called &lt;code&gt;pg_trgm&lt;/code&gt; and &lt;code&gt;fuzzystrmatch&lt;/code&gt;. The first uses character-based trigrams to provide fuzzy string matching and compute string similarity. The second provides functions to match and measure similar-sounding strings.&lt;/p&gt;

&lt;h4&gt;
  
  
  Extensions
&lt;/h4&gt;

&lt;p&gt;There are other third-party extensions to compute string similarity, like &lt;code&gt;pg_similarity&lt;/code&gt;, which provides several distance functions like L1/Manhattan, L2/Euclidean or Levenshtein, and other less commonly used methods like Monge-Elkan, Needleman-Wunsch or Smith-Waterman-Gotoh. While frequently offered in cloud services, including GCP and AWS, this extension appears to be unmaintained and incompatible with the latest versions of Postgres (forks exist to make it compilable).&lt;/p&gt;

&lt;p&gt;Finally, there is a fairly large and mature project, called ParadeDB, which provides a &lt;code&gt;pg_search&lt;/code&gt; extension. Since the built-in support for full-text search on Postgres only provides two example ranking functions, the &lt;code&gt;pg_search&lt;/code&gt; extension, initially called &lt;code&gt;pg_bm25&lt;/code&gt;, was created to bring the BM25 ranking function to Postgres. It has since matured quite a lot, providing innumerous features supported by a new &lt;code&gt;bm25&lt;/code&gt; index. This index provides configurable segment sizes, as well as a separate text preprocessing configuration that can be set per field during indexing. A new operator &lt;code&gt;@@@&lt;/code&gt; is also introduced for matching, and field-based queries and boosting are supported. Several useful functions are provided to for checking term existence, fuzzy matching, range filtering, set matching, or phrase matching. JSON can also be indexed and queried, and "more like this" queries are also supported. Similarity search is supported via the &lt;code&gt;pgvector&lt;/code&gt; extension.&lt;/p&gt;

&lt;h3&gt;
  
  
  Graphs
&lt;/h3&gt;

&lt;p&gt;This category is where Postgres does not shine. While graph storage can be done directly by creating a table for nodes and for relationships, this does not scale for real-world graph querying, particularly for demanding graph algorithms. A graph database usually relies on index-free adjacency to ensure efficiency, which is not supported by Postgres. The alternative is to index the ID columns of the relationships table, which means that complex graph queries, that require long walks or traversals, will need to query an index for each step it takes, without considering caching. For large graphs, this is highly inefficient. As far as I know, there is no Postgres extension that solves this problem at this moment.&lt;/p&gt;

&lt;p&gt;Alternatives for graph storage include AgensGraph, which is a Postgres fork rather than an extension, as well as Apache AGE (A Graph Extension), which was inspired by AgensGraph. Both support ANSI SQL as well as openCypher for querying, with AGE having an &lt;a href="https://github.com/apache/age/issues/431" rel="noopener noreferrer"&gt;open issue&lt;/a&gt; on GitHub to implement Apache Gremlin support as well. AgensGraph has limited support for graph algorithms, while AGE has none at all, rather providing user defined functions. An project called &lt;code&gt;pggraph&lt;/code&gt; implemented the Dijkstra and Kruskal graph algorithms using pure SQL, but has since been abandoned — it didn't provide any specialized storage, but rather just functions to apply to your own relationships table via a SQL query parameter.&lt;/p&gt;

&lt;p&gt;Finally, perhaps the most interesting extension we can use for graph algorithms is &lt;code&gt;pgrouting&lt;/code&gt;, which is built on top of &lt;code&gt;postgis&lt;/code&gt;, as it is designed to add network analysis support for geospatial routing. While this still does not provide a custom storage layer for graphs, with index-free adjacency, it does provide a wide range of graph algorithms.&lt;/p&gt;

&lt;h3&gt;
  
  
  Message Queues
&lt;/h3&gt;

&lt;p&gt;Message queueing software implements the producer-consumer pattern (one-to-one) and usually supports the publish-subscribe pattern as well (one-to-many / topics / events). Well-known software in this category includes Redis, ZeroMQ, RabbitMQ, or Apache Kafka, all of which provide interface libraries for several different languages — this is a requirement for message-oriented middleware, as different components are often written in different languages.&lt;/p&gt;

&lt;p&gt;While any of the previous options are likely more efficient than a Postgres-based implementation, for simple use cases there are a few extensions and libraries that implement message queues on top of Postgres. There is &lt;code&gt;pgmq&lt;/code&gt;, from Tembo, the same authors of &lt;code&gt;pg_timeseries&lt;/code&gt; and &lt;code&gt;pg_vectorize&lt;/code&gt;. This integrates with over 10 languages via official (Rust and Python) and community libraries, providing a &lt;code&gt;create&lt;/code&gt; queue function, as well as &lt;code&gt;send&lt;/code&gt; and &lt;code&gt;read&lt;/code&gt; functions, alongside other utilities, to support the producer-consumer pattern. For the publish-subscribe pattern, we only found the &lt;code&gt;pgq&lt;/code&gt; extension from Skype, which similarly provides a &lt;code&gt;create_queue&lt;/code&gt; function, as well as &lt;code&gt;insert_event&lt;/code&gt;,  &lt;code&gt;register_consumer&lt;/code&gt; and &lt;code&gt;get_batch_events&lt;/code&gt; functions.&lt;/p&gt;

&lt;p&gt;All other extensions and libraries we found only implement the producer-consumer pattern. There is &lt;code&gt;pg_message_queue&lt;/code&gt; which is an extension that  provides functions &lt;code&gt;pg_mq_create_queue&lt;/code&gt;, &lt;code&gt;pg_mq_send_message&lt;/code&gt;, and &lt;code&gt;pg_mq_get_msg_bin&lt;/code&gt; (bytes) or &lt;code&gt;pg_mq_get_msg_text&lt;/code&gt; (plain text) — it also supports &lt;code&gt;LISTEN&lt;/code&gt; for asynchronous notifications. There are also libraries supported on Postgres to help handle job queues: &lt;code&gt;pgqueuer&lt;/code&gt; for Python, &lt;code&gt;pg-boss&lt;/code&gt; for JavaScript, and &lt;code&gt;queue_classic&lt;/code&gt;, &lt;code&gt;que&lt;/code&gt;, &lt;code&gt;good_job&lt;/code&gt; or &lt;code&gt;delayed_job&lt;/code&gt; for Ruby.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparison
&lt;/h2&gt;

&lt;p&gt;PGDG - PostgreSQL Global Development Group&lt;/p&gt;

&lt;h3&gt;
  
  
  Documents
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Alternatives to:&lt;/strong&gt; &lt;a href="https://rocksdb.org/" rel="noopener noreferrer"&gt;RocksDB&lt;/a&gt;, &lt;a href="https://exist-db.org/exist/apps/homepage/index.html" rel="noopener noreferrer"&gt;eXist-db&lt;/a&gt;, &lt;a href="https://www.mongodb.com/" rel="noopener noreferrer"&gt;MongoDB&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;Author&lt;/th&gt;
&lt;th&gt;Created&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.postgresql.org/docs/16/hstore.html" rel="noopener noreferrer"&gt;hstore&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;PGDG&lt;/td&gt;
&lt;td&gt;2008&lt;/td&gt;
&lt;td&gt;Bundled key-value type and functions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.postgresql.org/docs/16/functions-xml.html" rel="noopener noreferrer"&gt;xml&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;PGDG&lt;/td&gt;
&lt;td&gt;2008&lt;/td&gt;
&lt;td&gt;Native XML type and functions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🟢&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.postgresql.org/docs/16/functions-json.html" rel="noopener noreferrer"&gt;json / jsonb&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;PGDG&lt;/td&gt;
&lt;td&gt;2012 / 2014&lt;/td&gt;
&lt;td&gt;Native JSON types and functions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🟢&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/supabase/pg_jsonschema/" rel="noopener noreferrer"&gt;pg_jsonschema&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Supabase&lt;/td&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;JSON schema validation.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Analytics and Time Series
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Alternatives to:&lt;/strong&gt; &lt;a href="https://duckdb.org/" rel="noopener noreferrer"&gt;DuckDB&lt;/a&gt;, &lt;a href="https://cassandra.apache.org/" rel="noopener noreferrer"&gt;Apache Cassandra&lt;/a&gt;, &lt;a href="https://aws.amazon.com/redshift/" rel="noopener noreferrer"&gt;Amazon RedShift&lt;/a&gt;, &lt;a href="https://cloud.google.com/bigquery" rel="noopener noreferrer"&gt;Google BigQuery&lt;/a&gt;, &lt;a href="https://www.snowflake.com/" rel="noopener noreferrer"&gt;Snowflake&lt;/a&gt;, &lt;a href="https://www.influxdata.com/" rel="noopener noreferrer"&gt;InfluxDB&lt;/a&gt;, &lt;a href="https://prometheus.io/" rel="noopener noreferrer"&gt;Prometheus&lt;/a&gt;, &lt;a href="https://aws.amazon.com/timestream/" rel="noopener noreferrer"&gt;Amazon Timestream&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;Author&lt;/th&gt;
&lt;th&gt;Created&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🟢&lt;/td&gt;
&lt;td&gt;&lt;a href="https://pgmooncake.com/docs/quick-start" rel="noopener noreferrer"&gt;pg_mooncake&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Mooncake Labs&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;Column store based on Iceberg or Delta Lake, that transparently uses DuckDB vectorization for analytics queries, but also lets us extract Iceberg or Delta Lake for processing externally (e.g., using &lt;code&gt;polars&lt;/code&gt; or &lt;code&gt;duckdb&lt;/code&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/duckdb/pg_duckdb/tree/main/docs" rel="noopener noreferrer"&gt;pg_duckdb&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Hydra &amp;amp; MotherDuck&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;Official extension for DuckDB that integrates with MotherDuck and cloud storage (e.g., AWS S3, Google GCS).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/paradedb/pg_analytics/" rel="noopener noreferrer"&gt;pg_analytics&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;ParadeDB&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;Similar to &lt;code&gt;pg_duckdb&lt;/code&gt;. Added support for DuckDB as part of ParadeDB, but it was discontinued in favor of integrating analytics directly into &lt;code&gt;pg_search&lt;/code&gt; instead.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.paradedb.com/blog/introducing_lakehouse" rel="noopener noreferrer"&gt;pg_lakehouse&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;ParadeDB&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;Added support for Apache DataFusion to ParadeDB, but it was deprecated in favor of &lt;code&gt;pg_analytics&lt;/code&gt; and a DuckDB backend.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🟡&lt;/td&gt;
&lt;td&gt;&lt;a href="https://columnar.docs.hydra.so/" rel="noopener noreferrer"&gt;columnar&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Hydra&lt;/td&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;Columnar storage engine at the core of Hydra, a data warehouse replacement built on top of PostgreSQL.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🟢&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.timescale.com/" rel="noopener noreferrer"&gt;timescaledb&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Timescale&lt;/td&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;Well-known time series storage solution based on the hypertable, a temporally partitioned table. Adequate for real-time solutions due to its low latency and incremental materialized views. Provides a wide range of useful analytics functions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;&lt;a href="https://tembo.io/docs/product/stacks/analytical/timeseries" rel="noopener noreferrer"&gt;pg_timeseries&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Tembo&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;Similar to &lt;code&gt;timescaledb&lt;/code&gt;, but extremely lacking in analytics functions. Built to compete with the limiting Timescale License.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Vectors and AI
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Alternatives to:&lt;/strong&gt; &lt;a href="https://www.pinecone.io/" rel="noopener noreferrer"&gt;Pinecone&lt;/a&gt;, &lt;a href="https://weaviate.io/" rel="noopener noreferrer"&gt;Weaviate&lt;/a&gt;, &lt;a href="https://milvus.io/" rel="noopener noreferrer"&gt;Milvus&lt;/a&gt;, &lt;a href="https://azure.microsoft.com/en-us/products/ai-services/ai-search" rel="noopener noreferrer"&gt;Azure AI Search&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;Author&lt;/th&gt;
&lt;th&gt;Created&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🟢&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/pgvector/pgvector/blob/master/README.md" rel="noopener noreferrer"&gt;pgvector&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Andrew Kane et al.&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;Provides a &lt;code&gt;vector&lt;/code&gt; type, as well as several similarity functions that power kNN. Efficiency is reached by implementing the &lt;a href="https://en.wikipedia.org/wiki/Hierarchical_navigable_small_world" rel="noopener noreferrer"&gt;HNSW&lt;/a&gt; and &lt;a href="https://docs.oracle.com/en/database/oracle/oracle-database/23/vecse/understand-inverted-file-flat-vector-indexes.html" rel="noopener noreferrer"&gt;IVFFlat&lt;/a&gt; approximate indexing strategies.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/timescale/pgvectorscale/" rel="noopener noreferrer"&gt;pg_vectorscale&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Timescale&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;Extends &lt;code&gt;pgvector&lt;/code&gt; with the StreamingDiskANN index (inspired by Microsoft's DiskANN), and adds Statistical Binary Quantization for compression, and label-based filtered vector search for vector operations with added filtering over categories.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🟢&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.timescale.com/ai/latest/" rel="noopener noreferrer"&gt;pgai&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Timescale&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;Relies on &lt;code&gt;pg_vectorscale&lt;/code&gt; to provide semantic search, RAG via OpenAI, Ollama or Cohere, text chunking, computing text embeddings, or loading Hugging Face datasets.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;&lt;a href="https://tembo.io/pg_vectorize/" rel="noopener noreferrer"&gt;pg_vectorize&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Tembo&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;Similar to &lt;code&gt;pgai&lt;/code&gt;, but relies directly on &lt;code&gt;pgvector&lt;/code&gt; to provide semantic search, and RAG via Hugging Face's Sentence-Transformers, OpenAI's embeddings or Ollama. It also supports direct interactions with LLMs.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/neondatabase-labs/pgrag" rel="noopener noreferrer"&gt;pgrag&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Neon&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;Focused on providing a complete RAG pipeline, provides text extraction from PDF or DOCX, as well as support for reranking via &lt;a href="https://huggingface.co/jinaai/jina-reranker-v1-tiny-en" rel="noopener noreferrer"&gt;jinaai/jina-reranker-v1-tiny-en&lt;/a&gt;. Embeddings are either based on &lt;a href="https://huggingface.co/BAAI/bge-small-en-v1.5" rel="noopener noreferrer"&gt;BAAI/bge-small-en-v1.5&lt;/a&gt; or OpenAI, and it only supports ChatGPT for generation.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Search
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Alternatives to:&lt;/strong&gt; &lt;a href="https://www.elastic.co/elasticsearch" rel="noopener noreferrer"&gt;Elasticsearch&lt;/a&gt;, &lt;a href="https://solr.apache.org/" rel="noopener noreferrer"&gt;Apache Solr&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;Author&lt;/th&gt;
&lt;th&gt;Created&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🟢&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.postgresql.org/docs/16/functions-textsearch.html" rel="noopener noreferrer"&gt;tsvector / tsquery&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;PGDG&lt;/td&gt;
&lt;td&gt;2008&lt;/td&gt;
&lt;td&gt;Native text preprocessing, document/query vector representation and matching, basic ranking functions, and GIN index to support efficient full-text search.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🟢&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.paradedb.com/documentation/overview" rel="noopener noreferrer"&gt;pg_search&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;ParadeDB&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;Historically introduced as &lt;code&gt;pg_bm25&lt;/code&gt;, as it focused on bringing BM25 into Postgres, it now also provides several Lucene-like features, supported on &lt;a href="https://github.com/quickwit-oss/tantivy" rel="noopener noreferrer"&gt;Tantivy&lt;/a&gt;, a Rust-based Lucene alternative. It also provides its own &lt;code&gt;bm25&lt;/code&gt; index with several text preprocessing settings (e.g. support for n-grams). It supports field-based and range queries, as well as set filtering, and boosting.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🟢&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.postgresql.org/docs/current/pgtrgm.html" rel="noopener noreferrer"&gt;pg_trgm&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;PGDG&lt;/td&gt;
&lt;td&gt;2011&lt;/td&gt;
&lt;td&gt;Bundled character-based trigram matching, useful for string similarity and autocompletion.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.postgresql.org/docs/16/fuzzystrmatch.html" rel="noopener noreferrer"&gt;fuzzystrmatch&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;PGDG&lt;/td&gt;
&lt;td&gt;2005&lt;/td&gt;
&lt;td&gt;Bundled string similarity functions, with support for matching similar-sounding names via Daitch-Mokotoff Soundex.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/eulerto/pg_similarity" rel="noopener noreferrer"&gt;pg_similarity&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Euler Taveira et al.&lt;/td&gt;
&lt;td&gt;2011&lt;/td&gt;
&lt;td&gt;Large collection of text-similarity functions, like L1/Manhattan, L2/Euclidean or Levenshtein, and other less known approaches  like Monge-Elkan, Needleman-Wunsch or Smith-Waterman-Gotoh.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Graphs
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Alternatives to:&lt;/strong&gt; &lt;a href="https://neo4j.com/" rel="noopener noreferrer"&gt;Neo4j&lt;/a&gt;, &lt;a href="https://github.com/orientechnologies" rel="noopener noreferrer"&gt;OrientDB&lt;/a&gt;, &lt;a href="https://kuzudb.com/" rel="noopener noreferrer"&gt;KuzuDB&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;Author&lt;/th&gt;
&lt;th&gt;Created&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🟢&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.pgrouting.org/latest/en/index.html" rel="noopener noreferrer"&gt;pgrouting&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;pgRouting community&lt;/td&gt;
&lt;td&gt;2010&lt;/td&gt;
&lt;td&gt;Built on top of &lt;code&gt;postgis&lt;/code&gt;, it was designed to add network analysis support for geospatial routing. Despite its focus, this is likely the most complete graph extension for Postgres, supporting multiple graph algorithms, although none of the state-of-the-art approaches (e.g., embeddings).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.skaiworldwide.com/en-US/resources?filterKey=manual" rel="noopener noreferrer"&gt;AgensGraph&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;SKAI Worldwide&lt;/td&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;Technically a Postgres fork, supporting ANSI SQL and openCypher, with few graph algorithms.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;&lt;a href="https://age.apache.org/age-manual/master/index.html" rel="noopener noreferrer"&gt;age&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Apache&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;Apache AGE (A Graph Extension) supports ANSI SQL and openCypher, and might come to support &lt;a href="https://github.com/apache/age/issues/431" rel="noopener noreferrer"&gt;Apache Gremlin&lt;/a&gt;. Unfortunately, no graph algorithms are provided.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/raitraidma/pggraph" rel="noopener noreferrer"&gt;pggraph&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Rait Raidma&lt;/td&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;Meant as a collection of graph algorithms for Postgres, it only implemented Dijkstra and Kruskal, but the project has been abandoned.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Message  Queues
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Alternatives to:&lt;/strong&gt; &lt;a href="https://redis.io/" rel="noopener noreferrer"&gt;Redis&lt;/a&gt; (&lt;a href="https://redis.io/glossary/redis-queue/" rel="noopener noreferrer"&gt;Queue&lt;/a&gt;, &lt;a href="https://redis.io/docs/latest/develop/interact/pubsub/" rel="noopener noreferrer"&gt;Pub/Sub&lt;/a&gt;), &lt;a href="https://zeromq.org/" rel="noopener noreferrer"&gt;ZeroMQ&lt;/a&gt;, &lt;a href="https://www.rabbitmq.com/" rel="noopener noreferrer"&gt;RabbitMQ&lt;/a&gt;, &lt;a href="https://kafka.apache.org/" rel="noopener noreferrer"&gt;Apache Kafka&lt;/a&gt;, &lt;a href="https://aws.amazon.com/sqs/" rel="noopener noreferrer"&gt;Amazon Simple Queue Service&lt;/a&gt;, &lt;a href="https://cloud.google.com/pubsub" rel="noopener noreferrer"&gt;Google Cloud Pub/Sub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two main categories:&lt;/strong&gt; producer-consumer (one-to-one), and publish-subscribe (one-to-many, event-driven).&lt;/p&gt;

&lt;p&gt;Libraries are focused on job queues and support scheduling as well.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;Author&lt;/th&gt;
&lt;th&gt;Created&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🟢&lt;/td&gt;
&lt;td&gt;&lt;a href="https://pgmq.github.io/pgmq/" rel="noopener noreferrer"&gt;pgmq&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Tembo&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;Provides a &lt;code&gt;create&lt;/code&gt; queue function, as well as &lt;code&gt;send&lt;/code&gt; and &lt;code&gt;read&lt;/code&gt; functions, alongside other utilities, to support the producer-consumer pattern. Integrates with over 10 languages via official (Rust and Python) and community libraries.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/pgq/pgq" rel="noopener noreferrer"&gt;pgq&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Skype&lt;/td&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;Provides a &lt;code&gt;create_queue&lt;/code&gt; function, as well as &lt;code&gt;insert_event&lt;/code&gt;,  &lt;code&gt;register_consumer&lt;/code&gt; and &lt;code&gt;get_batch_events&lt;/code&gt; functions. It supports the publish-subscribe pattern.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/rpdelaney/pg-message-queue" rel="noopener noreferrer"&gt;pg_message_queue&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Chris Travers&lt;/td&gt;
&lt;td&gt;2013&lt;/td&gt;
&lt;td&gt;Provided the functions &lt;code&gt;pg_mq_create_queue&lt;/code&gt;, &lt;code&gt;pg_mq_send_message&lt;/code&gt;, and &lt;code&gt;pg_mq_get_msg_bin&lt;/code&gt; (bytes) or &lt;code&gt;pg_mq_get_msg_text&lt;/code&gt; (plain text), and also supported  &lt;code&gt;LISTEN&lt;/code&gt; for asynchronous notifications. Originally published via an SVN repository and later migrated to Google Code, the code by the original creator is no longer available or maintained. While a fork exists on GitHub,  the project has been abandoned.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;&lt;a href="https://pgqueuer.readthedocs.io/en/latest/index.html" rel="noopener noreferrer"&gt;pgqueuer&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Jan Bjørge Løvland et al.&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;Python library (&lt;code&gt;pgqueuer&lt;/code&gt;) and CLI tool (&lt;code&gt;pgq&lt;/code&gt;) that relies on &lt;code&gt;asyncpg&lt;/code&gt; instead of &lt;code&gt;psycopg2&lt;/code&gt; (like &lt;code&gt;pgmq&lt;/code&gt;). It can be configured using default Postgres environment variables, but there is no default env var to set the connection string. Queues are managed programmatically and via the CLI and only one queue exists per database, stored in the &lt;code&gt;pgqueuer_jobs&lt;/code&gt; table.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/timgit/pg-boss" rel="noopener noreferrer"&gt;pg-boss&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Tim Jones et al.&lt;/td&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;Node.js library that provides the &lt;code&gt;PgBoss&lt;/code&gt; object, instantiated with a connection string. This creates the &lt;code&gt;pgboss&lt;/code&gt; schema where the queues are named and managed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/collectiveidea/delayed_job" rel="noopener noreferrer"&gt;delayed_job&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Shopify&lt;/td&gt;
&lt;td&gt;2008&lt;/td&gt;
&lt;td&gt;Ruby library extracted from Shopify. It supports Active Job and it is not specific to Postgres. It provides multiple features to handle diverse tasks at Shopify and one of the features is named queues. Not the best option for a general purpose message queue library on top of Postgres.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/que-rb/que" rel="noopener noreferrer"&gt;que&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Chris Hanks et al.&lt;/td&gt;
&lt;td&gt;2013&lt;/td&gt;
&lt;td&gt;Ruby library that focuses on reliability and performance, taking advantage of PostgreSQL's advisory locks, which are application-specific locks that can be set at session-level or transaction-level. These fail immediately when locked instead of blocking like row-level locks do, so workers can try another job.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/bensheldon/good_job" rel="noopener noreferrer"&gt;good_job&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Ben Sheldon et al.&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;Ruby library. Inspired by &lt;code&gt;delayed_job&lt;/code&gt; and &lt;code&gt;que&lt;/code&gt;, it also uses advisory locks, but provides Active Job and Rails support.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/QueueClassic/queue_classic" rel="noopener noreferrer"&gt;queue_classic&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Ryan Smith et al.&lt;/td&gt;
&lt;td&gt;2011&lt;/td&gt;
&lt;td&gt;Ruby library specialized in concurrent locking and supporting multiple queues and workers that can handle any of those named queues.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Bits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Before PostgreSQL there was Postgres, which didn't support SQL but an implementation of QUEL (POSTQUEL). QUEL was inspired by relational algebra and created as a part of the Ingres Database.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.pgcli.com/" rel="noopener noreferrer"&gt;pgcli&lt;/a&gt; is a useful &lt;code&gt;pgsql&lt;/code&gt; alternative that adds syntax highlighting, autocompletion, multiline editing, and external editor support.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://harlequin.sh/" rel="noopener noreferrer"&gt;Harlequin&lt;/a&gt; is a SQL IDE for the command line, supporting DuckDB natively, but also SQLite, PostgreSQL, or MariaDB, via plugins.
    - It can be installed via &lt;code&gt;uv&lt;/code&gt; by running: &lt;code&gt;uv tool install harlequin[postgres]&lt;/code&gt;
    - Create a Postgres profile via: &lt;code&gt;uvx harlequin --config&lt;/code&gt;
    - And then connect using: &lt;code&gt;uvx harlequin --profile &amp;lt;profile&amp;gt;&lt;/code&gt;
    - If it's the default profile, you can just run: &lt;code&gt;uvx harlequin&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://whodb.com/" rel="noopener noreferrer"&gt;WhoDB&lt;/a&gt; is as web client with support for PostgreSQL, MongoDB, Redis, SQLite, etc. that can be deployed as a docker image and connect to our &lt;code&gt;postgresql-maximalism&lt;/code&gt; via &lt;code&gt;host.docker.internal&lt;/code&gt;. It also supports conversational querying via an Ollama supported LLM — must have Ollama installed, along with the required models, and run &lt;code&gt;ollama serve&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;When looking for Postgres extensions, there are two registries we can search:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pgxn.org/" rel="noopener noreferrer"&gt;PGXN&lt;/a&gt;, the PostgreSQL eXtension Network.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pgxn&lt;/code&gt; can be installed using &lt;code&gt;pip install pgxnclient&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Install extension: &lt;code&gt;pgxn install pgmq&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Load extension: &lt;code&gt;pgxn load -d dbname pgmq&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://pgt.dev/" rel="noopener noreferrer"&gt;Trunk&lt;/a&gt;, a Postgres extension registry.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;trunk&lt;/code&gt; can be installed using &lt;code&gt;cargo install pg-trunk&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Install extension: &lt;code&gt;trunk install pgmq&lt;/code&gt; will install the &lt;code&gt;pgmq&lt;/code&gt; extension.&lt;/li&gt;
&lt;li&gt;Load extension: &lt;code&gt;psql -d dbname -c "CREATE EXTENSION pgmq;"&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;On Postgres, temporary tables are scoped to a session defaulting to &lt;code&gt;ON COMMIT PRESERVE ROWS&lt;/code&gt;, however SQL clients often timeout sessions, so be aware of this if you're working interactively.

&lt;ul&gt;
&lt;li&gt;For example, VSCode's SQLTools requires &lt;code&gt;idleTimeoutMillis&lt;/code&gt; to be set per connection, or else it will default to 10s before closing idle sessions. I set mine to 1h (3,600,000ms). Make sure to save the connection and reconnect, when changing this. You can also set it to 0, in which case only manually disconnecting and reconnecting will force the session to be closed.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Did you know that &lt;code&gt;$$ ... $$&lt;/code&gt;  blocks are just a different way to quote strings? And did you know that these blocks can be nested by using a quote identifier like &lt;code&gt;$myblock$ ... $myblock$&lt;/code&gt;?&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://pigsty.io/" rel="noopener noreferrer"&gt;PIGSTY (PostgreSQL In Great STYle)&lt;/a&gt; is a PostgreSQL local-first RDS alternative that supports nearly all extensions we tested, excluding &lt;code&gt;pgai&lt;/code&gt;, but it does support it's competitor, &lt;code&gt;pg_vectorize&lt;/code&gt;, from Tembo.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pgxn.org/" rel="noopener noreferrer"&gt;PGXN - PostgreSQL Extension Network&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pgt.dev/" rel="noopener noreferrer"&gt;Trunk - A Postgres Extension Registry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mccue.dev/pages/8-16-24-just-use-postgres" rel="noopener noreferrer"&gt;Just use Postgres&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://supabase.com/blog/pgrouting-postgres-graph-database" rel="noopener noreferrer"&gt;Postgres as a Graph Database: (Ab)using pgRouting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/sql/docs/postgres/extensions" rel="noopener noreferrer"&gt;GCP: Configure PostgreSQL extensions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/AmazonRDS/latest/PostgreSQLReleaseNotes/postgresql-extensions.html" rel="noopener noreferrer"&gt;AWS: Extension versions for Amazon RDS for PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.elastic.co/blog/elasticsearch-as-a-column-store" rel="noopener noreferrer"&gt;Elasticsearch as a column store&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mooncake.dev/blog/how-we-built-pgmooncake" rel="noopener noreferrer"&gt;pg_mooncake: Fast Analytics in Postgres with Columnstore Tables and DuckDB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/booking-com-development/anomaly-detection-in-time-series-using-statistical-analysis-cc587b21d008" rel="noopener noreferrer"&gt;Anomaly Detection in Time Series Using Statistical Analysis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.postgresql.org/wiki/Incremental_View_Maintenance" rel="noopener noreferrer"&gt;PostgreSQL Wiki: Incremental View Maintenance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://materializedview.io/p/everything-to-know-incremental-view-maintenance" rel="noopener noreferrer"&gt;Everything You Need to Know About Incremental View Maintenance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://db.cs.cmu.edu/papers/2024/whatgoesaround-sigmodrec2024.pdf" rel="noopener noreferrer"&gt;What Goes Around Comes Around... And Around...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hashrocket.com/blog/posts/faster-json-generation-with-postgresql" rel="noopener noreferrer"&gt;Faster JSON Generation with PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pigsty.io/" rel="noopener noreferrer"&gt;PIGSTY (PostgreSQL In Great STYle)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.timescale.com/use-timescale/latest/hypertables/about-hypertables/#best-practices-for-time-partitioning" rel="noopener noreferrer"&gt;TimescaleDB: Best Practices for Time Partitioning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.timescale.com/use-timescale/latest/compression/compression-policy/" rel="noopener noreferrer"&gt;TimescaleDB: Compression policy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.timescale.com/forum/t/tuple-decompression-limit-exceeded-by-operation/2465" rel="noopener noreferrer"&gt;TimeScale Forum: Tuple decompression limit exceeded by operation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://huggingface.co/datasets/jettisonthenet/timeseries_trending_youtube_videos_2019-04-15_to_2020-04-15" rel="noopener noreferrer"&gt;Hugging Face Datasets: jettisonthenet/timeseries_trending_youtube_videos_2019-04-15_to_2020-04-15&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://huggingface.co/datasets/wykonos/movies" rel="noopener noreferrer"&gt;Hugging Face Datasets: wykonos/movies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ollama.com/library/nomic-embed-text" rel="noopener noreferrer"&gt;Ollama: nomic-embed-text&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/timescale/pgai/blob/main/docs/vectorizer/migrating-from-extension.md" rel="noopener noreferrer"&gt;timescale/pgai : Migrating from the extension to the python library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.timescale.com/ai/latest/sql-interface-for-pgvector-and-timescale-vector/" rel="noopener noreferrer"&gt;Timescale: SQL interface for pgvector and pgvectorscale&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>postgres</category>
      <category>database</category>
      <category>learning</category>
      <category>dataengineering</category>
    </item>
  </channel>
</rss>
