ども、@kimihomです。
最近は新しい技術勉強って事で Elasticsearch を勉強している。それなりのWebやアプリを持つようになると、ほぼ100%必要になってくるのが"検索"。 しっかりとマスターして、より良いデータ検索と分析ができるようになりたいと思い勉強を始めた。
勉強方法
今までは本とか、日本語のブログとかで勉強していたんだけど、全く頭に入ってこなかった。 日本語であまり整備されていない気がする。そんで最初のElasticsearch 学習は挫折した。
んでもう一度検索が必要になりそうだったので興味を持って再勉強することに。んで最近思うのは、学ぶのに一番いいのは本家ドキュメントを読むことだということ。最新版の情報はやはりオフィシャルに行くしかない。Elasticsearch に関して言えば、本格的な電子書籍としてWebで無償で公開してくれているので、これを読まない手はない。英語だけど・・。
てことで今回のまとめもこの英語ドキュメントからメモとして残しておきたいところをピックアップする。
概要
大規模なデータでも素早い全文検索とデータ解析を可能にする。Wikipedia の膨大なドキュメント検索も Elasticsearch で動いているのだそう。
そもそも全文検索についてなんだけど、SQLの基本を学んだ人は LIKE
というキーワードを知っているかと思う。このLIKE
なんだけど、%
を両サイドで入れる(検索する)と、インデックスが効かなくなっちゃうのよね。これを日本語検索でなんとかするには PostgreSQL とかでは追加のプラグイン(PGRoonga)などを入れる必要がある。Heroku では現在対応していない模様。#herokujpハッシュタグにこのことを呟けば検討してくれるみたいだけど。それでも集計や検索のパフォーマンスにそんなに困ってなければ、困るようになるまで RDBだけの運用とかにしておくのも手だ。なぜなら、検索や集約の為にデータを RDB、Elasticsearch それぞれに保存する必要があるからだ。これらの運用がやはり問題に感じる。この点いろいろ試行錯誤してみんなやってるみたいだ。
高機能な検索とか集計をしたいのであれば、Elasticsearch 導入を検討してみよう。私の場合どうせ今後困ることになるのなら、早めに勉強しておこうという感覚で Elasticsearch を学ぶことにした。
Elasticsearch, Kibana, Sense のインストール
Kibana ってのは Elasticsearch の UI 部分を提供している。Elasticsearch 単体で REST でアクセスすればデータ操作できるけど、Web上でコンソールっぽくいじったり表示したいなら便利っぽい。 Swagger のなかの SwaggerUI みたいなもんか。 あと Sense ってのは REST アクセスをWeb上で手軽に操作できるもの。オフィシャルドキュメントを読むならこれは入れておいたほうがいい。理解度が変わってくる。
インストール方法はそれぞれググって zip ダウンロードして 展開するだけで動くっぽい。楽でいいね。あとサービスが大きくなってレプリケーションとかシャーディングとかの大規模 Elasticsearch にしても基本的な操作はほとんど同じらしい。これもいいね。
用語と基本操作
まず、用語。これは覚えておかないとな。
Relational DB ⇒ Databases ⇒ Tables ⇒ Rows ⇒ Columns Elasticsearch ⇒ Indices ⇒ Types ⇒ Documents ⇒ Fields
index
の複数形はindices
らしい。初めて知ったw
んで、URL は基本 index名/type名/document_id
となっていてシンプル。各リソースに対して GET
,POST
, PUT
, DELETE
すればCRUD(Create, Read, Update, Delete)操作が可能だ。 idは PUT で指定すれば、そのidベースで作られ、POSTで作ればランダムな文字列のidが返されるようだ。
ドキュメントを読む限り、Elasticsearch は 純粋な REST API だ。 GET で情報の取得・検索、 PUT で情報の Upsert, POST で作成, DELETE で削除。 部分的な更新はPOSTで _update ってのを付け加えるみたい。
あと bulk 操作も提供されている。一気にデータを投入したいとかいった場合に使える。この時は割と特徴的な構文だった。これに関してはリンク先で。 Cheaper in Bulk
終わりに
まだまだ読み途中で一番大事な検索の章とか全く読めてないんだけど、読んだ内容のアウトプットとしてこのブログに書いていこうと思う。
いつかは自分のサービスにうまく導入できるようになるといいな。