Amazon CloudSearchで全件対象のファセットを表示する。新着(123件)みたいなやつ。

AWS

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

生活の中のファセット

皆さんファセット検索を簡単にやりたいですよね?例えばこんなのです。

screenshot 2014-06-22 20.41.48

よし、やってみましょう。Amazon CloudSearchは、マネージドな全文検索サービスです。ドキュメントを登録するとインデックスを張ってくれてテキスト検索をすることができます。また、API経由の呼び出しだけでなく、URLからの操作にも対応していますので、既存サイトにシームレスに取り込むことが可能です。

全件をヒットさせる方法

これ、いきなりハマりました。CloudSearchのクエリー文字列に全件をヒットさせる方法が無い?な感じだったのです。例えば、以下の様な方法で入力すれば簡単にイケると思ったのですが、どれもダメでした。そしてやっと発見したのでブログでご報告です。

http://hoge.ap-northeast-1.cloudsearch.amazonaws.com/2013-01-01/search?q=
http://hoge.ap-northeast-1.cloudsearch.amazonaws.com/2013-01-01/search?q=*

パーサーを指定する

CloudSearchには、複数のクエリーパーサーから選んで利用することができます。

  • Simple:最も基本的なパーサー
  • Structured:複雑な条件や重み付けをするパーサー
  • Lucene:Apache Luceneを利用するパーサー
  • Dismax:Luceneを補うパーサー

Luceneで全件検索する方法

Luceneでは全件を表す方法があります。*:*です。これはイケそうですね。

早速、CloudSearchでパーサーを指定してみましょう。以下は、国名でファセットしている例です。また、検索結果の表示は不要なので、no_fieldsも追加しています。

http://hoge.ap-northeast-1.cloudsearch.amazonaws.com/2013-01-01/search?q=*:*&q.parser=lucene&facet.country={size:1000}&return=_no_fields

結果は以下のようになりました!全件対象のファセット完成です!

{"status":{"rid":"8bHg9XXXXXXXXXX","time-ms":11},
"hits":{"found":183238,"start":0,
"facets":{
"country":{
"buckets":[
{"value":"アメリカ合衆国","count":43498},
{"value":"イタリア共和国","count":18297},
{"value":"フランス共和国","count":11582},
{"value":"イギリス","count":9325},
{"value":"スペイン王国","count":8606},
{"value":"中国(中華人民共和国)","count":7474},
{"value":"ドイツ連邦共和国","count":6424},
{"value":"インド","count":4690},
{"value":"ギリシャ共和国","count":4451},
{"value":"カナダ","count":3852},
{"value":"タイ王国","count":3805},
{"value":"オーストラリア連邦","count":3648},
・・・
]}}}

ファセットの中でファセットする

ECサイトでは、大項目でファセットした後に、中項目でファセットしたいこともあるかと思います。今回の例でいうと、国名でファセットして、次に都市名でファセットして絞込みをする感じです。ベストな方法か分かりませんが、やってみました。検索時にカラムを指定して大項目で絞込みをしたテキストを埋め込みます。そして、中項目でファセットです。

http://hoge.ap-northeast-1.cloudsearch.amazonaws.com/2013-01-01/search?q=country:アメリカ合衆国&q.parser=lucene&facet.city={size:1000}&return=_no_fields

実行結果は以下のとおりです。

{"status":{"rid":"ufXKmuXXXXXXXXXX","time-ms":97},
"hits":{"found":43498,"start":0,
"facets":{
"city":{
"buckets":[
{"value":"New York","count":474},
{"value":"Houston","count":364},
{"value":"San Antonio","count":290},
{"value":"Orlando","count":265},
{"value":"Miami Beach","count":209},
{"value":"San Diego","count":209},
{"value":"Columbus","count":200},
{"value":"San Francisco","count":200},
{"value":"Las Vegas","count":187},
{"value":"Washington","count":172},
・・・
]}}}

イイ感じですね。

CloudSearchの結果をCloudFrontでキャッシュする

ファセット検索は、ホームページのトップに掲載されることが多くあると思います。この場合、ホームページへの閲覧回数がそのままCloudSearchの負荷になってしまいます。そこで、検索結果をキャッシュする目的でCloudFrontでラップしてはいかがでしょうか。同じGetクエリー文字列なら24時間とかキャッシュしてしまえば、サクサク表示できますし、負荷も掛かりません。

まとめ

既存のWebサイトに大きなプログラムの追加・修正なく、カテゴリーによる絞込み検索時にファセットによる件数表示ができることが分かりました。これで売上アップ間違い無し!?