Newer
Older
TelosDB / document / database.md

データベース設計とベクトル検索仕様

本システムは SQLite を、メタデータ管理とベクトル検索エンジンの両方として利用します。

ER図

erDiagram
    items ||--|| vec_items : "id (Primary Key)"
    
    items {
        integer id PK "自動インクリメント"
        text content "文章本文"
        text path "ファイルのパス等のメタデータ"
        datetime created_at "登録日時"
        datetime updated_at "更新日時"
    }
    
    vec_items {
        integer id PK "items.id と一致"
        blob embedding "384次元ベクトル (f32 LE)"
    }

テーブル詳細仕様

1. items テーブル (SeaORM 管理)

アプリケーションの主要なデータを保存します。SeaORM によるマイグレーションと型安全な CRUD が可能です。

カラム名 説明
id INTEGER プライマリキー(自動インクリメント)。
content TEXT ベクトルの元となったテキストデータ。
path TEXT (オプション)ソースファイルのパスやタイトル。
created_at DATETIME 作成時刻。SQLite の datetime('now', 'localtime')
updated_at DATETIME 更新時刻。トリガーにより自動更新。

2. vec_items 仮想テーブル (sqlite-vec)

ベクトル検索を高速に行うための仮想テーブルです。vec0 モジュール (Alex Garcia 氏による sqlite-vec 拡張機能 / vec0.dll) を使用します。

CREATE VIRTUAL TABLE vec_items USING vec0(
  id INTEGER PRIMARY KEY,
  embedding FLOAT[384]
);
  • id: items テーブルの ID と 1:1 で対応させます。
  • embedding: 384次元の浮動小数点配列。内部的には BLOB として保存されます。

ベクトル検索の仕組み

検索には MATCH 句を使用します。これは sqlite-vec 特有の構文で、最も類似度の高いアイテムから順に、計算された「距離」とともに返却します。

SELECT
  i.id,
  i.content,
  v.distance
FROM vec_items v
JOIN items i ON v.id = i.id
WHERE embedding MATCH ?
ORDER BY distance
LIMIT 10;

距離計算アルゴリズム

デフォルトでは L2 距離 (Euclidean distance) または検索パラメーターにより コサイン類似度 が使用されます。本システムの現在の実装では sqlite-vec の標準的な MATCH を利用しています。

注意事項

  • 同期: items への登録と vec_items への登録は、アトミックなトランザクションとして扱われます(Rust 側で保証)。
  • 次元数: 使用するモデル (Gemma 3 300M) に合わせて 384 次定数として定義されています。モデルを変更する場合は、仮想テーブルの再構築が必要です。