Edited at

Elasticsearchの概要

More than 1 year has passed since last update.


Elasticsearchとは

ElasticsearchとはElastic社が開発しているオープンソースの分散型全文検索/分析エンジン。

RDBのようにSQLでクエリを書くのではなく、jsonでクエリを作成しPOSTするRESTfulな検索を行う。


特徴


RESTfulな検索

RDBではSQLを用いてデータを検索するが、ESはRESTfulインターフェースを用いてデータを検索する。NoSQLデータベースを使ったことがあるならば受け入れやすいかもしれない。

クエリはjson構造となっており、構造化したクエリを発行できる。


スコアによる検索

Elasticsearchは完全一致による検索だけではなく、関連度の高さ(スコア)による検索結果を提供する。

例えばある単語をあるフィールドから検索する場合、完全一致や部分一致はもちろん、単語の綴りミスを想定した曖昧さを許容する検索から、単語は含まれないものの関連する単語が出ているかを基準としたスコアリングが可能である。

これはTF/IDF(Term Frequency/Inverse Document Frequency)という考え方である。


高速

全文検索エンジンは他にもいくつか存在するが、比較しても圧倒的に高速と言われている。


スケーラブル

Elasticsearchはクラスタ構成上で動作することを前提としており、よって小規模なシステムから大規模なシステムまで対応できる。データの分散、冗長化により高い可用性を誇る。


スキーマレス

RDBはデータの挿入にデータベース定義、テーブル定義などのスキーマ定義が必要ですが、Elasticsearchはこれを必要としません。何も考えず任意のjson構造でデータを登録でき、そこから自動的にスキーマを生成するからです。

ただし、より利用方法にマッチした検索をするならば、スキーマ定義(Elasticsearchではマッピングという)をすることが推奨されます。


マルチテナント

様々なサービスで自由に横断して検索・分析が可能。

「Kibana」というElasticsearch分析クライアントを利用すれば、簡単にデータの視覚化や分析が可能になる。


活用例

全文検索エンジンなので、もちろんドキュメントの検索に利用できる。

文書検索の例

- ブログシステムの記事検索

- SNS系システムの投稿検索

同時にIT/IDFによる関連度のスコアリングを利用すれば、簡単なマッチングシステムを実現できる。

マッチングの例

- SNSなどのユーザーマッチング

- 関連記事設定


Elasticsearchの利用


キーワード

Elasticsearchを利用する前に事前知識として理解しておくべきキーワード


クラスターとノード

ノードは一つのサーバーに該当するもので、クラスターはその集合体。

トラフィックが増加した時はノードを増やすことで処理の分散が可能となっている。


インデックス

RDBのデータベースに相当する概念。一つのインデックスに複数のタイプが紐付きます。


タイプ

RDBのテーブルに相当する概念。


ドキュメント

RDBの各行に相当する概念。idを主キーとして管理されます。


シャード

一つのインデックスを作成すると、複数のシャードが作成される。

これはちょうどRAID構成のハードディスクの関係に近く、デフォルトでは5つのプライマリーシャード(書き込み可能)と、ついとなるレプリカシャード(読み取り専用)が1つづつ作成される。

なお、プライマリーシャードとレプリカシャードは同じノードには配置されないため、シャードの機能を活用するためには最低でも2つのノードが必要となる。


データ登録

検索の対象となるデータの登録は簡単で、エンドポイントへjsonデータをポストするだけ。

PUT /index/type/1

{
"key": "value",
"array": {
"name": "Jhon doe",
"age": 28
}
}

URI末尾の1はドキュメントのidとなるが、すでにデータが存在する場合は上書きとなり、なければ新規作成となる。

なお、この値を指定しない場合は自動的にidが振り分けられるため、新規登録時は指定しなくても良い。


検索

例えば指定した単語を含むドキュメントを検索するクエリは以下のようなものとなる。

GET /index/type/_search

