DockerでTypesenseをデプロイする:アプリケーション向けの高速なインスタントサーチを構築する方法

Database tutorial - IT technology blog
Database tutorial - IT technology blog

なぜElasticsearchやSQLではなくTypesenseを選ぶのか?

SQLのLIKE %query%コマンドで検索を試みたことがあるなら、データが数十万行に達したときにシステムがフリーズする様子を目にしたことがあるでしょう。Elasticsearchは一般的な代替案ですが、メモリを大量に消費します。通常、Elasticsearchを安定して起動させるだけでも、少なくとも2GBのRAMが必要です。

Typesenseは、より軽量な選択肢です。C++で記述され、完全にメモリ(RAM)上で動作するため、レスポンス速度(レイテンシ)を常に50ms以下に維持できます。

実際、Typesenseサーバーは10万件のレコードをスムーズに処理するために約200MBのRAMしか必要としません。このツールは、複雑な設定なしでTypo Tolerance(タイポトレランス:入力ミス許容)やFaceting(ファセッティング)を標準サポートしています。Algoliaのような「入力するそばから結果が出る」検索機能を、ほぼゼロのホスティング費用で構築するのに理想的な選択肢です。

コアコンセプト

始める前に、以下の4つの基本要素を理解しておく必要があります。

  • Collections: SQLのテーブルに相当します。同じ種類のデータのグループを保存する場所です。
  • Documents: JSON形式の具体的なレコードです。
  • Fields: 情報のフィールド(例:製品名、価格)です。
  • Schema: データ型を定義し、どのフィールドをインデックス化するかを規定する設計図です。

Dockerを使って5分でTypesenseをデプロイする

Dockerを使用すると、現在のシステムに影響を与えることなくTypesenseを素早くインストールできます。環境変数をより簡単に管理するために、docker-composeを使用するのが最善の方法です。

1. docker-compose.ymlファイルの作成

プロジェクトディレクトリを作成し、以下の内容でdocker-compose.ymlファイルを追加します。

services:
  typesense:
    image: typesense/typesense:26.0
    container_name: typesense
    restart: on-failure
    ports:
      - "8108:8108"
    volumes:
      - ./typesense-data:/data
    command: 
      - '--data-dir' 
      - '/data' 
      - '--api-key=huongdanit_secret_key' 
      - '--enable-cors'

パラメータに関する注意点:

  • 8108: デフォルトの接続ポート。
  • --api-key: APIを操作するためのセキュリティキー。本番環境では、より長いランダムな文字列に変更することをお勧めします。
  • --enable-cors: ブラウザからAPIを直接呼び出すことを許可します。フロントエンドサーチを実装する際に非常に重要です。

2. コンテナの起動

ターミナルで次のコマンドを実行します。

docker-compose up -d

ステータスを確認するには、http://localhost:8108/healthにアクセスしてください。ブラウザに{"ok":true}と表示されれば、システムの準備は完了です。

実践:スキーマの作成とデータのインポート

サーバーが起動したら、データの構造を定義する必要があります。

ステップ1:製品のスキーマを作成する

curlを使用して、productsという名前のコレクションを作成します。

curl "http://localhost:8108/collections" \
  -X POST \
  -H "X-TYPESENSE-API-KEY: huongdanit_secret_key" \
  -d '{
    "name": "products",
    "fields": [
      {"name": "title", "type": "string" },
      {"name": "category", "type": "string", "facet": true },
      {"name": "price", "type": "float" },
      {"name": "rating", "type": "int32" }
    ],
    "default_sorting_field": "rating"
  }'

ステップ2:データの一括インポート

Typesenseは、インポート速度を最大化するためにJSONL形式(1行が1つのJSONオブジェクト)を必要とします。ExcelなどのCSVファイルがある場合は、まずJSONに変換してください。

ヒント: toolcraft.appなどの変換ツールを使用すれば、データの流出を心配することなく、ブラウザ上でサンプルデータを素早く処理できます。

products.jsonlファイルが用意できたら、データをシステムに投入します。

curl "http://localhost:8108/collections/products/documents/import?action=create" \
  -X POST \
  -H "X-TYPESENSE-API-KEY: huongdanit_secret_key" \
  --data-binary "@products.jsonl"

検索クエリ:インスタントサーチの威力

タイポのあるキーワードで検索を試してみましょう(例:「iphone」の代わりに「ipone」):

curl "http://localhost:8108/collections/products/documents/search?q=ipone&query_by=title" \
  -H "X-TYPESENSE-API-KEY: huongdanit_secret_key"

Typesenseは、近似一致の結果をhighlight(ハイライト)情報と共に返します。この機能により、UI上で一致したキーワードを太字で表示することができ、ユーザーに非常にスムーズな検索体験を提供できます。

本番環境でTypesenseを最適化するためのヒント

システムをより安定して運用するための重要な注意点は以下の通りです。

  1. APIキーの権限管理: フロントエンドでAdmin Keyを絶対に使用しないでください。権限を制限し、データの検索のみを許可する「Search Only Key」を作成しましょう。
  2. RAMの監視: データはRAM上に保持されるため、空き容量が20%を下回ったときにアラートが飛ぶように設定してください。RAMがいっぱいになると、コンテナが突然クラッシュ(OOM)する可能性があります。
  3. エイリアス(Aliases)の使用: products_v1を指すエイリアスproducts_liveを作成することをお勧めします。すべてのデータをproducts_v2に再インデックスする必要がある場合、サービスを中断することなくエイリアスの向き先を変更するだけで済みます。
  4. バックアップ戦略: Typesenseは/dataディレクトリ内のハードディスクにログを書き込みます。データ損失を防ぐため、このディレクトリの定期的なバックアップスケジュールを確保してください。

結論

Typesenseは、パフォーマンスとシンプルさの素晴らしいバランスを実現しています。Dockerを使用すれば、デプロイは数分で完了し、サーバー構成に苦労する代わりに機能開発に集中できます。低コストなインフラでスマートな検索エンジンが必要な場合は、ぜひTypesenseを試してみてください。

この記事が、満足のいく検索システムの構築に役立つことを願っています。インストールプロセスでエラーが発生した場合は、下のコメント欄でお知らせください。サポートさせていただきます!

Share: