Elastic Search基本まとめ@2018/07/30

はじめに

こんにちは。イメージマジックの宮川です!
最近は暑くて、アイスみたいに溶けそうですね。

ということで!記事第2弾です。今回は業務で使用したElasiticSearchについてです。
基本を改めて簡単にメモ的にまとめたいと思います。

ElasticSearchとは

https://www.elastic.co/jp/products/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入門