はじめに
こんにちは。イメージマジックの宮川です!
最近は暑くて、アイスみたいに溶けそうですね。
ということで!記事第2弾です。今回は業務で使用したElasiticSearchについてです。
基本を改めて簡単にメモ的にまとめたいと思います。
2018/03月入社、前職SIer、現在はPHPとフロントエンド開発しています。
Symfony、Elastic SearchとVue.jsに関心があります。趣味は山登りです。
ElasticSearchとは
Elastic社が開発しているオープンソースの全文検索エンジンです。(Java 7.X以上)
SQLの代わりに、RESTful インターフェースを使って独自のクエリを使って検索します。執筆時点の最新Versionは6.3.2になります。
ちなみに弊社では、Symfonyで使用するため、FOSElasticaBundleを使用しています。
ElasticaというPHP用にElasticsearchを使いやすくしたライブラリがありますが、これをSymfonyに合わせてBundle化したものがFOSElasticaBundle。
ElasticSearch特徴(RDBと比較して)
〇Good Point
・パフォーマンスがRDBと比較して速い(10倍速い場合もある)
・スキーマレス(ドキュメントで扱う)
・外部システムとの連携性〇(curlなどRESTful経由で操作できる)
・スケーラブル(クラスタ構成が前提で実装)
×Bad Point
・トランザクション使用不可
ElasticSearchの論理的構成
1. Index ∋ 2. Type ∋ 3. Filed
RDBで言うとIndex=Database、Type=Table、Document=Row
参照 https://dev.classmethod.jp/server-side/elasticsearch-getting-started-06/
・1. Documentの集合
・2. Indexに登録するDocumentを分類する型や定義を持つ
・3. データの最小単位。複数のフィールドから構成される
※注意 6.Xから1Indexに対して、1Typeのみ作成可能。
ElasticSearchの物理的構成
1. Cluster ∋ 2. Node ∋ 3. Shard
・1. 複数のNodeを一つのESとして動作させる。
・2. ESのインスタンス。ここにデータを格納する。イメージとしてはサーバ。
・3. Indexを分割したもの。primaryとreplicaがある。
primary: インデックスの書き込みと参照処理で使用。これをreplicaにコピー。
replica: インデックスと参照処理で使用。
ElasticSearchの全文検索の仕組み
1. Analyzer ⊇ 2. Char Filters, Tokenizer, Token Filters
・1. 形態素解析(※1)やN-gram(※2)等、データ格納・検索方法を指定。
・2. Char Filters → Tokenizer → Token Filtersでデータを検索する
Char Filters: 正規表現等で文章を検索。
Tokenizer: NGramやスペース等で単語を分ける。(=トークン化という)
Token Filters: 小文字に正規化したり、トークンをフィルタリングする。
※実際に全文検索で単語を分割していくイメージ
参照 https://blog.shibayu36.org/entry/2016/08/15/122913
※1 文章を意味を持つ最小限の単位(=単語)に分解する手法です。
例)
「私は、宮川という名前です。」
⇒ 私 / は / 、 / 宮川 / と / いう / 名前 です / 。※2 指定文字数で文章を分割する手法です。
例(2gram))
「私は、宮川泰三という名前です。」
⇒ 私は / は宮 / 宮川 / 川と / とい / いう / う名 / 名前 / 前で / です / す。
コマンドサンプルたち
1. 状態確認のコマンド
#elasticsearchの状態 curl 'localhost:9200/' # index 確認 curl 'localhost:9200/_cat/indices?v' # node 確認 curl 'localhost:9200/_cat/nodes?v' # cluster 確認 curl 'localhost:9200/_cat/health?v'
2. 作成系のコマンド
# index作成 curl -X PUT 'localhost:9200/newindex' # type作成 # ?prettyをつけると結果をformatしてくれます。 curl -X PUT 'localhost:9200/newindex/newtype/1?pretty' -d ' { "name": "sample" # elastic seach6.X系より以下が必須です。 }' -H 'Content-Type: application/json' # insert or update curl -X PUT 'localhost:9200/newindex/newtype/1?pretty' -d ' { "name": "John Doe" }' -H 'Content-Type: application/json' # delete curl -X DELETE 'localhost:9200/newindex/newtype/1?pretty'
3. 検索系のコマンド
## query curl -X POST 'localhost:9200/newindex/_search?pretty' -d ' { "query": { "bool": { "must": [ { "match": { "name": { "query": "sample", "operator": "and" } } } ] } } } ' -H 'Content-Type: application/json'
参考:
ElasticSearch入門