Amazon CloudSearch でファセット情報を取得して使用 - Amazon CloudSearch

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon CloudSearch でファセット情報を取得して使用

ファセットとは、検索結果の絞り込みとフィルタ処理を行うために使用するカテゴリを表すインデックスフィールドです。Amazon CloudSearch に検索リクエストを送信すると、ファセット情報をリクエストして、特定のフィールドで同じ値を共有するドキュメントの数を調べることができます。この情報を検索結果と共に表示して、ユーザーはそれを利用して対話的に検索結果を絞り込むことができます。(これは多くの場合、ファセットナビゲーションまたはファセット検索と呼ばれます)。

検索リクエストで facet.FIELD パラメータを指定することで、ファセット対応フィールドのファセット情報を取得できます。デフォルトで、Amazon CloudSearch は上位 10 個の値のファセット数を返します。フィールドをファセット対応にする方法の詳細については、「configure indexing options」を参照してください。facet.FIELD パラメータの説明については、検索 API リファレンスの「検索リクエストのパラメータ」を参照してください。

各フィールドのファセット値のソート方法を制御する、返されるファセット値の数を制限する、またはカウントして返すファセット値を選択するために、ファセットオプションを指定することができます。

Amazon CloudSearch でのファセット情報の取得

フィールドのファセット情報を取得するには、facet.FIELD​ パラメータを使用します。FIELD​ はファセット対応フィールドの名前です。ファセットオプションは JSON オブジェクトとして指定します。JSON オブジェクトが空の場合 (facet.FIELD={})、ファセット数はすべてのフィールド値について計算され、ファセットはファセット数によってソートされ、上位 10 個のファセットが結果で返されます。同じリクエストで複数のフィールドのファセット情報をリクエストできます。

ファセット情報を取得するには 2 つの方法があります。

  • sort — ファセット数またはファセット値のいずれかでソートしてファセット情報を返します。

  • buckets — 特定のファセット値または範囲のファセット情報を返します。

ファセット情報のソート

sort オプションを指定して、ファセット情報のソート方法を制御します。ソートオプションには countbucket の 2 つがあります。

  • count はファセット数によってファセットをソートするために使用します。例えば、facet.year={sort:'count'} は、年の値が同じ一致の数をカウントし、その数を基準にファセット情報をソートします。

  • bucket はファセット値によってファセットをソートするために使用します。例えば、facet.year={sort:'bucket'} です。

sort オプションを使用する場合、size オプションを指定して、結果で返すファセット値の最大数を制御できます。size オプションは、sort オプションを使用する場合にのみ有効です。

次の例では、ファセット情報が genres フィールドについて計算されます。ジャンルはファセット値順にソートされ、最初の 5 つのジャンルが結果で返されます。

facet.genres={sort:'bucket', size:5}

ファセット情報のバケット

buckets オプションを指定して、カウントするファセット値または範囲を明示的に指定できます。バケットは値の配列または範囲として指定します。例えば facet.color={buckets:["red","green","blue"]} です。

値の範囲を指定するには、上限と下限をカンマ (,) で区切り、ブラケットか中括弧で範囲を囲みます。角括弧 [ ] は、その境界も範囲に含まれることを示し、波括弧 { } は、境界は除外することを示します。期限のない範囲を指定するには、上下の境界を省略します。境界を省略するときは、波括弧 { } を使用する必要があります。例えば、facet.year={buckets:["[1970,1979]","[1980,1989]", "[1990,1999]","[2000,2009]","[2010,}"]} です。タイムスタンプには、q=-poet&facet.release_date={buckets:["[\'1980-01-01T00:00:00Z\',\'1986-01-01T00:00:01Z\']"]} を使用できます。

バケットを指定した場合、sort および size オプションは無効です。

Amazon CloudSearch では、バケット数を計算する方法として filter および interval という 2 つのメソッドがサポートされています。デフォルトでは、filter メソッドが使用されます。これは、単純に各バケットに追加のフィルタークエリを送信してバケット数を取得します。多くの場合はこの方法が有効に機能しますが、これらのクエリは内部キャッシュメカニズムの利点を生かせないため、更新が頻繁な場合や大量のファセットを取得する場合は、パフォーマンスに影響が出ることがあります。

バケット化されたファセットのクエリパフォーマンスが遅くなる場合は、バケットメソッドを interval に設定して、複数のクエリを送信する代わりに検索結果のセットの後処理を試みてください。

facet.year={buckets:["[1970,1979]","[1980,1989]","[1990,1999]"],method:"interval"}

パフォーマンステストを実行して、ご使用のアプリケーションに適したメソッドを決定することをお勧めします。一般に、更新がそれほど頻繁ではなく、バケット数がそれほど多くない場合は、filter メソッドの方が高速です。ただし、更新頻度が高い場合やバケットが大量にある場合は、interval メソッドを使用して結果セットを後処理する方がクエリパフォーマンスの速度が大幅に向上することもあります。

