プロジェクト専用のMongoDB環境をUbuntu 20.04で構築する

    背景

    • 顔認識システムで、URL、512次元の数値配列、検索結果などを効率よく保存・検索したい。
    • MongoDBの高度なインデックス作成機能がこの用途に適している。
    • Ubuntu 20.04を使用しており、システム全体に影響を与えずにMongoDBを導入したい。

    解決策

    Dockerを使用して、プロジェクト専用のMongoDB環境を構築する。

    手順

    1. Dockerのインストール

    Ubuntu 20.04にDockerをインストールする。

    Dockerがインストールされているか確認

    docker --version
    sudo systemctl status docker

    インストールされていなければ、以下のURLを参照してインストールする。

    Install Docker Desktop on Ubuntu

    2. MongoDBのDockerコンテナーを起動

    専用のディレクトリ(例:/home/user/bin/mongodb)でMongoDBのDockerコンテナーを起動する。

    docker run --name my-mongodb -v /home/user/bin/mongodb/data:/data/db -p 27017:27017 -d mongo

    3. Python仮想環境の作成

    同じディレクトリ内でPythonの仮想環境を作成する。

    python3 -m venv .

    4. 仮想環境をアクティブにする

    source ./bin/activate

    5. MongoDBのPythonドライバーをインストール

    pip install pymongo

    FaissとMongoDBを組み合わせたダミーデータの検索

    必要なパッケージのインストール

    pip install pymongo
    pip install faiss-cpu  # CPU版

    コード例

    1. MongoDBに接続し、ダミーデータを挿入。
    2. Faissのインデックスを作成し、ダミーデータを追加。
    3. テキストファイル(ここではランダムに生成)からクエリベクトルを読み込み、Faissで検索。
    4. 検索結果に一致したURLを標準出力。
    from pymongo import MongoClient
    import numpy as np
    import faiss
    
    # MongoDBに接続
    client = MongoClient('localhost', 27017)
    db = client['my_database']
    collection = db['my_collection']
    
    # ダミーデータを作成
    companies = ['yahoo', 'google', 'microsoft', 'apple', 'amazon']
    dummy_data = []
    for company in companies:
        vec = np.random.rand(512).astype('float32')  # 512次元のベクトル
        url = f"{company}.co.jp"
        dummy_data.append({'company': company, 'vector': vec.tolist(), 'url': url})
    
    # MongoDBにダミーデータを挿入
    collection.insert_many(dummy_data)
    
    # Faissのインデックスを作成
    vectors = np.array([d['vector'] for d in dummy_data]).astype('float32')
    index = faiss.IndexFlatL2(512)
    index.add(vectors)
    
    # テキストファイルからクエリベクトルを読み込む(ここではランダムに生成)
    query_vector = np.random.rand(1, 512).astype('float32')
    
    # Faissで検索
    k = 1  # 近傍点数
    D, I = index.search(query_vector, k)
    
    # 検索結果を出力
    for i in I[0]:
        doc = collection.find_one({'company': companies[i]})
        print(f"検索に一致したURL: {doc['url']}")
    
    print("Faissでの検索と結果の出力が完了しました。")

    出力例

    検索に一致したURL: amazon.co.jp
    Faissでの検索と結果の出力が完了しました。

    起動しているMongoDBコンテナーを停止する

    1. コンテナーのIDまたは名前を確認する: docker ps コマンドを使用して、現在実行中のコンテナーの一覧を表示します。 docker ps このコマンドの出力から、MongoDBコンテナーのIDまたは名前を確認できます。
    2. コンテナーを停止する: docker stop コマンドに、停止したいコンテナーのIDまたは名前を指定します。
      bash docker stop [CONTAINER_ID_OR_NAME]
      例えば、コンテナーのIDが 1234567890ab の場合、以下のように実行します。
      bash docker stop 1234567890ab

    $ docker ps
    CONTAINER ID   IMAGE     COMMAND                   CREATED             STATUS             PORTS                                           NAMES
    d4d93372ebcb   mongo     "docker-entrypoint.s…"   About an hour ago   Up About an hour   0.0.0.0:27017->27017/tcp, :::27017->27017/tcp   my-mongodb
    
    $ docker stop my-mongodb
    my-mongodb
    
    $ docker ps
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

    これで、MongoDBのDockerコンテナーが停止します。


    まとめ

    • Dockerを使用することで、システム全体に影響を与えずにMongoDBを導入できる。
    • Pythonの仮想環境内でMongoDBのPythonドライバー(PyMongo)をインストールすることで、プロジェクト専用の環境を構築できる。
    • FaissとMongoDBを組み合わせることで、高次元のベクトルデータに対する効率的な検索と保存が可能。

    以上です。ありがとうございました。