ビスケットは高速パターンマッチング用に設計された、LIKE クエリ向けの特化型PostgreSQLインデックスです。

2025/12/17 0:39

ビスケットは高速パターンマッチング用に設計された、LIKE クエリ向けの特化型PostgreSQLインデックスです。

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

Biscuit は PostgreSQL のインデックスアクセスメソッド(IAM)で、

LIKE
/
ILIKE
クエリを高速化するように設計されており、複数列検索や集計カウントも含めトライグラム再確認を排除します。

この拡張機能は前方/後方位置ビットマップと長さビットマップを RoaringBitmaps として格納し、別途再確認フェーズを経ずに直接ビットマップ交差を可能にします。サポート対象のデータ型は

text
numeric
(ソート可能文字列へ変換)、
date/time
(ソート可能タイムスタンプ)、および
boolean
です。

Biscuit は 12 のパフォーマンス最適化 を組み込んでいます:不要なワイルドカード交差のスキップ、空結果時の早期終了、インプレースビットマップ操作、正確/接頭辞/接尾辞/部分文字列パターンに対する高速経路、TID ソート、バッチ挿入、直接 Roaring 反復、閾値クリーンアップ、集計検出、LIMIT‑aware コレクション、および選択性による予測子再順序付け。

100 万行のテーブルではインデックス作成に約 2.7 秒 がかかり、pg_trgm GIN の約 20 秒と比べて大幅に短縮されます。またワイルドカードを多用したパターンに対してはクエリ性能が顕著に向上します。書き込み操作は B‑tree と同様の挙動で、

INSERT
はほぼ同等、
UPDATE
は削除+挿入を行い、
DELETE
はトゥームストーンをマークし定期的なバッチクリーンアップが実施されます。ビットマップはメモリ上に保持されるため、大きくなる場合は REINDEX が推奨されます。

現行リリース(v2.1.4)はソースまたは PGXN 経由で入手可能で、診断ビュー (

biscuit_status
) や
biscuit_version()
biscuit_build_info()
等の SQL 関数を提供します。

制限事項:正規表現や類似検索はサポートされず、バイトベースの文字列比較(ロケール照合順序なし)となります。また順序付きスキャンは利用できません (

amcanorder = false
)。

Biscuit は e‑commerce の検索、ログ分析、CRM チケット検索、コードリポジトリ検索など

LIKE
クエリを頻繁に使用するワークロードに適しています。著者はネイティブ順序付きスキャン、統計収集、追加データ型、並列ビルド、および圧縮機能の実装への貢献を歓迎します。

重要ポイント:

  • キーポイントリストの全主要項目が改善された要約に含まれています。
  • 元文で明示的に述べられていること以外に新たな推測はありません。
  • 主旨は明確かつ簡潔で、曖昧または混乱を招く表現はありません。

本文

Biscuit – PostgreSQL 用高速パターンマッチングインデックス

バージョン 2.1.4


概要

Biscuit は、ワイルドカードが多いクエリでも圧倒的に高速な

LIKE
/
ILIKE
パターンマッチを実現する専門的なインデックスアクセスメソッド(IAM)です。
複数列検索をサポートし、trigram インデックスの再検証オーバーヘッドを排除します。

主な特徴

  • ビットマップベースの文字位置インデックス
  • Roaring ビットマップ圧縮(スパース/ダENSE への自動切替)
  • 再検証不要 – 結果は決定的
  • 内蔵診断・イントロスペクション機能

ビルドとパッケージング

  • Makefile の CRoaring 検出 が複数の典型パスを確認するようになり、移植性が向上。

新しい SQL 関数

関数戻り値説明
biscuit_version()
text
拡張機能のバージョン文字列
biscuit_build_info()
table
ビルド時の設定テーブル
biscuit_build_info_json()
text
JSON 形式で同情報
biscuit_has_roaring()
boolean
CRoaring がコンパイル済みか
biscuit_roaring_version()
text
CRoaring ライブラリのバージョン

