この用語をシェア
概要・定義
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)により、適切なセキュリティを確保します。