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で、手元のリポジトリのコード検索を作ってみよう。クイックスタートから手を動かせます。