Amazon CloudSearch で検索機能を実現 – 構築編

はじめに

何かサービスをを作る際、検索機能を盛り込むケースは非常に多いと思います。

この検索機能というのはなかなか厄介で、例えば、RDBを使っている場合に中間一致や後方一致を可能にすると、インデックスが使えずにパフォーマンスや負荷に影響が出てしまったりと、一筋縄にはいきません。

そこで Apache Solr や Elasticsearch といった全文検索の導入が有力な選択肢となります。

AWSでは、全文検索もサービスとして提供されており、現在は
・CloudSearch
・Elasticsearch Service
の2種類が提供されています。

似たような役割のサービスですが、前者の方がカスタマイズ性が低く、その分手軽に利用でき、後者の方がカスタマイズ性が高く自由度の高い検索が可能なようです。
ということで、まずは入門しやすそうな CloudSearch を試してみたいと思います。

構築

それでは早速環境を作りましょう。

前提として検索対象にするデータが必要ですが、今回は青空文庫のCSVデータをお借りします。
http://www.aozora.gr.jp/index_pages/person_all.html

utf8形式のCSVファイルをダウンロードしたら、少し手を加える必要があります。

まずヘッダ行を適当な英語にしておきます。
日本語のヘッダ名だと解析時に列名が正しく解釈されないようでした。

もう1点、日付の形式を修正する必要があります。
若干雑ですが、以下のように一括置換しておきます。
(\d+)-(\d+)-(\d+) → \1-\2-\3T00:00:00Z

データの準備ができたら、AWSのコンソール上でCloudSearchへアクセスし、「Create New Search Domain」を選択します。
作成画面が開くので、適当なドメイン名を入力します。

次に検索インデックスを設定するためにサンプルをアップロードします。
今回は手元にデータとなるファイルがあるので、一番上を選択し、用意しておいたCSVファイルを指定します。

少し待つと解析結果として設定内容が表示されますので、データ型や言語を適切に修正します。
今回はお試しということもあり、ざっくり以下のように修正しています。
・author_name(著者名)を text に変更
・status_start_date(状態の開始日)を date に変更
・その他、言語が English の項目を Japanese に変更

最後にアクセス制御を設定します。
本来は必要最低限にすべきですが、後からでも変更できるので、一旦は自由にアクセスできるようにしてしまいます。
上から2番目のリンクをクリックすると、自動的にそのようなポリシーが設定されます。

あとは内容を確認して、完了です。
作成に10分前後かかるようなので、しばらく置いておきましょう。

上の画像のようにステータスが Active になったら、いよいよデータの投入です。
「Upload Documents」を選択します。
# Active になっても、直後はデータのアップロードボタンが非活性だったりしたので、
# 余裕を持って待つのが吉です。

サンプルのアップロードと同じように、一番上を選択し、ダウンロードしたファイルを指定します。

内容を確認し、問題なければ完了です。
完了画面でエラーが出ている場合はメッセージを確認してください。

8500件ほどのデータが投入できたようです。
反映されるのを少し待ってから、実際に検索してみます。

左側のメニューから「Run a Test Search」を選択すると、検索を試すことができます。
適当な条件で検索してみましょう。

274件該当と、無事検索できてそうです。
検索結果内の太文字の部分が条件にマッチした部分のようで、スコアの高かった順に表示されていますね。
右側にも色々なフィルタが用意されていたりと、既ににだいぶリッチな検索ができそうです。

おわりに

手探りながら、CloudSearchを使ってみました。
もう少し使いこなせるようになると実装の幅が大きく広がりそうなので、引き続き使っていきたいですね。

次回は Ruby 等のアプリケーション側から実際に今回構築した検索機能を使ってみたいと思います。

APN Consulting Partner
スーパーソフトウエアはAWSパートナーネットワーク(APN)のコンサルティングパートナーです。