GitHub概要

typesense/typesense

Open Source alternative to Algolia + Pinecone and an Easier-to-Use alternative to ElasticSearch ⚡ 🔍 ✨ Fast, typo tolerant, in-memory fuzzy Search Engine for building delightful search experiences

スター24,009
ウォッチ133
フォーク794
作成日:2017年1月18日
言語:C++
ライセンス:GNU General Public License v3.0

トピックス

algoliadatastoreelasticsearchenterprise-searchfacetingfull-text-searchfuzzy-searchgeosearchin-memoryinstantsearchmerchandisingpineconesearchsearch-enginesemantic-searchsimilarity-searchsite-searchsynonymstypo-tolerancevector-search

スター履歴

typesense/typesense Star History
データ取得日時: 2025/7/30 03:04

Typesenseとは

Typesenseは、Algolia + Pineconeのオープンソース代替品であり、ElasticSearchよりも使いやすい代替品です。高速でタイポ許容性のあるインメモリファジー検索エンジンで、快適な検索体験の構築を目的としています。特にリアルタイム検索やインスタント検索体験に最適化されています。

主な特徴

高速検索エンジン

  • 50ミリ秒未満のレスポンス: スピードに特化した設計で、スムーズで<応的な検索体験を提供
  • メモリファーストアーキテクチャ: 最適化されたC++データ構造と非同期ディスク永続化モデル
  • 数百万クエリ/秒: 大規模データセットでも高スループットを維持
  • シングルバイナリ: 単一の軽量なネイティブバイナリで簡単なセットアップ

タイポ許容性と柔軟性

  • 組み込みタイポ許容: スペルミスやタイポを自動的に処理、検索精度とユーザー満足度を向上
  • Adaptive Radix Tree (ART)インデックス: ファジーマッチングでクエリトークンと候補間の編集距離を算出
  • チューナブルランキング: ランキングルールを設定して検索結果を調整
  • リアルタイム設定: 検索時にクエリパラメータで設定を柔軟に変更可能

ベクトル検索機能

  • HNSWアルゴリズム: 高次元ベクトル空間での効率的な近似最近隣検索
  • ベクトルクエリ構文: field_name:([vector_values], k: number_of_results)形式
  • ハイブリッド検索: テキスト検索とベクトル検索を組み合わせてより関連性の高い結果を提供
  • 距離闾値フィルタ: コサイン距離で0.0、2.0の範囲で結果を制限

高度な検索機能

  • ファセットとフィルタリング: フィールド値と集約に基づいた結果の絞り込み
  • ジオサーチ: 位置情報に基づいた検索機能
  • シノニム: 単語を同等のものとして定義し、検索精度を向上
  • キュレーション: 特定のレコードを固定位置にブーストして特集
  • 音声検索: Whisperモデルで音声を文字起こしして検索

2025年の最新機能

  • JOIN機能: 共通の参照フィールドで複数のコレクションを結合、SQLライクな関係モデル
  • スコープ付きAPIキー: 特定のレコードのみアクセスを許可するAPIキーでマルチテナント対応
  • Raftベースクラスタリング: 高可用性の分散クラスタ設定
  • InstantSearch.js互換性: AlgoliaのJavaScriptライブラリとの直接互換性

メリット・デメリット

メリット

  • セルフホスト可能なオープンソースソリューション
  • 単一インデックスでソート可能(Algoliaはソート順毎に別インデックスが必要)
  • レコード数や検索操作数ではなく固定クラスタ料金でコスト効率が高い
  • 検索時にフィールド、ファセット、ランキング設定を動的に変更可能
  • ランタイム依存関係がなく、簡単なセットアップと運用
  • InstantSearch.jsとの互換性で既存のフロントエンドを再利用可能

デメリット

  • Algoliaのパーソナライゼーションやサーバーベース検索分析機能は未対応
  • AlgoliaやElasticsearchに比べて高度なML/AI機能が限定的
  • 比較的新しいプロジェクトで、エンタープライズ導入事例が限定的
  • GPL-3.0ライセンスの制約で商用利用時に注意が必要

主要リンク

インストール方法

Dockerでのクイックスタート

# Typesenseサーバーの起動
docker run -p 8108:8108 -v/tmp/data:/data typesense/typesense:28.0 \
  --data-dir /data --api-key=Hu52dwsas2AdxdE

バイナリパッケージのインストール

# Linux (x86_64)
wget https://dl.typesense.org/releases/28.0/typesense-server-28.0-linux-amd64.tar.gz
tar -xzf typesense-server-28.0-linux-amd64.tar.gz

# サーバーの起動
./typesense-server --data-dir=/tmp/data --api-key=your-api-key

Typesense Cloud(マネージドサービス)

# クラウドクラスタの作成
# https://cloud.typesense.org/ でクラスタを作成

使用例

基本的なテキスト検索

const Typesense = require('typesense');

