Elasticsearch

データベース | IT用語集

この用語をシェア

概要・定義

Elasticsearchは、Apache Luceneをベースとした分散型でスケーラブルな全文検索エンジンおよび分析エンジンです。2010年にShay Banonによって開発され、現在はElastic N.V.によって提供されています。JSON形式のドキュメントをインデックス化し、複雑な検索クエリをリアルタイムで高速に実行できます。単体での使用はもちろん、ELK Stack(Elasticsearch、Logstash、Kibana)の一部として、ログ分析、アプリケーション検索、ビジネスインテリジェンス、セキュリティ分析など、多様な用途で使用されています。近年では、機械学習機能も統合され、異常検知や予測分析にも活用されています。

主要な特徴・利点

1. 高速でスケーラブルな検索

分散アーキテクチャにより、複数ノードにデータを分散して保存・検索を行います。レプリケーション機能により高可用性を実現し、水平スケーリングによって大量のデータと高い検索負荷に対応できます。

2. リアルタイム検索と分析

データの投入からほぼリアルタイム(通常1秒以内)で検索が可能になります。集計機能(Aggregations)により、リアルタイムでの統計分析、トレンド分析、ダッシュボードの作成が可能です。

3. 柔軟なクエリ機能

全文検索、フィルタリング、地理空間検索、範囲検索など、多様な検索タイプをサポートします。Bool クエリ、Match クエリ、Aggregations などの豊富なクエリ DSL(Domain Specific Language)を提供します。

4. スキーマレス設計

データ構造を事前に定義する必要がなく、JSONドキュメントを投入するだけで自動的にスキーマを推測します。動的マッピングにより、新しいフィールドが自動的に追加されます。

使用例・実装方法

基本的なインデックス操作

# インデックス作成
PUT /products
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "standard"
      },
      "category": {
        "type": "keyword"
      },
      "price": {
        "type": "double"
      },
      "description": {
        "type": "text"
      },
      "created_at": {
        "type": "date"
      }
    }
  }
}

# ドキュメントの追加
POST /products/_doc/1
{
  "name": "MacBook Pro",
  "category": "laptop",
  "price": 1999.99,
  "description": "高性能なプロフェッショナル向けノートパソコン",
  "created_at": "2024-01-15T10:00:00Z"
}

# 複数ドキュメントの一括追加
POST /products/_bulk
{ "index": { "_id": "2" } }
{ "name": "iPhone 15", "category": "smartphone", "price": 999.99, "description": "最新のスマートフォン", "created_at": "2024-01-16T10:00:00Z" }
{ "index": { "_id": "3" } }
{ "name": "iPad Air", "category": "tablet", "price": 599.99, "description": "軽量で高性能なタブレット", "created_at": "2024-01-17T10:00:00Z" }

検索クエリの例

# 全文検索
GET /products/_search
{
  "query": {
    "match": {
      "description": "高性能"
    }
  }
}

# 複合検索(価格範囲 + カテゴリ)
GET /products/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "price": {
              "gte": 500,
              "lte": 1500
            }
          }
        }
      ],
      "filter": [
        {
          "term": {
            "category": "laptop"
          }
        }
      ]
    }
  },
  "sort": [
    {
      "price": {
        "order": "desc"
      }
    }
  ]
}

# 集計(カテゴリ別統計)
GET /products/_search
{
  "size": 0,
  "aggs": {
    "categories": {
      "terms": {
        "field": "category"
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        },
        "max_price": {
          "max": {
            "field": "price"
          }
        }
      }
    }
  }
}

ログ分析の例

# ログインデックス作成
PUT /application_logs
{
  "mappings": {
    "properties": {
      "timestamp": {
        "type": "date"
      },
      "level": {
        "type": "keyword"
      },
      "message": {
        "type": "text"
      },
      "user_id": {
        "type": "keyword"
      },
      "ip_address": {
        "type": "ip"
      },
      "response_time": {
        "type": "integer"
      }
    }
  }
}

# エラーログの検索
GET /application_logs/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "level": "ERROR"
          }
        },
        {
          "range": {
            "timestamp": {
              "gte": "2024-01-15T00:00:00Z",
              "lte": "2024-01-15T23:59:59Z"
            }
          }
        }
      ]
    }
  },
  "sort": [
    {
      "timestamp": {
        "order": "desc"
      }
    }
  ]
}

# 時間別エラー数の集計
GET /application_logs/_search
{
  "size": 0,
  "query": {
    "term": {
      "level": "ERROR"
    }
  },
  "aggs": {
    "errors_over_time": {
      "date_histogram": {
        "field": "timestamp",
        "calendar_interval": "hour"
      }
    }
  }
}

Node.jsでの実装例

const { Client } = require('@elastic/elasticsearch');

const client = new Client({
  node: 'http://localhost:9200'
});

// ドキュメント追加
async function addProduct(product) {
  try {
    const response = await client.index({
      index: 'products',
      body: product
    });
    console.log('製品が追加されました:', response);
  } catch (error) {
    console.error('エラー:', error);
  }
}

// 検索実行
async function searchProducts(query) {
  try {
    const response = await client.search({
      index: 'products',
      body: {
        query: {
          match: {
            description: query
          }
        }
      }
    });
    
    return response.body.hits.hits;
  } catch (error) {
    console.error('検索エラー:', error);
    return [];
  }
}

// 使用例
addProduct({
  name: "Dell XPS 13",
  category: "laptop",
  price: 1299.99,
  description: "コンパクトで高性能なビジネスノートパソコン",
  created_at: new Date()
});

searchProducts("高性能").then(results => {
  console.log('検索結果:', results);
});

ELK Stackとの連携

Logstash

ログの収集、変換、転送を行うデータ処理パイプラインです。様々なデータソースからログを収集し、フィルタリングや加工を行った後、Elasticsearchに送信します。

Kibana

Elasticsearchのデータを可視化するWebインターフェースです。ダッシュボード、チャート、地図などの形で、データを直感的に表示・分析できます。

Beats

軽量なデータ収集エージェントです。Filebeat(ログファイル)、Metricbeat(システムメトリクス)、Packetbeat(ネットワーク)など、用途別に特化したエージェントが提供されています。

導入時の注意点・ベストプラクティス

1. クラスター設計

本番環境では最低3つのマスターノードを設定し、脳分裂(split-brain)を防ぎます。データノードとマスターノードを分離し、インデックスのシャード数とレプリカ数を適切に設定します。

2. パフォーマンス最適化

インデックステンプレート、マッピング、アナライザーを適切に設定し、検索性能を向上させます。不要なフィールドの_sourceからの除外、適切なrefresh間隔の設定により、パフォーマンスを最適化します。

3. 監視と運用

クラスターの健全性、インデックスサイズ、検索パフォーマンスを継続的に監視します。ログローテーション、古いインデックスの削除、スナップショットによるバックアップを定期的に実行します。

4. セキュリティ対策

X-Pack Securityを使用して認証・認可を設定し、TLS/SSL暗号化を有効にします。APIキーベースの認証、ロールベースアクセス制御(RBAC)により、適切なセキュリティを確保します。

関連Webサイト

この用語についてもっと詳しく

Elasticsearchに関するご質問や、システム導入のご相談など、お気軽にお問い合わせください。