Elasticsearch

Elastic Stackのハート

Elasticsearchは、様々なユースケースを解決する、分散型RESTful検索/分析エンジンです。予期した結果や、そうでないものまで検索できるようにデータを格納するElastic Stackの中核です。

Elasticsearchをはじめてみよう。 ビデオをみる

New More secure, ludicrously fast, and packed with new features including super efficient numbers and a secure new built-in scripting language. Read More

クエリ

好奇心を忘れない。あらゆるデータを検索。

Elasticsearchは、構造型から非構造型、地理情報、メトリックなど、多様なタイプの検索に対応します。まずは簡単なクエリを実行してみて、どんな結果が返ってくるか試してみてください。
分析

一歩下がって全体像を見る。

ただ条件に合う10のドキュメントを抽出するのと、10億行のログの意味を理解するのではわけが違います。Aggregationを使用すれば、ズームアウトして、データの傾向やパターンを探ることができます。

スピード

Elasticsearchは速い。
とにかく速い。

瞬時に答えが得られることで、データとの関係は大きく変わります。繰り返し、もっと広範囲の検索もできる余裕が生まれます。

これほどのスピードを実現することは簡単ではありません。全文検索のための有限状態トランスデューサを使用した転置インデックスや、数値データや地理データを格納するためのBKDツリー、分析用のカラムストアが実装されています。

すべてインデックスされているので、「このデータにインデックスがあったらなあ」と思うこともなく、すべてのデータに驚異的なほど高速にアクセスできます。

スケーラビリティ

ノートPCから、ペタバイト単位のデータを処理する何百台ものサーバーまで。

Elasticsearchのクラスタは、プロトタイプからプロダクションまでスムーズに移行できます。1つのノードで実行中でも、300ノードのクラスタで実行中でも、同じようにアクセスできます。

毎秒処理される膨大なイベントの数に応じて水平にスケールすると同時に、クラスタ全体に渡るインデックスとクエリの分散は自動的に調整されるため、極めてスムーズな操作が実現されます。

操作の楽しみ

シンプルでバンザイ

シンプルなことはシンプルであるべき。Elasticsearchは、パワーやパフォーマンスを落とすことなく、どんなスケールでも簡単に動作するように工夫されています。

クライアントライブラリ

好きなプログラミング言語でアクセスできます

Elasticsearchは、標準のRESTful APIとJSONを使用します。クライアントライブラリの開発と保守はJava、Python、.Net、Groovyといった多数の言語で行われているのに加え、コミュニティによる貢献も多くあります。簡単に使え、操作感もナチュラルです。Elasticsearchの可能性が無限なのと同様に、やりたいことにも限界を決めることはないのです。 もっと詳しく

                                    curl -XGET 'http://localhost:9200/social-*/_search' -d '{
  "query": {
    "match": {
      "message": "myProduct"
    }
  },
  "aggregations": {
    "top_10_states": {
      "terms": {
        "field": "state",
        "size": 10
      }
    }
  }
}'
                                
                                    TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
   .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));

SearchResponse sr = client.prepareSearch()
 .setQuery(QueryBuilders.matchQuery("message", "myProduct"))
 .addAggregation(AggregationBuilders.terms("top_10_states")
 .field("state").size(10))
 .execute().actionGet();

client.close();
                                
                                    var client = new ElasticClient();

var searchResponse = client.Search<Tweet>(s => s
    .Index("social-*")
    .Query(q => q
        .Match(m => m
            .Field(f => f.Message)
            .Query("myProduct")
        )
    )
    .Aggregations(a => a
        .Terms("top_10_states", t => t
            .Field(f => f.State)
            .Size(10)
        )
    )
);
                                
                                    from elasticsearch import Elasticsearch

esclient = Elasticsearch(['localhost:9200'])
response = esclient.search(
index='social-*',
body={
    "query": {
        "match": {
            "message": "myProduct"
        }
    },
    "aggs": {
        "top_10_states": {
            "terms": {
                "field": "state",
                "size": 10
            }
        }
    }
}
)
                                
                                    var elasticsearch = require('elasticsearch');
var esclient = new elasticsearch.Client({
  host: 'localhost:9200'
});
esclient.search({
  index: 'social-*',
  body: {
    query: {
      match: { message: 'myProduct' }
    },
    aggs: {
      top_10_states: {
        terms: {
            field: 'state',
            size: 10
        }
      }
    }
  }
}
).then(function (response) {
    var hits = response.hits.hits;
}
);
                                
                                    $esclient = Elasticsearch\ClientBuilder::create()
              ->setHosts(["localhost:9200"])
              ->build();
$params = [
'index' => 'social-*',
'body' => [
    'query' => [
        'match' => [ 'message' => 'myProduct' ]
    ],
    'aggs' => [
        'top_10_states' => [
            'terms' => [
                'field' => 'state',
                'size' => 10,
            ]
        ]
    ]
]
];
$response = $esclient->search($params);
                                
                                    use Search::Elasticsearch;

my $esclient = Search::Elasticsearch->new( nodes => 'localhost:9200' );
my $response = $esclient->search(
index => 'social-*',
body => {
        query => {
            match => { message => 'myProduct' }
        },
        aggs => {
            top_10_states => {
                terms => {
                    field => 'state',
                    size => 10
                }
            }
        }
    }
);
                                
                                    require 'elasticsearch'

esclient = Elasticsearch::Client.new

response = esclient.search index: 'social-*', body: {
  query: {
    match: {
      message: 'myProduct'
    }
  },
  aggregations: {
    top_10_states: {
      terms: {
        field: 'state',
        size: 10
      }
    }
  }
}
                                
エンタープライズ対応

セキュリティと監視。

クラスタにユーザー名とパスワードを設定したい場合は、SecurityをインストールすればOKです。Elasticsearchのパフォーマンスを知りたければ、Monitoringを追加しましょう。すべてX-Packに含まれています

X-Packをインストールすれば、ユースケースが広がり、SecurityやMonitoring、Alerting、Reporting、Graph探索など、Elasticsearchをフルに活用できるようになります。

HADOOPとSPARK

ElasticsearchとHadoopを組み合わせる

Hadoopで大量のデータを管理していますか? Elasticsearch-Hadoop (ES-Hadoop)コネクターを使って、Elasticsearchのリアルタイム検索と分析機能をビッグデータに加えることができます。これが二つの世界を繋ぐ最適な方法です。