MySQL Chunk

MySQLでのテーブル設計(おすすめの構成)
「最初のチャンクだけにメタデータを紐付ける」または「ドキュメント単位のメタデータと、個々のチャンクを分ける」ために、2つのテーブルに分ける(正規化する) のが最もスマートで、AI移行時にもバグが起きにくくなります。

ドキュメント(元PDF)テーブル: documents
メタデータ(ファイル名、章、作成部署、ルール種別など)を保存します。

    CREATE TABLE documents (
        id INT AUTO_INCREMENT PRIMARY KEY,
        title VARCHAR(255) NOT NULL,       -- 手順書・ルール名
        category VARCHAR(100),             -- 部署やカテゴリ
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );

    チャンク(単元)テーブル: chunks
    分割された中身を保存します。最初のチャンクだけに、親ドキュメントへのリンク(document_id)を持たせるか、あるいは「最初のチャンクフラグ」を持たせます。

    CREATE TABLE chunks (
        id INT AUTO_INCREMENT PRIMARY KEY,
        document_id INT,                   -- 最初のチャンクだけ値を入れ、2番目以降は NULL または 0 にする(※提案の再現)
        chunk_order INT NOT NULL,          -- チャンクの順番(1, 2, 3...)
        content TEXT NOT NULL,             -- MDから変換したテキスト内容
        FOREIGN KEY (document_id) REFERENCES documents(id) ON DELETE SET NULL
    );

    document_id を NULL にしておくことで、検索時に「メタデータを持つ最初のチャンク」と「中身だけの後続チャンク」を明確に区別できる。

    1. PythonでMySQLへデータ移行
      • 現在 SQLite に入っているデータを、Python(mysql-connector-python や pymysql を使用)を使って、WSL2上の MySQL にインポート(吐き出し)します。
      • その際、お話ししていた「最初のチャンクだけにメタデータ(document_id)を紐付ける」ロジックでデータを登録します。
    2. PHPで検索画面とロジックの作成
      • 全文検索(LIKE検索): SELECT * FROM chunks WHERE content LIKE ‘%キーワード%’
      • メタデータ連動検索: メタデータがある最初のチャンク(document_id IS NOT NULL)をフックにして、その前後のチャンクも一緒に引っ張ってくるようなPHPのクエリを書きます。
    pip install mysql-connector-python
    import mysql_connector
    
    # 1. MySQLへの接続設定(PHPのPDO等で設定しているものと同じ情報を入れます)
    config = {
        'user': 'your_username',        # MySQLのユーザー名
        'password': 'your_password',    # MySQLのパスワード
        'host': 'localhost',            # または '127.0.0.1'
        'database': 'your_database_name' # 使用するデータベース名
    }
    
    try:
        # 接続の開始
        conn = mysql_connector.connect(**config)
        cursor = conn.cursor()
    
        # 例:データの取得
        cursor.execute("SELECT * FROM documents")
        rows = cursor.fetchall()
        for row in rows:
            print(row)
    
        # 例:データの挿入(SQLiteから移行する際のイメージ)
        # sql = "INSERT INTO chunks (document_id, chunk_order, content) VALUES (%s, %s, %s)"
        # cursor.execute(sql, (1, 1, "チャンクの内容テキスト..."))
        # conn.commit() # データの書き込みを確定
    
    except mysql_connector.Error as err:
        print(f"エラーが発生しました: {err}")
    
    finally:
        # 必ずクローズする
        if 'cursor' in locals():
            cursor.close()
        if 'conn' in locals():
            conn.close()

    この構成で行う「SQLite ➔ MySQL移行」のイメージ
    Pythonはデータ処理が得意なので、今回のタスクには最適です。

    1. Pythonで SQLite に接続して、保存されているMDデータやメタデータを読み出す。
    2. Pythonで「最初のチャンクだけにメタデータを紐付ける」処理(プログラムでの条件分岐)を施す。
    3. Pythonで MySQL に接続し、加工したデータをそのまま流し込む(バルクインサート)。
      これが完了すれば、あとは慣れているPHPを使ってMySQLからデータを引っ張ってきて検索画面を作る、という理想の役割分担ができます。