Amazon CloudSearch でのファセット情報の使用

ファセット情報を表示すると、ユーザーが検索結果をさらに簡単に参照し、興味のある情報を特定できるようになります。例えば、ユーザーがスタートレックの映画の 1 つを見つけようとしているときに、完全なタイトルを覚えていない場合、まず star を検索する可能性があります。genre の上位ファセットを表示する場合、クエリに facet.FIELD と、各ファセットで取得するファセット値の数を含めます。

search?q=star&facet.genres={sort:'count',size:5}&format=xml&return=_no_fields

前の例では、検索レスポンスとして次の情報が返されます。

<results> <status rid="v7r9hs8oFQqMHnk=" time-ms="3"/> <hits found="85" start="0"> <hit id="tt1411664"/> <hit id="tt1911658"/> <hit id="tt0086190"/> <hit id="tt0120601"/> <hit id="tt2141761"/> <hit id="tt1674771"/> <hit id="tt0056687"/> <hit id="tt0397892"/> <hit id="tt0258153"/> <hit id="tt0796366"/> </hits> <facets> <facet name="genres"> <bucket value="Comedy" count="41"/><bucket value="Drama" count="35"/> <bucket value="Adventure" count="29"/> <bucket value="Sci-Fi" count="24"/> <bucket value="Action" count="20"/> </facet> </facets> </results>

Amazon CloudSearch でのファセットの複数選択

使用できるファセットを表示して、ユーザーが複数の値を選択して結果を絞り込めるようにする場合は、1 つのリクエストを送信してファセット制約に一致するドキュメントを取得し、続いて追加のリクエストを送信してファセット数を取得します。

例えば、サンプル映画データで、genresratingyear の各フィールドはファセット対応です。ユーザーが poet という語句を検索する場合、次のリクエストを送信して、一致する映画と、genresratingyear の各フィールドのファセット数を取得できます。

q=poet&facet.genres={}&facet.rating={}&facet.year={}&return=_no_fields

facet.FIELD オプションを指定していないため、Amazon CloudSearch はファセット値をすべてカウントして、各ファセットの上位 10 個の値を返します。

{ "status" : { "rid" : "it3T8tIoDgrUSvA=", "time-ms" : 5 }, "hits" : { "found" : 14, "start" : 0, "hit" : [ {"id" : "tt0097165"}, {"id" : "tt0059113"}, { "id" : "tt0108174"}, {"id" : "tt1067765"}, { "id" : "tt1311071"}, {"id" : "tt0810784"}, {"id" : "tt0819714"}, {"id" : "tt0203009"}, {"id" : "tt0114702"}, {"id" : "tt0107840"} ] }, "facets" : { "genres" : { "buckets" : [ {"value" : "Drama","count" : 12}, {"value" : "Romance","count" : 9}, {"value" : "Biography", "count" : 4}, {"value" : "Comedy","count" : 2}, {"value" : "Thriller","count" : 2}, {"value" : "War","count" : 2}, {"value" : "Crime","count" : 1}, {"value" : "History","count" : 1}, {"value" : "Musical","count" : 1} ] }, "rating" : { "buckets" : [ {"value" : "6.3","count" : 3}, {"value" : "6.2","count" : 2}, {"value" : "7.1","count" : 2}, {"value" : "7.9","count" : 2}, {"value" : "5.3","count" : 1}, {"value" : "6.1""count" : 1}, {"value" : "6.4","count" : 1}, {"value" : "6.9","count" : 1}, {"value" : "7.6","count" : 1} ] }, "year" : { "buckets" : [ {"value" : "2013","count" : 3}, {"value" : "1993","count" : 2}, {"value" : "1965","count" : 1}, {"value" : "1989","count" : 1}, {"value" : "1995","count" : 1}, {"value" : "2001","count" : 1}, {"value" : "2004","count" : 1}, {"value" : "2006","count" : 1}, {"value" : "2008","count" : 1}, {"value" : "2009","count" : 1} ] } } }

ユーザーがファセット値を選択して検索結果を絞り込むときは、ユーザーのファセット選択を使用して結果をフィルタします。例えば、ユーザーが 201320121993 を選択した場合、次のリクエストはこれらの年に公開された一致する映画を取得します。

q=poet&fq=(or year:2013 year:2012 year:1993)&facet.genres={}&facet.rating={} &facet.year={}&return=_no_fields

これにより、ユーザーの選択に一致するドキュメントと、フィルタが適用されたファセット数が取得されます。

