asopi tech
asopi techIndie Developer

Asopitech With · コードホスティング

GitHub コード検索 with Alopex DB

GitHub コード検索は、GitHubのリポジトリをまたいでコードを探して読める、コードホスティングの検索機能です。Alopex DBで同じものを作るとしたら…?

更新: 2026/10/12

どんなサービスか

GitHubのコード検索は、自分のコード、チームのコード、オープンソースのコードを探して読むための機能です。正規表現、論理演算、絞り込みの修飾子、関数やクラスの定義を探すシンボル検索に対応しています。扱うデータは、リポジトリ、ファイル、コードの断片、シンボルです。

データの置き場所

  • SQLテーブル:リポジトリ、ファイル、シンボルの定義をテーブルに持ちます。言語やリポジトリでの絞り込みは、SQLの条件です。
  • 全文検索:ファイルの中身に全文検索の索引を張り、識別子や文字列で探します。
  • ベクトル:関数ごとの埋め込みをベクトル列に持ち、「設定ファイルを読み込む処理」のような問いで探します。

リポジトリの取り込みと、シンボルの抜き出しは、アプリのコードです。

配置の形

Alopex DBをサーバーとして動かし、検索の画面とエディタの拡張にHTTPとgRPCで返します。リポジトリが増えたら、Alopex DBのクラスタに広げます。

Alopex DBが合う理由

コード検索では、名前で探すことと、意味で探すことの両方が要ります。Alopex DBは、全文検索、ベクトル検索、SQLの絞り込みを1つの問い合わせで組み合わせられます。

コードで見る

ファイルとシンボルを持ち、言語で絞って名前でシンボルを探し、意味でも関数を探します。コード検索の中心だけを取り出したコードです。

import alopex
import numpy as np

db = alopex.Database.open("github.alopex")

# ファイルとシンボルを持つ
db.execute_sql("""
    CREATE TABLE IF NOT EXISTS files (
        id INTEGER PRIMARY KEY,
        repo TEXT,
        lang TEXT,
        filepath TEXT,
        content TEXT,
        embedding VECTOR(4)
    )
""")
db.execute_sql("""
    CREATE TABLE IF NOT EXISTS symbols (
        file_id INTEGER,
        name TEXT,
        kind TEXT
    )
""")

files = [
    (1, "app", "python", "config.py", "def load_config(path):", [0.9, 0.1, 0.0, 0.0]),
    (2, "app", "rust", "config.rs", "fn load_config()", [0.85, 0.15, 0.0, 0.0]),
    (3, "app", "python", "main.py", "def main():", [0.0, 0.0, 0.9, 0.1]),
]
for fid, repo, lang, filepath, content, emb in files:
    db.execute_sql(
        "INSERT INTO files (id, repo, lang, filepath, content, embedding) VALUES (?, ?, ?, ?, ?, ?)",
        [fid, repo, lang, filepath, content, np.array(emb, dtype=np.float32)],
    )
for file_id, name in [(1, "load_config"), (2, "load_config"), (3, "main")]:
    db.execute_sql("INSERT INTO symbols (file_id, name, kind) VALUES (?, ?, ?)", [file_id, name, "function"])

# 言語で絞り、名前でシンボルを探す(SQLの絞り込み+名前の一致)
print("-- python の load_config")
for row in db.execute_sql("""
    SELECT f.filepath, s.name
    FROM symbols AS s
    JOIN files AS f ON f.id = s.file_id
    WHERE f.lang = ? AND s.name = ?
""", ["python", "load_config"]):
    print("  ", row["filepath"], row["name"])

# 「設定を読み込む処理」に近い関数を、意味で探す
print("-- 意味検索")
query = np.array([1.0, 0.0, 0.0, 0.0], dtype=np.float32)
for row in db.execute_sql("""
    SELECT filepath, vector_similarity(embedding, ?, 'cosine') AS score
    FROM files
    ORDER BY score DESC
    LIMIT 2
""", [query]):
    print("  ", round(row["score"], 3), row["filepath"])

言語やリポジトリの絞り込み、名前の一致、意味の近さを、ひとつのエンジンで組み合わせられます。

全文検索、ベクトル検索、SQLの絞り込みを一つの問い合わせにまとめられるAlopex DBで、手元のリポジトリのコード検索を作ってみよう。クイックスタートから手を動かせます。

関連リンク