16 comments

  • andai 8 minutes ago

    Can you explain this in more detail? Is this for RAG, i.e. combining vector search with keyword search?

    My knowledge on that subject roughly begins and ends with this excellent article, so I'd love to hear how this relates to that.

    https://www.anthropic.com/engineering/contextual-retrieval

    Especially since what Anthropic describes here is a bit of a rube Goldberg machine which also involves preprocessing (contextual summarization) and a reranking model, so I was wondering if there's any "good enough" out of the box solutions for it.

    • tjgreen 3 minutes ago

      Yes, hybrid search is one of the main current use cases we had in mind developing the extension, but it works for old-fashioned standalone keyword-only search as well. There is a lot of art to how you combine keyword and semantic search (there are entire companies like Cohere devoted to just this step!). We're leaving this part, at least for now, up to application developers.

  • Unical-A 11 minutes ago

    Impressive benchmarks. How does the BM25 implementation handle high-frequency updates (writes) while maintaining search latency? Usually, there's a trade-off between ingest speed and search performance in Postgres-based full-text search.

  • shreyssh 33 minutes ago

    Nice work. pg_search has been on my radar for a while, having BM25 natively in Postgres instead of bolting on Elasticsearch is a huge DX win. Curious about the index build time on larger datasets though. I'm working with ~2M row tables and the bottleneck for most Postgres extensions I've tried isn't query speed, it's the initial indexing. Any benchmarks on that?

    • tjgreen 28 minutes ago

      Yep, there are numbers in the blog post and repo. We are able to index MS-MARCO v2 (138M documents, around 50GB of raw data) in a bit under 18 minutes.

      • tjgreen 25 minutes ago

        For 2M scale dataset, you should be able to index in about 1 minute on low-end hardware. See the MS-MARCO v1 (8M documents) numbers, measured on cheap Github runners.

  • simonw an hour ago

    This is really cool. I've built things on PostgreSQL ts_vector() FTS in the past which works well but doesn't have whole-index ranking algorithms so can't do BM25.

    It's a bit surprising to me that this doesn't appear to have a mechanism to say "filter for just documents matching terms X and Y, then sort by BM25 relevance" - it looks like this extension currently handles just the BM25 ranking but not the FTS filtering. Are you planning to address that in the future?

    I found this example in the README quite confusing:

      SELECT * FROM documents
      WHERE content <@> to_bm25query('search terms', 'docs_idx') < -5.0
      ORDER BY content <@> 'search terms'
      LIMIT 10;
    
    That -5.0 is a magic number which, based on my understanding of BM25, is difficult to predict in advance since the threshold you would want to pick varies for different datasets.
    • tjgreen an hour ago

      I actually don't love this example either, for the reasons you mention, but at some point we had questions about how to filter based on numeric ranking. Thanks for the reminder to revisit this.

      Re filtering, there are often reasonable workarounds in the SQL context that caused me to deprioritize this for GA. With your example, the workaround is to apply post-filtering to select just matches with all desired terms. This is not ideal ergonomics since you may have to play with the LIMIT that you'll need to get enough results, but it's already a familiar pattern if you're using vector indexes. For very selective conditions, pre-filtering by those conditions and then ranking afterwards is also an option for the planner, provided you've created indexes on the columns in question.

      All this is just an argument about priorities for GA. Now that v1.0 is out, we'll get signal about which features to prioritize next.

  • jascha_eng 2 hours ago

    FWIW TJ is not your average vibe coder imo: https://www.linkedin.com/in/todd-j-green/

    In september he burned through 3000$ in API credits though, but I think that's before we finally bought max plans for everyone that wanted it.

  • gmassman 21 minutes ago

    Very exciting! Congrats on the release, this will be a huge benefit to all folks building RAG/rerank systems on top of Postgres. Looking forward to testing it out myself.

    • 3abiton 17 minutes ago

      This is pretty much my case right now. BM25 is so useful in many cases and having with with postgres is neat!

  • jackyliang 19 minutes ago

    VERY excited about this, literally just looking to build hybrid search using Postgres FTS. When will this be available on Supabase?

    • tjgreen 12 minutes ago

      You'll have to ask Supabase!

  • gplprotects an hour ago

    > ParadeDB, is guarded behind AGPL

    What a wonderful ad for ParadeDB, and clear signal that "TigerData" is a pernicious entity.

    • lsaferite 38 minutes ago

      You: > "TigerData" is a pernicious entity

      TigerData: > pg_textsearch v1.0 is freely available via open source (Postgres license)

      They deemed AGPL untenable for their business and decided to create an OSS solution that used a license they were comfortable with and they are somehow "pernicious"? Perhaps take a moment to reflect on your characterization of a group that just contributed an alternative OSS project for a specific task. Not only that, but they used a VERY permissive license. I'd argue that they are being a better OSS community member for selecting a more permissive license.

    • tjgreen 44 minutes ago

      Okay then!