Amazon Elasticsearch Serviceではじめる検索

こんにちは。ご無沙汰しています。せとです。

梅雨の中休みと言いますか、今年は雨が少ないような気がいたします。

さて、弊社ではいろいろなWebサービスや、モバイルアプリや、そのバックエンドなどを開発、運用をしていますが、単純な負荷計算がしづらく困るのが横断検索や全文検索といったデータ量が大きくなりやすい部分です。

そういった負荷の計算がおろそかもしくは、不適当な場合、サービスが小さい時にはその検索する範囲が小さいため、問題が表面化しづらく、扱うデータ量が大きくなってきますと、ハードウェアの負荷などが問題になってきています。そしてそれは徐々に来るのでちゃんとモニタリングしていないと、わかった時にはきびしい状況になりがちです。
(弊社、まだオンプレミスのほうが多いので、とりあえずインスタンスを大きくする。みたいなことで解決ができないです。)

データ量がすでに大変大きくなっているものや、システム構成上、変更しづらいという場合を除いて、ElasticSearchやAmazon CloudSearchなどを使っていこう。ということになり、調べてみました。

今まで、とりあえずの検索機能としては、データベースにLIKE検索のクエリを相乗りさせていたのですが、ロックやIOPSなどの影響が出る場合は、レプリケーションを組んで検索、参照といったクエリを分離するなど負荷対策をしてきました。
こういったサーバーの保守も、壊れると一大事でメンテナンス体制を組み、段取りに時間がかかってしまいます。
ですので、ElasticSearchのクラスタも、運用に慣れない当初にトラブルが起きたとすると、サービスの運用に多大な影響が出かねないので、マネージドサービスを使う方向になりました。

という訳で、Amazon Elasticsearch Serviceをターゲットとして、開発環境ではミニマルにやっていきたいため、ElasticSearchのdockerコンテナをpullしてきます。

そのままでは、日本語の全文検索エンジンとして扱うには厄介なので、プラグインをインストールして、そのコンテナを起動させます。

雑にdockerfile

FROM docker.elastic.co/elasticsearch/elasticsearch:5.1.2

RUN elasticsearch-plugin install analysis-kuromoji
RUN elasticsearch-plugin install analysis-icu


起動しているっぽい

# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6b3108b45654 local/elasticsearch "/bin/bash bin/es-..." 2 weeks ago Up 2 weeks 0.0.0.0:9200->9200/tcp, 9300/tcp elasticsearch


ここまでできたら、cpanやgemでライブラリを持ってきて、いろいろとやっていけるんですが、ElasticSearchはREST APIで操作ができますので、まずは、そのライブラリに慣れる前に、LWP::UserAgentを使って雑に、データの投入、検索ができるスクリプトを書きました。

取り急ぎ、機能の実装をしたいというエンジニアのために、とっかかりの実装と、開発環境の整備までが私が今回携わった範囲であり、しっかり実装されたものが、まもなく商用環境に投入される予定です。

この記事に書いたところまでは、とっかかりで、最終的には、いろいろな人が書かれている技術記事などを参考に、インデックスやマッピング、検索機能を提供する上で、必要なフィールドの洗い出しなどを行います。(実装したエンジニアが行ったはずです)

ものは知っていても、実際にそれらをサービスに適用したり、活用することとなると、日頃からのトレーニングが欠かせません。
また、わからないものに携わる時に、多くの人のアウトプットによって色々なものが成り立っていることも感じとることができるなあと日々感じております。

この記事へのコメント