Elasticsearch

Elastic Stackのハート

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

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

New Enjoy an all-new Korean text analyzer, field aliases, and a weighted-average aggregation. Plus, 6.4 brings Kerberos and FIPS 140-2 support. Read More
クエリ

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

分析

ただ条件に合う10のドキュメントを抽出するのと、10億行のログの意味を理解するのではわけが違います。アグリゲーション機能を使用して、データの傾向やパターンを幅広く探ることができます。

スピード

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

瞬時に答えが出れば、データの使いみちは大きく広がります。繰り返し検索や、さらに広範囲の検索を行う余裕が生まれます。

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

スケーラビリティ

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

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

レジリエンシー(回復性)

マシンは壊れるかもしれません。ネットワークが分断されることもあります。Elasticsearchは障害を検知し、クラスターとデータを安全に保って運用を継続します。

Elasticsearchは、設計段階から分散環境での安全な運用を考慮した製品です。

柔軟性

数値、テキスト、地理情報、構造化データ、非構造化データ... あらゆるデータタイプをお任せください。

快適に、楽しく

シンプルでバンザイ

シンプルなことはシンプルなままに。Elasticsearchは、パワーやパフォーマンスを落とすことなく、あらゆるスケールでも簡単に動作します。

クライアントライブラリ

Elasticsearchは、標準のRESTful APIとJSONを使用します。さらにElasticが開発・保守するクライアントライブラリがJava、Python、Net、PHPといった多数の言語で用意されているほか、コミュニティによるクライアントもあります。簡単に使うことができ、操作感もナチュラルです。

                                    curl -H "Content-Type: application/json" -XGET
'http://localhost:9200/social-*/_search' -d '{
  "query": {
    "match": {
      "message": "myProduct"
    }
  },
  "aggregations": {
    "top_10_states": {
      "terms": {
        "field": "state",
        "size": 10
      }
    }
  }
}'
                                
                                    RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
                    new HttpHost("localhost", 9200, "http")));

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());            
searchSourceBuilder.aggregation(AggregationBuilders.terms("top_10_states").field("state").size(10));

SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("social-*");
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);
                                
                                    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
      }
    }
  }
}
                                
                                    SELECT SCORE(), * FROM social-* 
   WHERE match(message, 'myProduct') 
   ORDER BY SCORE() DESC

SELECT state, COUNT(*) AS state_count FROM social-* 
   WHERE match(message, 'myProduct') 
   GROUP BY state LIMIT 10
                                
オプション

セキュリティと監視

クラスターにユーザー名とパスワードを設定したい場合は、セキュリティを使えばOKです。Elasticsearchのパフォーマンスを確認するには、監視を追加しましょう。すべてオプションに含まれています

ユースケースが広がり、セキュリティや監視、アラート、レポート、グラフ探索など、Elasticsearchをさらに活用できるようになります。

HadoopとSpark

Elasticsearch + Hadoop

Hadoopで大量のデータを管理していますか?Elasticsearch-Hadoop(ES-Hadoop)コネクタを活用して、ビッグデータでElasticsearchのリアルタイム検索と分析を行いましょう。