// クライアントの初期化
const client = new Typesense.Client({
  'nodes': [{
    'host': 'localhost',
    'port': '8108',
    'protocol': 'http'
  }],
  'apiKey': 'Hu52dwsas2AdxdE',
  'connectionTimeoutSeconds': 2
});

// コレクションの作成
const booksSchema = {
  'name': 'books',
  'fields': [
    {'name': 'title', 'type': 'string'},
    {'name': 'authors', 'type': 'string[]', 'facet': true},
    {'name': 'publication_year', 'type': 'int32', 'facet': true},
    {'name': 'rating', 'type': 'float'}
  ],
  'default_sorting_field': 'rating'
};

await client.collections().create(booksSchema);

// ドキュメントの追加
const documents = [
  {
    'title': '機械学習入門',
    'authors': ['田中太郎'],
    'publication_year': 2023,
    'rating': 4.5
  },
  {
    'title': '深層学習の基礎',
    'authors': ['佐藤花子'],
    'publication_year': 2024,
    'rating': 4.8
  }
];

await client.collections('books').documents().import(documents);

// 検索の実行
const searchResults = await client.collections('books').documents().search({
  'q': '機械学習',
  'query_by': 'title',
  'facet_by': 'authors,publication_year'
});

console.log(searchResults);

ベクトル検索の例

// ベクトルフィールドを含むコレクションスキーマ
const vectorSchema = {
  'name': 'products',
  'fields': [
    {'name': 'name', 'type': 'string'},
    {'name': 'description', 'type': 'string'},
    {'name': 'embedding', 'type': 'float[]', 'num_dim': 512}
  ]
};

await client.collections().create(vectorSchema);

// ベクトルデータを含むドキュメントの追加
const vectorDocuments = [
  {
    'name': 'MacBook Pro',
    'description': '高性能なノートPC',
    'embedding': Array(512).fill(0).map(() => Math.random())
  },
  {
    'name': 'iPad Air',
    'description': '軽量タブレット',
    'embedding': Array(512).fill(0).map(() => Math.random())
  }
];

await client.collections('products').documents().import(vectorDocuments);

// ベクトル検索の実行
const queryVector = Array(512).fill(0).map(() => Math.random());
const vectorResults = await client.collections('products').documents().search({
  'q': '*',
  'vector_query': `embedding:([${queryVector.join(',')}], k: 5)`,
  'query_by': 'name'
});

console.log('ベクトル検索結果:', vectorResults);

ハイブリッド検索の例

// テキストとベクトルを組み合わせたハイブリッド検索
const hybridResults = await client.collections('products').documents().search({
  'q': 'MacBook',
  'query_by': 'name,description',
  'vector_query': `embedding:([${queryVector.join(',')}], k: 10, alpha: 0.7)`,
  'facet_by': 'category',
  'filter_by': 'price:>1000'
});

console.log('ハイブリッド検索結果:', hybridResults);

Pythonでの使用例

import typesense

# クライアントの初期化
client = typesense.Client({
    'nodes': [{
        'host': 'localhost',
        'port': '8108',
        'protocol': 'http'
    }],
    'api_key': 'Hu52dwsas2AdxdE',
    'connection_timeout_seconds': 2
})

# コレクションの作成
schema = {
    "name": "articles",
    "fields": [
        {"name": "title", "type": "string"},
        {"name": "content", "type": "string"},
        {"name": "vector", "type": "float[]", "num_dim": 128}
    ]
}

client.collections.create(schema)

# ドキュメントの追加
documents = [
    {
        "title": "AIの未来",
        "content": "人工知能技術の発展と将来展望",
        "vector": [0.1] * 128
    },
    {
        "title": "機械学習アルゴリズム",
        "content": "数学的モデルでデータからパターンを学習",
        "vector": [0.2] * 128
    }
]

client.collections['articles'].documents.import_(documents)

# ハイブリッド検索
query_vector = [0.15] * 128
results = client.collections['articles'].documents.search({
    'q': 'AI 機械学習',
    'query_by': 'title,content',
    'vector_query': f'vector:([{",".join(map(str, query_vector))}], k: 5, alpha: 0.6)'
})

for hit in results['hits']:
    print(f"タイトル: {hit['document']['title']}")
    print(f"スコア: {hit['text_match']}")
    print("---")

主要ユースケース

  • Eコマースサイト: 商品検索とフィルタリング
  • ドキュメント検索: 社内ナレッジベースやヘルプセンター
  • コンテンツ管理システム: ブログやニュースサイトの検索
  • メディアライブラリ: 画像や動画のメタデータ検索
  • 企業内検索: データベースやファイルシステムの統合検索
  • あいまい検索: チャットボットやQ&Aシステム

まとめ

Typesenseは、AlgoliaやPineconeの優秀なオープンソース代替品です。高速性、タイポ許容性、ベクトル検索機能を統合し、セルフホスト可能でコスト効率の高いソリューションです。特に中小規模から中規模のプロジェクトで、高品質な検索体験を手軽に実現したい組織にとって魅力的な選択肢です。