ハイブリッド検索
Notariumの検索は、互いを補い合う独立したチャネルで構成されています。全文検索(字句検索)は常に利用でき、設定は不要です。意味に基づくセマンティック検索と、グラフのリンクを考慮する仕組みは、その上に重ねるオプションの層です。各チャネルの結果はひとつのランキングに統合され、オプション層が利用できない場合でも、検索はエラーを出さずに全文で動作し続けます。
3つのチャネル
| チャネル | 何をするか | いつ機能するか |
|---|---|---|
| 字句(FTS/BM25) | 単語やフレーズの正確な一致を見つけ、BM25でランク付けする | 常時、設定不要 |
| セマンティック(ベクトル) | 共通する単語がなくても、意味的に近いものを見つける | オプション(VECTOR_SEARCH) |
| グラフブースト | [[ウィキリンク]]をたどってヒットの隣接ノートを引き寄せる | オプション(GRAPH_BOOST)、デフォルトは無効 |
字句チャネルは土台です。起動直後から動作し、追加でインストールするものは何もありません。セマンティックチャネルは意味の理解(類義語、言い換え)を、グラフブーストはノート間のリンクの知識を加えます。
結果の統合のしくみ
各チャネルはRRFアルゴリズム(Reciprocal Rank Fusion、k=60)で統合されます。それぞれのチャネルが独自のランク付きリストを生成し、RRFはそれらを比較できない「生の」スコアではなく順位によって共通のランキングにまとめます。こうして字句的な一致と意味的な近さがともに重み付けされます。統合はノート単位で、その安定した識別子に基づいて行われます。
flowchart LR
q([クエリ]) --> fts[字句 · FTS/BM25]
q --> vec[セマンティック · ベクトル]
q --> gr[グラフ · 1-hop]
fts --> rrf{RRF融合}
vec --> rrf
gr --> rrf
rrf --> res([結果])
セマンティックが利用できない場合
セマンティック層は無効になっていたり、利用できなかったりすることがあります。VECTOR_SEARCHが有効になっていない、ベクトルスタックがインストールされていない、モデルが読み込まれなかった、クエリベクトルの計算がタイムアウトした、といった場合です。いずれの場合もクエリは字句チャネルによって処理されます。検索は常に応答し、セマンティックがないからといってエラーを出すことはありません。
ベクトル検索は重量級のネイティブスタック(ディスク上で約660 MB)を引き込み、埋め込みモデルをメモリに読み込みます(数百MBのRAM)。そのため公開イメージではデフォルトで無効になっています。有効化の方法とモデルの選び方は検索のセットアップで扱います。
どこで検索するか
- Spotlight / OmniSearch — ノートへの高速でランク付けされたジャンプ。ここでは完全なハイブリッドが機能します。単語の正確な一致だけでなく、関連性が重視されます。検索とSpotlightを参照してください。
- フィードフィルタ(フィードの
?q=)— コーパス全体に対する字句フィルタです。用語が実際に登場するノートを残し、フォルダ・タグ・日付のフィルタと組み合わさります。
インデックスとその再構築
検索インデックスは派生した知識です。ファイルから構築され、再スキャンで完全に復元できます。インデックスはスペースごとに1つです。埋め込みモデルの変更はマイグレーションではなく、ベクトル部分のゼロからの再構築です。大規模なコーパスでのベクトルインデックスの初回構築は数分、場合によっては数時間かかります。その間、インターフェースには「Building search index…」インジケータが表示されますが、検索自体は字句モードで利用可能なままです。
関連トピック: ナレッジグラフ — 第3のチャネルがどこから来るか、検索のセットアップ — セマンティックの有効化とティアの選択、File-first — なぜインデックスが復元可能か。