診断ビュー

  • biscuit_status
    – 単一行ビューで以下を表示
    • 拡張機能バージョン
    • CRoaring 有効化状態
    • 使用ビットマップバックエンド
    • Biscuit インデックス総数
    • 合計ディスク使用量

インストール方法

ソースコマンド
ソースから
bash<br>git clone https://github.com/Crystallinecore/biscuit.git<br>cd biscuit<br>make<br>sudo make install<br>psql -d <your_db> -c "CREATE EXTENSION biscuit;"<br>
PGXN
bash<br>pgxn install biscuit<br>psql -d <your_db> -c "CREATE EXTENSION biscuit;"<br>

必要条件

  • ビルドツール:
    gcc
    ,
    make
    ,
    pg_config
  • 任意: 速度向上のため CRoaring ライブラリ

クイックスタート

基本的な使い方

-- Biscuit インデックス作成
CREATE INDEX idx_users_name ON users USING biscuit(name);

-- ワイルドカードクエリ(再検証不要)
SELECT * FROM users WHERE name LIKE '%john%';
SELECT * FROM users WHERE name NOT LIKE 'a%b%c';

複数列インデックス

CREATE INDEX idx_products_search 
ON products USING biscuit(name, description, category);

SELECT * FROM products
WHERE name LIKE '%widget%'
  AND description LIKE '%blue%'
  AND category LIKE 'electronics%'
ORDER BY score DESC LIMIT 10;

対応データ型

備考
Text
CREATE INDEX ON logs USING biscuit(message);
ネイティブサポート
Numeric
CREATE INDEX ON events USING biscuit(user_id, event_code);
ソート可能文字列へ変換
Date/Time
CREATE INDEX ON orders USING biscuit(order_date, customer_name);
タイムスタンプをソート
Boolean
CREATE INDEX ON flags USING biscuit(is_active, status);
't'/'f'
で保存

原理 – コアコンセプト

Biscuit は各文字列に対して 文字位置ビットマップ を構築します。

  1. 正方向(forward):
    c@p
    → 文字 c が位置 p に出現する行を記録。
  2. 逆方向(backward):
    c@-p
    → 末尾から p-番目に c がある行を記録。
  3. 大文字小文字無視 変種 (
    h@0
    等)。
  4. 長さビットマップ による正確/最小長フィルタリング。