{
"query": {
"match": {
"key": "text"
}
}
}

曖昧検索や重み付けなど様々なクエリがあるので、下記を参照されたし。

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html


マッピング

Elasticsearchにおけるスキーマに相当する概念はマッピングだが、スキーマレスなのでマッピングを定義しなくても良い。しかし、いくつかの要件を満たすためにはマッピングが必要となる。

マッピングが必要になる場合としては、データ型を指定したい場合や文字列の分析方法を指定したい場合である。

文字列の分析方法を指定する状況とは、形態素解析エンジンの指定をしたい場合や、そもそも形態素解析は不要で完全一致のみ認めるレコードを定義したい場合である。例えばブログなどのタグなどは、形態素解析をせずに完全一致のみの検索である方が都合の良いケースが多い。

マッピングもまた、エンドポイントへ下記のようなjsonをPUTするだけで完了する。

PUT /index/type/

{
"mappings": {
"type": {
"properties": {
"name": {
"type": "text",
"index": "not_analyzed"
},
"location": {
"type": "geo_point"
}
}
}
}
}

locationのtypeとしてgeo_pointを指定しているが、これを使用すると後述のKibana上でヒートマップを作成できたりする。

データの分析を行いたい場合はデータ型も適したものを設定する方が良い。

マッピングの詳細な仕様については公式ドキュメントを参照。

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html

なお、マッピングを後から変更することはできず、マッピングを更新するためにはインデックスを削除しなければならない。(*1)


実際の運用における注意事項

これまでの説明でElasticsearchをRDBのように使うことを考えた人がいると思う。しかし、Elasticsearchはあくまで全文検索しエンジンであり、RDBMSを代替するものではない。理由は(*1)で説明した仕様が関係している。


なお、マッピングを後から変更することはできず、マッピングを更新するためにはインデックスを削除しなければならない。


マッピングを更新する場合、インデックスを削除する必要があるが、これはつまり全てのデータを一度破棄する必要があるということである。よってマッピングを更新した上で検索を再度できるようにするためには、再度データの登録が必要である。

よって検索対象となるデータは別に保存しておく必要があり、そのためにRDBが必要となる。

よって実際にシステムへElasticsearchによる検索を実装する際は、データはRDBへ格納した上で、データ更新時にElasticsearchへデータを登録する処理を実装するか、検索対象となるデータをElasticsearchへ登録するバッチサーバー/プログラムが必要となる。


Kibanaについて

KibanaはElasticsearch用の分析ツールです。Elasticsearchを用いた検索はもちろん、データの分析と視覚化が可能。

Elasticsearchを使う上で必須のツールと言える。

ここでは代表的な3つの機能について解説します。


Dev tool

Dev toolではデータの登録・検索・マッピングを含めたデータ操作ができる。

今回の例ではApacheのアクセスログをパースしたものをデータとして検索できるようにしている


Discover

こちらはデータの検索に特化した機能。

GUIベースの操作でデータの掘り下げなどが可能。


Visualize

データを円グラフ、棒グラフなど様々な形式で視覚化することできるツール。

Elasticsearchは強力な全文検索エンジンであると同時に分析ツールであることを、わかりやすく体現してる機能と言える。

ちなみに、この円グラフはアクセスログにおけるHTTPメソッドと、それぞれのステータスコードを視覚化したもの。


おまけ

Kibanaを活用すると生活圏推定もできる。

https://qiita.com/Kender_09/items/5644b0da6d05e218354b


参考文献

https://vitalify.jp/blog/2017/02/elasticsearch_matome.html

https://dev.classmethod.jp/server-side/elasticsearch-getting-started-06/

https://qiita.com/nskydiving/items/1c2dc4e0b9c98d164329#%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E3%82%92%E8%BF%BD%E5%8A%A0

https://dev.classmethod.jp/cloud/aws/amazon-elasticsearch-service-kibana6-tutorial-02/