[{"data":1,"prerenderedAt":462},["ShallowReactive",2],{"project-47589856":3},{"id":4,"name":5,"line":6,"line_source":7,"title":8,"url":9,"domain":10,"maker":11,"posted_at":12,"year":13,"points":14,"comments":15,"rank_in_year":16,"shown_in_year":17,"top":18,"tier":19,"category":20,"subcategory":21,"format":22,"keywords":23,"reception":28,"sentiment":29,"stance_mix":30,"scored_comments":35,"aspects":36,"strip":45,"post_text":47,"what":48,"said":91,"maker_in_thread":241,"shape":252,"grid":256,"attempts":424,"same_week":425,"maker_shows":44,"maker_hidden":454,"reader_version":455,"card":456},"47589856","pg_textsearch","Postgres extension for BM25 relevance-ranked full-text search","title","Show HN: Postgres extension for BM25 relevance-ranked full-text search","https:\u002F\u002Fgithub.com\u002Ftimescale\u002Fpg_textsearch","github.com","tjgreen",1774974592,2026,203,56,288,4366,7,"notable","data","postgres extension","library",[24,25,26,27],"bm25","postgres full-text search","hybrid search","relevance ranking","loved",0.422,{"positive":31,"neutral":32,"mixed":33,"critical":34},18,12,0,3,33,{"docs":37,"design":38,"execution":40,"idea":41,"performance":43},{"positive":33,"critical":33},{"positive":33,"critical":39},1,{"positive":39,"critical":39},{"positive":42,"critical":33},8,{"positive":44,"critical":33},2,[46,34,33,34,39,34,33,33,46,46,46,34,46,46,46,33,33,33,33,34,46,46,34,34,34,46,46,33,46,34,33,33,33,34,34,46,39,33,33,33],5,null,{"problem":49,"audience":56,"pricing":47,"motivation":68,"time_to_build":72,"stack":76,"openness":88,"stage":89,"team_size":90},{"value":50,"source":51,"evidence":52},"Core Postgres lacks BM25 relevance-ranked full-text search","maker",[53],{"id":54,"by":11,"text":55},"47589857","Last summer we faced a conundrum at my company, Tiger Data, a Postgres cloud vendor whose main business is in timeseries data. We were trying to grow our business towards…",{"value":57,"source":58,"evidence":59},"Postgres users building keyword or hybrid search, including RAG systems","commenter",[60,64],{"id":61,"by":62,"text":63},"47593280","gmassman","Very exciting! Congrats on the release, this will be a huge benefit to all folks building RAG\u002Frerank systems on top of Postgres. Looking forward to testing it out myself.",{"id":65,"by":66,"text":67},"47593836","maweaver","I've been doing some RAG prototypes with hybrid search using pg_textsearch plus pgvector and have been very pleased with the results. Happy to see a 1.0 release!",{"value":69,"source":51,"evidence":70},"Needed scalable ranked keyword search for Tiger Data's hybrid search stack, avoiding AGPL ParadeDB",[71],{"id":54,"by":11,"text":55},{"value":73,"source":51,"evidence":74},"About two quarters, solo with AI-assisted development",[75],{"id":54,"by":11,"text":55},[77,84],{"value":78,"source":58,"evidence":79},"C",[80],{"id":81,"by":82,"text":83},"47755470","csenshi","Noticed it's only pg17, is that some hard dependency? Also why did you choose C for this and not rust, any specific reason? I see pgvectorscale is built on rust",{"value":85,"source":51,"evidence":86},"PostgreSQL",[87],{"id":54,"by":11,"text":55},"open_source","launched","unknown",{"praise":92,"objections":124,"requests":162,"questions":210,"alternatives":223},[93,102,113],{"value":94,"source":58,"evidence":95},"Useful for hybrid search and RAG on Postgres",[96,97,98],{"id":61,"by":62,"text":63},{"id":65,"by":66,"text":67},{"id":99,"by":100,"text":101},"47593320","3abiton","This is pretty much my case right now. BM25 is so useful in many cases and having with with postgres is neat!",{"value":103,"source":58,"evidence":104},"Faster and more stable than ParadeDB in production",[105,109],{"id":106,"by":107,"text":108},"47596006","diwank","we have been using pg_textsearch in production for a few weeks now, and it's been fairly stable and super speedy. we used to use paradedb (aka pg_search -- it's quite annoying…",{"id":110,"by":111,"text":112},"47593773","devmor","This is really cool to see! I've been using BM25+sqlite-vec for contextual search projects for a little while, it's a great performance addition.",{"value":114,"source":58,"evidence":115},"Bringing BM25 into Postgres avoids a separate search engine",[116,120],{"id":117,"by":118,"text":119},"47593140","shreyssh","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…",{"id":121,"by":122,"text":123},"47594131","robotswantdata","“Just use Postgres” greybeards right again. Looking forward to giving this a go soon",[125,136,144,151],{"value":126,"source":58,"evidence":127},"Only filters by term, no built-in WHERE-filtered BM25 ranking",[128,132],{"id":129,"by":130,"text":131},"47592690","simonw","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…",{"id":133,"by":134,"text":135},"47593548","mbreese","While we’re talking about filtering — is there a way to set a WHERE clause when you’re setting up the index? I’ve been working on this a lot recently for a hybrid vector search…",{"value":137,"source":58,"evidence":138},"Only supports Postgres 17 for now",[139,140],{"id":81,"by":82,"text":83},{"id":141,"by":142,"text":143},"47821874","samokhvalov","you need to explain claude code that PG18 is out already ;)",{"value":145,"source":58,"evidence":146},"Term positions limitation for phrase-style searches",[147],{"id":148,"by":149,"text":150},"47597441","kev009","The \"term positions\" caveat seems like a major limitation for human oriented searches of logs or products or whatever. I don't see it mentioned in what's next, will you address…",{"value":152,"source":58,"evidence":153},"Benchmark claims doubted",[154,158],{"id":155,"by":156,"text":157},"47603971","swaminarayan","What architectural decisions enabled pg_textsearch to outperform Tantivy\u002FParadeDB by 4.7×, especially given Tantivy’s reputation for speed?",{"id":159,"by":160,"text":161},"47604228","laundermedaddy","vibes",[163,186,197,203],{"value":164,"source":58,"evidence":165},"Managed cloud availability (Supabase, Aurora, GCP, Azure, Neon)",[166,170,174,178,182],{"id":167,"by":168,"text":169},"47593301","jackyliang","VERY excited about this, literally just looking to build hybrid search using Postgres FTS. When will this be available on Supabase?",{"id":171,"by":172,"text":173},"47593538","timedude","When is this available on AWS in Aurora? Anyone from AWS here, add it pronto",{"id":175,"by":176,"text":177},"47593615","mattbessey","Please oh please let GCP add this to the supported managed Postgres extensions...",{"id":179,"by":180,"text":181},"47606128","rickette","And Azure Flexible server please",{"id":183,"by":184,"text":185},"47594912","hmokiguess","I hope someone from Neon is watching this thread, definitely want to play with this asap",{"value":187,"source":58,"evidence":188},"Pluggable tokenizer or CJK support",[189,193],{"id":190,"by":191,"text":192},"47626554","derodero24","CJK tokenization is one of those things that looks simple until you actually try it. Japanese alone needs morphological analysis (MeCab etc.) because there are no word boundaries…",{"id":194,"by":195,"text":196},"47623137","edinetdb","Interesting timing — we've been tackling similar full-text search challenges over Japanese financial filings (roughly 9M+ sections from annual reports). The tokenization problem…",{"value":198,"source":51,"evidence":199},"Expression or filtered indexes",[200],{"id":201,"by":11,"text":202},"47593650","Partitions would be one option, and we've got pretty robust partitioned table support in the extension. (Timescaledb uses partitioning for hypertables, so we had to front-load…",{"value":204,"source":58,"evidence":205},"Better high-frequency write performance",[206],{"id":207,"by":208,"text":209},"47593379","Unical-A","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…",[211,215,219],{"value":212,"source":58,"evidence":213},"How does it handle high-frequency writes?",[214],{"id":207,"by":208,"text":209},{"value":216,"source":58,"evidence":217},"Index build time on larger datasets?",[218],{"id":117,"by":118,"text":119},{"value":220,"source":58,"evidence":221},"Is a WHERE clause possible when creating the index?",[222],{"id":133,"by":134,"text":135},[224,229,233,237],{"value":225,"source":58,"evidence":226},"ParadeDB pg_search",[227,228],{"id":117,"by":118,"text":119},{"id":106,"by":107,"text":108},{"value":230,"source":58,"evidence":231},"pgvector with hybrid search",[232],{"id":65,"by":66,"text":67},{"value":234,"source":58,"evidence":235},"Elasticsearch",[236],{"id":117,"by":118,"text":119},{"value":238,"source":51,"evidence":239},"Tantivy",[240],{"id":54,"by":11,"text":55},{"comments":242,"answered":243,"key":244},10,6,[245,248,249],{"id":246,"text":247},"47592974","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…",{"id":201,"text":202},{"id":250,"text":251},"47593474","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…",{"commenters":253,"max_depth":254,"maker_replies":242,"first_comment_mins":33,"lifespan_hours":255},49,4,444,[257,261,265,267,269,270,271,273,275,279,280,284,287,289,291,294,297,298,300,301,302,305,310,312,316,319,322,325,327,330,332,335,337,339,344,346,349,353,354,355,357,359,361,363,367,369,373,375,377,379,381,384,388,391,393,395,399,402,405,410,413,416,419,422],[258,33,46,259,260,33],"47592350","maker\u002Fpositive\u002Fnone","jascha_eng",[262,33,33,263,264,33],"47599295","commenter\u002Fneutral\u002Fnone","ellefire",[129,39,34,266,130,33],"project\u002Fneutral\u002Fdocs",[246,39,33,268,11,39],"project\u002Fneutral\u002Fdesign",[133,39,34,268,134,33],[201,39,33,268,11,39],[81,44,34,272,82,33],"project\u002Fneutral\u002Fexecution",[141,44,39,274,142,33],"project\u002Fcritical\u002Fexecution",[276,34,34,277,278,33],"47593412","project\u002Fneutral\u002Fidea","andai",[250,34,33,277,11,39],[281,254,33,282,283,33],"47597039","other\u002Fneutral\u002Fperformance","i_have_to_speak",[285,254,33,263,286,33],"47597567","esperent",[121,46,46,288,122,33],"project\u002Fpositive\u002Fidea",[175,243,46,290,176,33],"project\u002Fpositive\u002Fnone",[292,243,33,293,11,39],"47593819","project\u002Fneutral\u002Fnone",[295,243,46,290,296,33],"47595671","7thpower",[179,243,46,290,180,33],[148,18,39,299,149,33],"project\u002Fcritical\u002Fdesign",[61,42,46,288,62,33],[99,42,46,288,100,33],[303,42,46,288,304,33],"47597706","jillesvangurp",[306,307,33,308,309,33],"47605430",9,"other\u002Fneutral\u002Fnone","dimamik",[110,242,46,311,111,33],"project\u002Fpositive\u002Fperformance",[313,314,46,288,315,33],"47632313",11,"artificium",[317,32,33,308,318,33],"47593882","piskov",[320,32,33,308,321,33],"47597913","arnitdo",[323,32,33,308,324,33],"47598972","nopurpose",[326,32,33,308,318,33],"47607080",[328,32,33,308,329,33],"47598308","legedemon",[331,32,33,308,318,33],"47606989",[207,333,34,334,208,33],13,"project\u002Fneutral\u002Fperformance",[336,333,33,334,11,39],"47593516",[183,338,46,290,184,33],14,[340,341,46,342,343,33],"47598953",15,"project\u002Fpositive\u002Fexecution","droelf",[65,345,46,288,66,33],16,[347,345,34,277,348,33],"47595587","adsharma",[350,351,34,266,352,33],"47596964",17,"esafak",[155,31,34,334,156,33],[159,31,34,334,160,33],[356,31,33,308,156,33],"47609601",[167,358,46,290,168,33],19,[360,358,33,293,11,39],"47593374",[171,362,46,290,172,33],20,[364,365,33,308,366,33],"47597463",21,"landsman",[106,368,46,311,107,33],22,[370,371,46,288,372,33],"47593838",23,"bradfox2",[117,374,34,334,118,33],24,[376,374,33,334,11,39],"47593201",[378,374,33,334,11,39],"47593233",[380,374,33,308,107,33],"47596013",[382,374,33,263,383,33],"47603830","victorbjorklund",[385,386,33,308,387,33],"47593508",25,"zephyrwhimsy",[389,386,33,308,390,33],"47598395","hrmtst93837",[194,392,34,272,195,33],26,[190,394,34,272,191,33],27,[396,397,33,308,398,33],"47607426",28,"deesha_tech",[400,401,46,288,398,33],"47621090",29,[54,403,33,404,11,39],30,"maker\u002Fpositive\u002Fidea",[406,407,39,408,409,33],"47592709",31,"maker\u002Fcritical\u002Fnone","gplprotects",[411,407,33,412,11,39],"47592981","maker\u002Fneutral\u002Fnone",[414,407,33,263,415,33],"47594769","nathanmills",[417,407,33,263,418,33],"47597796","Ultimatt",[420,407,33,263,421,33],"47593059","lsaferite",[423,407,33,263,160,33],"47604221",[],[426,431,435,440,445,450],{"id":427,"name":428,"points":429,"category":430},"47593422","1-Bit Bonsai",430,"ai",{"id":432,"name":433,"points":434,"category":430},"47536761","nullclaw",340,{"id":436,"name":437,"points":438,"category":439},"47557921","Git bayesect",337,"dev_tools",{"id":441,"name":442,"points":443,"category":444},"47580350","30u30.fyi",256,"other",{"id":446,"name":447,"points":448,"category":449},"47571183","korb",205,"consumer_social",{"id":451,"name":452,"points":453,"category":20},"47534283","Turbolite",185,false,"v2",{"id":457,"name":5,"line":6,"ai":454,"cat":20,"year":13,"points":14,"comments":15,"rec":28,"s":458,"top":18,"kw":459,"maker":11,"domain":10,"tier":19,"attempts":33,"strip":460,"url":9,"mix":461,"praise":94,"objection":126,"sub":21},47589856,0.42,[24,25,26,27],"5303130055535550000355333550530003351000",[31,32,33,34],1794036697400]