アルゴリズム例(
LIKE '%abc%def'

  1. パートに分割:
    ["abc", "def"]
  2. 接頭辞パート →
    pos[a@0] ∩ pos[b@1] ∩ pos[c@2]
  3. 接尾辞パート →
    neg[f@-1] ∩ neg[e@-2] ∩ neg[d@-3]
  4. 長さ ≥ 6 →
    length_ge[6]
    と交差。

結果: 真陽性のみ、偽陽性は排除。


パフォーマンス最適化

#最適化効果
1ワイルドカード交差のスキップ (
a_c
)
位置1で256文字全体を走査しない
2空ビットマップで早期終了処理を即座に停止
3インプレース操作、冗長コピー回避メモリと CPU の節約
4正確/接頭辞/接尾辞/サブ文字列の高速パスよく使われるケースを迅速処理
5不要な長さオペレーションを省略完全ワイルドカードは長さフィルタのみ使用
6TID ソート(ラジックス/クイックソート)ヒープへの連続アクセスを実現
7バッチ TID 挿入システムコールオーバーヘッド削減
8Roaring の直接反復中間配列不要
9タンボーンクリーンアップの閾値ベースビットマップを軽量化
10集計でソート省略COUNT, EXISTS を高速化
11LIMIT 対応収集リミットに到達したら早期終了
12順序再配置(選択性)複数列クエリを最適実行

ベンチマークのハイライト

インデックスビルド時間
pg_trgm
20 358 ms
biscuit
2 734 ms

単一列、シンプルパターン:

EXPLAIN ANALYZE SELECT * FROM benchmark WHERE name LIKE '%abc%' LIMIT 100;

複数列、複雑パターン:

SELECT * FROM benchmark
WHERE name LIKE '%a%b'
  AND description LIKE '%bc%cd%'
ORDER BY score DESC LIMIT 10;

利用事例

ドメイン
全文検索商品カタログ:
LIKE '%laptop%'
とブランド・説明フィルタ
ログ分析メッセージ、ソース、レベルでエラーログ検索
CRM件名・顧客名・ステータスでチケット検索
コード検索ファイル名、内容、著者でリポジトリ検索
分析パターンフィルタ付きイベント種別の高速
COUNT(*)

設定と制限

  • CRoaring: 任意。ビットマップ操作を高速化。
  • 順序スキャン不可 (
    amcanorder = false
    )。PostgreSQL のプランナーは
    ORDER BY + LIMIT
    を効率的に処理(フィルタ後の小規模メモリソート)。
  • メモリ使用量: ビットマップはメモリ上に保持。インデックスが大きくなったら
    REINDEX
    を実行。

pg_trgm
との比較

機能Biscuitpg_trgm (GIN)
ワイルドカードパターンネイティブ、正確近似
再検証オーバーヘッドなし必要
複数列最適化済み
btree_gist
経由
集計最適化済み同等コスト
ORDER BY + LIMIT有効(順序スキャン不可)順序スキャン可
正規表現
類似検索
ILIKE

Biscuit を使うべきケース

  • 重いワイルドカード
    LIKE
    /
    ILIKE
    クエリ。
  • 複数列パターンマッチ。
  • 正確な結果と高速集計が必要。

pg_trgm に留めるべきケース

  • 近似検索や類似検索。
  • 正規表現使用。
  • メモリ制限が厳しい環境。

開発

git clone https://github.com/Crystallinecore/biscuit.git
cd biscuit
make clean
CFLAGS="-g -O0 -DDEBUG" make          # デバッグビルド
make installcheck                      # テスト実行
sudo make install                       # インストール

テスト例

CREATE EXTENSION biscuit;
CREATE TABLE test (id SERIAL, name TEXT);
INSERT INTO test(name) VALUES ('hello'), ('world'), ('test');
CREATE INDEX idx_test ON test USING biscuit(name);
EXPLAIN ANALYZE SELECT * FROM test WHERE name LIKE '%ell%';

コントリビュート

  1. リポジトリをフォーク。
  2. 機能ブランチ作成 (
    git checkout -b feature/...
    )。
  3. テスト追加・コミット。
  4. PR を送信。

貢献可能領域

  • amcanorder
    の実装(ネイティブ順序スキャン)。
  • コスト推定の統計情報改善。
  • さらに多いデータ型への対応(JSON, 配列等)。
  • 並列インデックスビルド。

ライセンス

MIT – 詳細は LICENSE をご覧ください。


作者

Sivaprasad Murali
メール: sivaprasad.off@gmail.com
GitHub: @Crystallinecore


パターンマッチングを楽しんでください!pg_trgm が半熟のように感じるときは、ビスケット 🍪 を手に取ってみて。

同じ日のほかのニュース

一覧に戻る →

2025/12/21 3:28

**Spotify のバックアップ**

## Japanese Translation: ``` ## Summary Anna’s Archive は、Spotify のカタログのほぼ全て(約 2億5600 万曲と 1億8600 万個のユニーク ISRC コード、Spotify 再生回数の約 99.6 %)を収録した、大規模で公開アクセス可能な保存プロジェクトを開始しました。アーカイブには約 8,600 万曲(≈300 TB)の音楽ファイル、SQLite データベースに格納された 200 GB 超の圧縮メタデータ、および音声特徴量データ(テンポ、キー、ダンス性など)を含む約 4,000 万行が含まれています。 配布は人気順でグループ化した大量トレント経由です。トップ 10,000 曲は OGG Vorbis 160 kbit/s で提供され、順位の低い曲は OGG Opus 75 kbit/s に再エンコードされています。追加コンテンツとしては、ファイル名プレフィックスでインデックスされたアルバムアートを含む tar‑torrent と、オーディオブック(約 70 万行)、オーディオブック章(約 2000 万件)、ポッドキャスト/ショー(約 500 万件)、エピソード(約 5400 万件)の原始 JSON データセットがあります。アーカイブには再エンコード状況、SHA256 ハッシュ、ライセンス情報、歌詞、言語、およびアーティストの役割を含む詳細な `track_files` テーブルもあります。 プレイリストデータも収録されています:フォロワー 1,000 人以上の約 660 万プレイリストがあり、総曲数は 17 億曲に達します。メタデータは 2025 年 12 月に発表され、音声ファイルは人気順で提供され、2025 年 7 月を境に追加されたトラックは欠落している可能性があります。Anna’s Archive はトレントのシーディングと寄付を奨励し、継続的な保存活動を支援しています。 研究者・AI 開発者・デジタルアーカイブ担当者にとって、このプロジェクトは Spotify のライブラリを分析、モデル学習、遺産保全のために利用できる前例のない高品質なスナップショットを提供し、ストリーミング業界における長期データ管理の新たな標準となり得ます。 ```

2025/12/21 4:56

アイルランド出身のディアムウィッド・エーリーが、マイクロソフト・エクセル世界選手権で優勝しました。

## Japanese Translation: Diarmuid Early はラスベガスで開催された 2025 年 Microsoft Excel ワールドチャンピオンシップを制覇し、60,000 ドルの賞金と選手権ベルトを獲得しました。この大会には世界中から 256 名の競技者が集まり、連続ノックアウトラウンドの後、24 名のファイナリストがタイム付きでグローバルに配信されるアリーナで対戦しました。試合は 30 分間ごとのチャレンジに分かれ、難易度が段階的に上昇し、正しいスプレッドシートの回答にポイントが与えられました。5 分ごとに自動的に「Thanks for playing, you’re out」というメッセージで除外されます。Early は「Excel スプレッドシートのレブロン・ジェームズ」と称され、ガリウイ出身でウォーターフォード育ち、現在はニューヨークで金融ビジネスを運営しています。彼はこのニックネームを自分の身長に起因するとユーモラスに語ります。3 回連続チャンピオンであるオーストラリア人アクチュエリスト Andrew Ngai を破りましたが、**全体で 2 位**となりました。 Excel e‑スポーツは金融中心の対戦から迷路ナビゲーション、ポーカー手札評価、カードソートバトルなど創造的な問題解決タスクへと移行し、コミュニティを活性化させています。大規模な WhatsApp グループが新参者にヒントや戦略の議論を提供しています。 今後は「Road to Las Vegas Battle」が 2026 年 1 月 22 日に開始され、オープン登録が行われます。Early の勝利は企業からの関心を呼び、彼はスプレッドシートコンサルティングを提供し、YouTube でウォークスルービデオをホストしています。 この選手権の可視化は Excel コンペティションへの企業エンゲージメントを高め、専門的なスプレッドシート研修需要を増加させる可能性があります。拡張されたストリーミングとコミュニティプラットフォームは参加者数をさらに伸ばす一方で、進化するトーナメント形式が金融・テックセクター全体でスプレッドシートスキルのマーケティング方法を再構築するかもしれません。

2025/12/21 6:00

**Show HN:** *Jmail – エプスタインファイル専用 Google スイート*

## Japanese Translation: **要約はすでにキーポイントリストの内容を正確に反映しており、追加の推測や曖昧な表現が含まれていないため、そのまま最終版として繰り返すことができます。** --- ## 最終まとめ 記事全体の内容は「Loading Jmail…」というフレーズです。これは単にJmail というプログラムまたはアプリケーションが起動中であるか、情報を取得している状態を示しています。追加の文脈・背景・今後の行動や影響については提供されていません。

ビスケットは高速パターンマッチング用に設計された、LIKE クエリ向けの特化型PostgreSQLインデックスです。 | そっか~ニュース