Skip to content

[BUG] search --semantic がembed済みでも「No embeddings found」エラー #124

@Kewton

Description

@Kewton

再現手順

commandindexdev index --path .
commandindexdev embed --path .
# → Total sections: 77829 / Generated: 58692 / Duration: 774.25s

commandindexdev status --detail
# → Embedding files: 2542 / Embedding model: nomic-embed-text / Embeddings DB: 202.4 MB

commandindexdev search --semantic "fullscreen" --format json --limit 3

期待される動作

embeddingベースのセマンティック検索結果が返される。

実際の動作

Error: No embeddings found. Run `commandindex embed` first.

exitコード1で即座にエラー終了。

追加情報

通常の search "fullscreen" でも以下の警告が出力される:

[hybrid] No embeddings found, using BM25 only.

status コマンドでは Embedding files: 2542 と表示されているため、embedding自体は生成・保存されているが、検索時に認識されていない。

確定した根本原因

コード調査により、以下の原因が確定した:

コンポーネント 参照先DB コード箇所
embed コマンド embeddings.db (EmbeddingStore) src/cli/embed.rs:136
search --semantic symbols.db (SymbolStore) src/cli/search.rs:512-531
search (hybrid) symbols.db (SymbolStore) src/cli/search.rs:643-666
status コマンド embeddings.db (EmbeddingStore) src/cli/status/mod.rs:238
  • embed コマンドは EmbeddingStore 経由で embeddings.db にembeddingを書き込む
  • search --semantichybridSymbolStore 経由で symbols.dbembeddings テーブルを参照する
  • symbols.dbembeddings テーブルにはデータが投入されないため、常に0件となりエラーが発生する
  • status コマンドは正しく embeddings.db を参照しているため、embedding数は正常に表示される

これは設計書(issue-63)で「SymbolStoreのembeddingsテーブルに書き込む」と記載されていたが、実装では別途 EmbeddingStore(embeddings.db)が導入された経緯による設計と実装の乖離が原因。

影響箇所

コード変更が必要な箇所

  • run_semantic_search() — src/cli/search.rs(DB参照先変更)
  • try_hybrid_search() — src/cli/search.rs(DB参照先変更)
  • EmbeddingStore — src/embedding/store.rs(search_similar(), EmbeddingSimilarityResult型の追加。既存count()を活用)
  • エラー型変換 — src/cli/search.rs(EmbeddingStoreErrorSearchErrorの変換追加)
  • 異常系契約: run_semantic_search()NoEmbeddingsエラー、try_hybrid_search() は従来通りgraceful fallback(BM25 only)を維持

テスト変更が必要な箇所

  • tests/e2e_semantic_hybrid.rs — SymbolStore経由のembeddings挿入をEmbeddingStore使用に変更
    • test_embedding_insert_and_count
    • test_semantic_search_basic
    • test_semantic_search_top_k
    • test_context_with_embeddings
    • test_hybrid_auto_switch (ignored)
    • test_hybrid_bm25_fallback (ignored)
  • src/embedding/store.rssearch_similar()のユニットテスト追加(BLOBサイズ検証、dimension mismatchスキップ、ソート順、top_k制限)

新規依存関係

  • cli/searchembedding/store の新規モジュール依存が発生
  • EmbeddingStoreError 変換、EmbeddingSimilarityResult の公開面積拡大
  • 外部crate/サービスの追加なし。Ollama/embedding provider依存の実行時契約は不変

スキーマ差異(注意)

項目 SymbolStore (symbols.db) EmbeddingStore (embeddings.db)
ファイルパスカラム file_path section_path
モデルカラム model_name model

影響

  • セマンティック検索(CommandIndex最大の差別化機能)が完全に利用不能
  • ハイブリッド検索(BM25+embedding RRF)がBM25のみにフォールバックし、検索品質が低下

修正方針

推奨案(A): search コマンドの読み取り先を symbols.db から embeddings.db(EmbeddingStore)に変更する

  • 最小変更で済む
  • 既存の EmbeddingStore のAPI(count(), count_distinct_files())を活用
  • EmbeddingStoreに search_similar() メソッドを追加(SymbolStore側と同等のBLOBサイズ検証・dimension mismatchスキップ・コサイン類似度ソートを維持)
  • cosine_similarity 関数をEmbeddingStoreに追加
  • embeddings.db 未存在・テーブル未作成時の扱い: EmbeddingStoreErrorSearchError::NoEmbeddings またはhybrid fallbackへのマッピングを実装し、AC-4を保証
  • 検索は引き続きbrute-force全件走査(SymbolStore実装と同等)。大規模DB(5万件超)での性能は退行測定対象

代替案(B): embed コマンドの書き込み先を symbols.dbembeddings テーブルに統合する

  • 将来的にはクリーンだが影響範囲が大きい
  • 別Issueでリファクタリングとして対応

受け入れ基準

  • AC-1: embed コマンド実行後、search --semantic がエラーなく検索結果を返す
  • AC-2: search コマンド(hybridモード)で「No embeddings found」警告が出ず、BM25+embeddingのRRF統合結果が返る
  • AC-3: 既存の embeddings.db を持つ環境で再indexなしに検索が動作する(後方互換性)
  • AC-4: embeddings.db が存在しない環境では従来通りのエラーメッセージ/フォールバックが表示される
  • AC-5: cargo test --all が全パス、cargo clippy --all-targets が警告0件
  • AC-6: 検索結果の見出し・本文・タグ補完(enrich_with_metadata())が従来通り維持される

環境

  • commandindex 0.1.0
  • Ollama nomic-embed-text
  • Embeddings DB: 202.4 MB(生成済み)

深刻度

備考

  • 修正時に設計書 dev-reports/design/issue-63-semantic-search-design-policy.md の該当箇所も更新(semantic/hybridの参照先はembeddings.db、symbols.dbはメタデータ補完用という責務分担を明記)
  • status コマンドは機能変更なし(既にembeddings.dbを参照)
  • SymbolStoreのembeddingsテーブル・関連メソッド・ユニットテストは後方互換・段階的削除のため残置。別Issueでリファクタリングとして対応
  • embeddings格納先の一本化リファクタリングは別Issueで対応

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions