<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>full-text-search on Vchord</title>
    <link>https://vchord.pgsty.com/tags/full-text-search/</link>
    <description>Recent content in full-text-search on Vchord</description>
    <generator>Hugo</generator>
    <language>en-US</language>
    
    
    
      <lastBuildDate>Thu, 05 Nov 2026 00:32:10 +0800</lastBuildDate>
    
    
      <atom:link href="https://vchord.pgsty.com/tags/full-text-search/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
        <title>pg_tokenizer 1.0.0: First Release Under PGSTY</title>
        <link>https://vchord.pgsty.com/blog/release/pg-tokenizer-1.0.0/</link>
        <pubDate>Tue, 03 Nov 2026 00:00:00 +0000</pubDate>
        
        <guid>https://vchord.pgsty.com/blog/release/pg-tokenizer-1.0.0/</guid>
        <description>&lt;p&gt;&lt;strong&gt;pg_tokenizer 1.0.0&lt;/strong&gt; is the first release maintained by PGSTY in &lt;a href=&#34;https://github.com/pgsty/pg_tokenizer&#34;&gt;&lt;code&gt;pgsty/pg_tokenizer&lt;/code&gt;&lt;/a&gt; under the Apache-2.0 license. It connects the multilingual analyzers and vocabulary models to PostgreSQL&amp;rsquo;s native full-text search, makes corpus-trained custom models safe under concurrent writes, and lets non-superuser database owners manage their own tokenizer definitions.&lt;/p&gt;&#xA;&lt;p&gt;The existing &lt;code&gt;tokenize(text, tokenizer_name)&lt;/code&gt; interface still returns &lt;code&gt;INT[]&lt;/code&gt;. Applications using the historical &lt;code&gt;vchord_bm25&lt;/code&gt; 0.3.x &lt;code&gt;bm25vector&lt;/code&gt; workflow can retain that interface; applications using GIN/GiST or the &lt;a href=&#34;https://vchord.pgsty.com/blog/release/vchord-bm25-1.0.0/&#34;&gt;&lt;code&gt;vchord_bm25&lt;/code&gt; 1.0.0&lt;/a&gt; API can use the new &lt;code&gt;tsvector&lt;/code&gt; functions. &lt;code&gt;pg_tokenizer&lt;/code&gt; does not require either BM25 or vector-search extensions.&lt;/p&gt;</description>
      </item>
    <item>
        <title>vchord_bm25 1.0.0: First Release Under PGSTY</title>
        <link>https://vchord.pgsty.com/blog/release/vchord-bm25-1.0.0/</link>
        <pubDate>Tue, 03 Nov 2026 00:00:00 +0000</pubDate>
        
        <guid>https://vchord.pgsty.com/blog/release/vchord-bm25-1.0.0/</guid>
        <description>&lt;p&gt;&lt;strong&gt;vchord_bm25 1.0.0&lt;/strong&gt; is the first release maintained by PGSTY in &lt;a href=&#34;https://github.com/pgsty/vchord_bm25&#34;&gt;&lt;code&gt;pgsty/vchord_bm25&lt;/code&gt;&lt;/a&gt; under the AGPL-3.0 license. It replaces the custom &lt;code&gt;bm25vector&lt;/code&gt; data type and fixed &lt;code&gt;bm25_catalog&lt;/code&gt; schema from 0.3.x with native PostgreSQL &lt;code&gt;tsvector&lt;/code&gt; indexing, reworks the Block-WeakAnd (WAND) scan and storage engine for continuing scans and concurrent &lt;code&gt;VACUUM&lt;/code&gt;, and enforces table privileges and Row-Level Security (RLS) across both indexed scans and scalar scoring.&lt;/p&gt;&#xA;&lt;div class=&#34;td-callout td-callout--note&#34; role=&#34;note&#34;&gt;&#xA;  &lt;div class=&#34;td-callout__title&#34;&gt;&lt;i class=&#34;td-callout__icon fa-solid fa-circle-info&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&lt;span class=&#34;td-callout__label&#34;&gt;Extension &amp;amp; Release Links&lt;/span&gt;&lt;/div&gt;&#xA;  &lt;div class=&#34;td-callout__body&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;GitHub Release&lt;/strong&gt;: &lt;a href=&#34;https://github.com/pgsty/vchord_bm25/releases/tag/1.0.0&#34;&gt;&lt;code&gt;pgsty/vchord_bm25 1.0.0&lt;/code&gt;&lt;/a&gt; · &lt;a href=&#34;https://github.com/pgsty/vchord_bm25&#34;&gt;Source Repository&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Extension Catalog&lt;/strong&gt;: &lt;a href=&#34;https://pgext.cloud/e/vchord_bm25&#34;&gt;pgext.cloud (&lt;code&gt;vchord_bm25&lt;/code&gt;)&lt;/a&gt; · &lt;a href=&#34;https://pigsty.io/ext/e/vchord_bm25/&#34;&gt;Pigsty Extension Page (&lt;code&gt;pigsty.io&lt;/code&gt;)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Binary Packages&lt;/strong&gt;: &lt;a href=&#34;https://vchord.pgsty.com/download/&#34;&gt;RPM / DEB Repository Setup&lt;/a&gt; · &lt;a href=&#34;https://vchord.pgsty.com/docs/about/sbom/&#34;&gt;SBOM &amp;amp; License Inventory&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&lt;h2 id=&#34;changes&#34;&gt;Changes in 1.0.0&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;td-table-scroll td-table-scroll--static&#34;&gt;&#xA;&lt;table class=&#34;wide expand td-table--wide&#34;&gt;&#xA;  &lt;thead&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;th scope=&#34;col&#34; style=&#34;text-align: left&#34;&gt;Area&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34; style=&#34;text-align: left&#34;&gt;Change&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td style=&#34;text-align: left&#34;&gt;Native &lt;code&gt;tsvector&lt;/code&gt; API&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: left&#34;&gt;Indexes standard PostgreSQL &lt;code&gt;tsvector&lt;/code&gt; columns with &lt;code&gt;USING bm25 (... bm25_ops)&lt;/code&gt;. &lt;code&gt;to_bm25query(tsvector, regclass)&lt;/code&gt; builds queries, and &lt;code&gt;&amp;lt;&amp;amp;&amp;gt;&lt;/code&gt; returns negative &lt;code&gt;double precision&lt;/code&gt; BM25 scores (&lt;code&gt;+0.0&lt;/code&gt; for zero scores).&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td style=&#34;text-align: left&#34;&gt;Relocatable schema&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: left&#34;&gt;Extension objects install into the target schema (&lt;code&gt;public&lt;/code&gt; by default) and support &lt;code&gt;ALTER EXTENSION vchord_bm25 SET SCHEMA&lt;/code&gt;. The fixed &lt;code&gt;bm25_catalog&lt;/code&gt; schema is no longer required.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td style=&#34;text-align: left&#34;&gt;Continuing WAND scans&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;bm25.limit&lt;/code&gt; and the index &lt;code&gt;limit&lt;/code&gt; reloption (&lt;code&gt;0..=65535&lt;/code&gt;, default &lt;code&gt;100&lt;/code&gt;, &lt;code&gt;0&lt;/code&gt; selects &lt;code&gt;100&lt;/code&gt;) set the initial WAND top-K batch size rather than a hard result cap; scans continue through matching, zero-score, and &lt;code&gt;NULL&lt;/code&gt; rows as needed.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td style=&#34;text-align: left&#34;&gt;Shared statistics cache&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: left&#34;&gt;Prepared corpus statistics and growing-segment scores are cached per &lt;code&gt;(index, query)&lt;/code&gt; within &lt;code&gt;work_mem&lt;/code&gt; and shared between indexed scans and scalar &lt;code&gt;&amp;lt;&amp;amp;&amp;gt;&lt;/code&gt; evaluations (&lt;code&gt;PARALLEL RESTRICTED&lt;/code&gt;). &lt;code&gt;NULL&lt;/code&gt; rows are excluded from document count, and WAND upper bounds adjust for &lt;code&gt;avgdl&lt;/code&gt; drift.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td style=&#34;text-align: left&#34;&gt;Concurrent maintenance&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: left&#34;&gt;Format 4 storage uses generation stamps, a growing segment, and one crash-resumable retired generation. &lt;code&gt;VACUUM&lt;/code&gt; and &lt;code&gt;bm25_maintain(regclass)&lt;/code&gt; merge growing tuples under &lt;code&gt;ShareUpdateExclusiveLock&lt;/code&gt; using PostgreSQL&amp;rsquo;s &lt;code&gt;GlobalVis&lt;/code&gt; horizon without taking &lt;code&gt;AccessExclusiveLock&lt;/code&gt; or allocating an XID. &lt;code&gt;ANALYZE&lt;/code&gt; is a no-op.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td style=&#34;text-align: left&#34;&gt;Standby replay&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;VACUUM&lt;/code&gt; tombstones only already-pruned heap TIDs, raising no false standby conflicts; only page recycling raises SQLSTATE &lt;code&gt;40001&lt;/code&gt; (&lt;code&gt;serialization_failure&lt;/code&gt;) if an older standby query is still reading a retired generation.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td style=&#34;text-align: left&#34;&gt;Corpus permissions &amp;amp; RLS&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: left&#34;&gt;Both indexed scans and scalar &lt;code&gt;&amp;lt;&amp;amp;&amp;gt;&lt;/code&gt; check current-role table &lt;code&gt;SELECT&lt;/code&gt; (or column &lt;code&gt;SELECT&lt;/code&gt; for simple single-column non-partial indexes) and reject queries when RLS policies apply (&lt;code&gt;0A000&lt;/code&gt;), preventing corpus-statistic leaks. Scalar scoring locks the heap before the index.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td style=&#34;text-align: left&#34;&gt;Build &amp;amp; platform support&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: left&#34;&gt;Upgraded to &lt;code&gt;pgrx 0.19.3&lt;/code&gt; for PostgreSQL 14–18 on Linux x86_64 and aarch64, with runtime SIMD dispatch (&lt;code&gt;AVX512&lt;/code&gt; / &lt;code&gt;AVX2&lt;/code&gt; / &lt;code&gt;NEON&lt;/code&gt;) and responsive query cancellation outside page locks.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;h2 id=&#34;native-tsvector&#34;&gt;Native &lt;code&gt;tsvector&lt;/code&gt; indexing and relocatable schema&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In &lt;code&gt;vchord_bm25 1.0.0&lt;/code&gt;, documents are stored as standard PostgreSQL &lt;code&gt;tsvector&lt;/code&gt; values with lexeme positions (&lt;code&gt;1..=16383&lt;/code&gt;, up to 256 positions per lexeme). Each position entry counts as one occurrence of that lexeme when computing term frequency (&lt;code&gt;tf&lt;/code&gt;) and document length (&lt;code&gt;dl&lt;/code&gt;); lexemes without positions are ignored by BM25 scoring.&lt;/p&gt;</description>
      </item>
    
  </channel>
</rss>