{ "status" : { "rid" : "zMP38tIoDwrUSvA=", "time-ms" : 6 }, "hits" : { "found" : 6, "start" : 0, "hit" : [ {"id" : "tt0108174"}, {"id" : "tt1067765"}, {"id" : "tt1311071"}, {"id" : "tt0107840"}, {"id" : "tt1462411"}, {"id" : "tt0455323"} ] }, "facets" : { "genres" : { "buckets" : [ {"value" : "Drama","count" : 4}, {"value" : "Romance","count" : 3}, {"value" : "Comedy","count" : 2}, {"value" : "Thriller","count" : 2}, {"value" : "Biography","count" : 1}, {"value" : "Crime","count" : 1} ] }, "rating" : { "buckets" : [ {"value" : "6.3","count" : 2}, {"value" : "5.3","count" : 1}, {"value" : "6.2","count" : 1}, {"value" : "6.4","count" : 1}, {"value" : "7.1","count" : 1} ] }, "year" : { "buckets" : [ {"value" : "2013","count" : 3}, {"value" : "1993","count" : 2}, {"value" : "2012","count" : 1} ] } } }

これが、ジャンルとレーティングについて表示するデータです。ただし、ユーザーが年のフィルタを変更できるようにするには、選択されていない年のファセット数も取得する必要があります。これを行うには、2 つ目のリクエストを送信して、フィルタなしで年フィールドのファセット数を取得します。

q=poet&facet.year={}&size=0

一致するドキュメントを取得する必要はありません。そのため、リクエストの遅延を最小限に抑えるために、size パラメータはゼロに設定します。このリクエストは、year フィールドのファセット情報だけを返します。

{ "status" : { "rid" : "x/7r0NIoRwqlHfo=", "time-ms" : 4 }, "hits" : { "found" : 14, "start" : 0, "hit" : [ ] }, "facets" : { "year" : { "buckets" : [ {"value" : "2013","count" : 3}, {"value" : "1993","count" : 2}, {"value" : "1965","count" : 1}, {"value" : "1989","count" : 1}, {"value" : "1995","count" : 1}, {"value" : "2001","count" : 1}, {"value" : "2004","count" : 1}, {"value" : "2006","count" : 1}, {"value" : "2008","count" : 1}, {"value" : "2009","count" : 1} ] } } }

応答時間を最小限に抑えるには、フィルタされた結果を取得するリクエストと並行して、このリクエストを送信します。ただし、このような追加リクエストは、クエリ全体のパフォーマンスに影響する可能性があり、追加のトラフィックを処理可能にするためにドメインをスケールする必要が生じる場合もあることを忘れないでください。(スケーリングの詳細については、「Amazon でのスケーリングオプションの設定 CloudSearch」を参照してください。)

ユーザーがジャンルやレーティングを選択して、さらに検索結果を絞り込む場合は、それをフィルタ条件に追加して、一致するドキュメントを取得します。例えば、次のリクエストは、2013 年、2012 年、1993 年に公開され、レーティングが 6.3 の映画を取得します。

q=poet&fq=(and rating:6.3 (or year:2013 year:2012 year:1993))&facet.genres={}&return=_no_fields

このリクエストでジャンルのファセット情報を取得すると、レーティングおよび年フィルタが適用されて、ファセット数が返されます。

{ "status" : { "rid" : "l66b89IoEArUSvA=", "time-ms" : 6 }, "hits" : { "found" : 2, "start" : 0, "hit" : [ {"id" : "tt1462411"}, {"id" : "tt0455323"} ] }, "facets" : { "genres" : { "buckets" : [ {"value" : "Drama","count" : 2} ] } } }

ユーザーが別のレーティングを選択できるようにするには、追加リクエストを送信し、年のフィルタだけを適用して、レーティングのファセット数を取得します。

q=poet&fq=(or year:2013 year:2012 year:1993)&facet.rating={}&size=0

このリクエストは次のレスポンスを取得します。

{ "status" : { "rid" : "jqWj89IoEQrUSvA=", "time-ms" : 5 }, "hits" : { "found" : 6, "start" : 0, "hit" : [ ] }, "facets" : { "rating" : { "buckets" : [ {"value" : "6.3","count" : 2}, {"value" : "5.3","count" : 1}, {"value" : "6.2","count" : 1}, {"value" : "6.4","count" : 1}, {"value" : "7.1","count" : 1} ] } } }

同様に、レーティングのフィルタだけを適用して、年のファセット数を取得するために、もう 1 つのリクエストが必要です。

q=poet&fq=rating:6.3&facet.year={}&size=0

このリクエストは次のレスポンスを取得します。

{ "status" : { "rid" : "4L6F8NIoDQrUSvA=", "time-ms" : 4 }, "hits" : { "found" : 3, "start" : 0, "hit" : [ ] }, "facets" : { "year" : { "buckets" : [ {"value" : "1995","count" : 1}, {"value" : "2012","count" : 1}, {"value" : "2013","count" : 1} ] } } }