Amazon CloudSearch
開発者ガイド (API バージョン 2013-01-01)

Amazon CloudSearch でのテキストの検索

テキストとリテラルの両方のフィールドで、テキスト文字列を検索できます。

  • Text および text-array フィールドは、常に検索可能です。個々の用語だけでなくフレーズも検索できます。text および text-array フィールド内の検索では、大文字と小文字は区別されません。

  • Literal および literal-array フィールドは、ドメインのインデックスオプションで検索を有効にしている場合のみ検索できます。検索文字列の完全一致を検索することができます。リテラルフィールドの検索では、大文字/小文字が区別されます。

簡単なクエリパーサーを使用する場合、または構造化クエリパーサーで検索時にフィールドを指定しない場合、デフォルトではすべての text および text-array フィールドが検索されます。リテラルフィールドはデフォルトでは検索されませんq.options パラメーターを使用して、検索するフィールドを指定できます。

ユニークなドキュメント ID フィールドを、他のテキストフィールドと同様に検索できます。検索リクエストでドキュメント ID フィールドを参照するには、フィールド名 _id を使用します。ドキュメント ID は、必ず検索結果で返されます。

Amazon CloudSearch での個々の用語の検索

text および text-array フィールドで個々の用語を検索すると、Amazon CloudSearch は指定されたフィールド内のどこかに検索する用語が含まれているすべてのドキュメントを任意の順序で見つけます。たとえば、サンプルの映画データで、title フィールドは text フィールドとして設定されています。title フィールドで star を検索する場合、title フィールドのどこかに star を含んでいるすべての映画、たとえば starstar warsa star is born などが見つかります。これは、一致と見なされるにはフィールド値が検索文字列と完全に一致している必要がある literal フィールドの検索とは異なります。

simple クエリパーサーでは、text および text-array フィールドで 1 つ以上の用語を簡単に検索できます。q.parser パラメータを使用して他のクエリパーサーを指定しなければ、デフォルトで simple クエリパーサーが使用されます。

たとえば、katniss を検索するには、クエリ文字列に katniss と指定します。デフォルトでは、Amazon CloudSearch は検索結果に値を返すことが可能なすべてのフィールドを含めます。return パラメータを設定して、返す必要のあるフィールドを指定できます。

https://search-domainname-domainid.us-east-1.cloudsearch.amazonaws.com/ 2013-01-01/search?q=katniss&return=title

デフォルトでは、応答は JSON で返されます。

{ "status": { "rid": "rd+5+r0oMAo6swY=", "time-ms": 9 }, "hits": { "found": 3, "start": 0, "hit": [ { "id": "tt1951265", "fields": { "title": "The Hunger Games: Mockingjay - Part 1" } }, { "id": "tt1951264", "fields": { "title": "The Hunger Games: Catching Fire" } }, { "id": "tt1392170", "fields": { "title": "The Hunger Games" } } ] } }

複数の用語を指定するには、用語をスペースで区切ります。例: star wars。複数の検索用語を指定するときは、デフォルトで、一致と見なされるすべての用語がドキュメントに含まれている必要があります。用語は、テキストフィールド内の任意の場所で、任意の順序で出現する可能性があります。

デフォルトでは、simple クエリパーサーを使用すると、すべての text および text-array フィールドが検索されます。q.options パラメータを指定することで、検索するフィールドを指定できます。たとえば、このクエリでは、title および description フィールドに検索を制限し、title フィールドでの一致の重要度を description フィールドでの一致より高く設定します。

q=star wars&q.options={fields: ['title^5','description']}

simple クエリパーサーを使用する場合は、次のプレフィックスを使用して、個々の用語を必須またはオプションとして指定したり、検索結果から除外するように指定できます。

  • +—一致するドキュメントは用語を含んでいる必要があります。これはデフォルトです。スペースで用語を区切るのは、用語の前に + プレフィックスを付けることに相当します。

  • -—用語を含むドキュメントを検索結果から除外します。- 演算子は、個々の用語にのみ適用されます。たとえば、デフォルトの検索フィールドに star という用語を含むドキュメントを除外するには、-star を指定します。search?q=-star wars の検索では、star という用語は含まれず、wars という用語が含まれるすべてのドキュメントが取得されます。

  • |—他の用語が含まれていない場合でも、その用語を含むドキュメントが検索結果に含められます。| 演算子は、個々の用語にのみ適用されます。たとえば、2 つの用語のいずれかが存在するドキュメントを含めるには、term1 |term2 と指定します。search?q=star wars |trek で検索すると、starwars の両方、または trek という用語を含むドキュメントが取得されます。

これらのプレフィックスは、シンプルなクエリの個々の用語にのみ適用できます。複合クエリを作成するには、simple クエリパーサーではなく、structured クエリパーサーを使用する必要があります。たとえば、structured クエリパーサーを使用して star および wars という用語を検索するには、次のように指定します。

(and 'star' 'wars')

このクエリでは、検索対象のいずれかのフィールドにそれぞれの用語を含むドキュメントが一致することに注意してください。一致とみなされるには、用語が同じフィールドにある必要はありません。ただし、(and 'star wars' 'luke') と指定した場合は、star および wars は同じフィールド内にある必要があります。luke はどのフィールドでもかまいません。

structured クエリパーサーを使用するときにフィールドを指定しない場合は、simple パーサーの場合と同様に、デフォルトですべての text および text-array フィールドが検索されます。同様に、q.options パラメータを使用して、検索されるフィールドを制御したり、選択したフィールドの重要度を高くすることができます。詳細については、「複合クエリの作成」を参照してください。

simple クエリパーサーを使用して、あいまい検索を実行することもできます。あいまい検索を実行するには、~ 演算子と、ユーザーのクエリ文字列と用語が異なっていても一致と見なされる文字数を示す値を追加します。たとえば、planit~1 と指定すると、用語 planit を検索しますが、1 文字だけ異なる場合は一致と見なします。つまり、planet は結果に含まれます。

Amazon CloudSearch でのフレーズの検索

フレーズを検索すると、Amazon CloudSearch は、指定された順序で完全なフレーズを含むすべてのドキュメントを見つけます。また、あいまいフレーズ検索を実行して、相互に指定された距離の範囲内に存在する用語を見つけることもできます。

simple クエリパーサーを使用した検索で、フレーズ内の個々の用語ではなく、フレーズ全体で一致させるには、フレーズを二重引用符でフレーズを囲みます。たとえば、次のクエリでは、with love というフレーズを検索します。

q="with love"

simple クエリパーサーであいまいフレーズ検索を行うには、~ 演算子と距離の値を追加します。distance 値には、フレーズ内の単語を分割できる単語の最大数を指定します。たとえば、次のクエリは、相互に 3 単語以内で with love という用語を検索します。

q="with love"~3

複合クエリでは、phrase 演算子を使用して、次のように一致するフレーズを指定します。

(phrase field=title 'star wars')

複合クエリであいまいフレーズ検索を実行するには、near 演算子を使用します。near 演算子を使用して、検索するフレーズと、フィールド内でどのくらい離れた用語まで一致と見なされるかを指定することができます。たとえば、次のクエリは、title フィールド内で 3 ワード以内の距離に starwars という用語を含むドキュメントを一致と見なします。

(near field=title distance=3 'star wars')

詳細については、「複合クエリの作成」を参照してください。

Amazon CloudSearch でのリテラル文字列の検索

リテラルフィールドで文字列を検索する場合、Amazon CloudSearch は指定されたフィールドで、大文字/小文字の区別も含め検索文字列全体の完全一致を含むドキュメントのみを返します。たとえば、title フィールドがリテラルフィールドとして設定されていて、Star を検索する場合、一致と見なされるためには、title フィールドの値が Star でなければなりません。—starstar wars、および a star is born は検索結果に含まれません。これは、大文字と小文字が区別されず、指定された検索用語が任意の順序でフィールド内のどこにでも出現できるテキストフィールドの検索とは異なります。

リテラルフィールドを検索するには、検索文字列の前に、検索するリテラルフィールドの名前とコロンを付けます。検索文字列は一重引用符で囲む必要があります。たとえば、次のクエリでは、リテラル文字列 Sci-Fi を検索します。

genres:'Sci-Fi'

この例では、各ドキュメントの genre フィールドを検索し、genre フィールドに Sci-Fi の値が含まれているすべてのドキュメントに一致します。一致と見なされるには、フィールド値が大文字/小文字の区別も含め、検索文字列と完全に一致する必要があります。たとえば、genre フィールドに Sci-Fi という値が含まれるドキュメントは、sci-fi または young adult sci-fi を検索する場合は、検索結果に含まれません。

複合クエリでは、term 演算子構文を使用してリテラルフィールドを検索します。("(term field=genres 'Sci-Fi')" など)。詳細については、「複合クエリの作成」を参照してください。

リテラルフィールドにファセットを組み合わせて使用することで、ファセット属性に基づいて結果をドリルダウンすることができます。ファセットの詳細については、「Amazon CloudSearch でファセット情報を取得して使用」を参照してください。

Amazon CloudSearch でのプレフィックスの検索

texttext-arrayliteral、および literal-array フィールドで、用語全体ではなくプレフィックスを検索できます。この一致の結果には、プレフィックスとその後に 0 またはいくつかの文字が含まれます。プレフィックスとして少なくとも 1 文字を指定する必要があります。(すべてのドキュメントを一致させるには、構造化クエリで matchall 演算子を使用します。) 一般的に、大量のドキュメントが一致することがないように、2 文字以上のプレフィックスを使用する必要があります。

text または text-array フィールドを検索するときは、プレフィックスと一致する用語は、フィールドのコンテンツ内のどこにあっても検出できます。リテラルフィールドを検索するときは、プレフィックス文字列を含むそれ以降の検索文字列全体が完全に一致する必要があります。

  • Simple クエリパーサー—* (アスタリスク) ワイルドカード演算子を使用してプレフィックスを検索します (例: pre*)。

  • 構造化クエリパーサー—prefix 演算子を使用してプレフィックスを検索します (例: prefix 'pre')。

たとえば、次のクエリでは、title フィールドで oce プレフィックスを検索し、ヒットしたタイトルを返します。

q=oce*&q.options={fields:['title']}&return=title

この検索をサンプルの映画データに対して実行した場合、Ocean's ElevenOcean's Twelve が返されます。

{ "status": { "rid": "hIbIxb8oRAo6swY=", "time-ms": 2 }, "hits": { "found": 2, "start": 0, "hit": [ { "id": "tt0240772", "fields": { "title": "Ocean's Eleven" } }, { "id": "tt0349903", "fields": { "title": "Ocean's Twelve" } } ] } }

複合クエリでは、prefix 演算子を使用してプレフィックスを検索します。たとえば、title フィールドで oce プレフィックスを検索するには、次のように指定します。

q.parser=structured&q=(prefix field%3Dtitle 'oce')

URL エンコードに注意してください。詳細については、「複合クエリの作成」を参照してください。

注記

テキストフィールドでワイルドカード検索を実行するときは、Amazon CloudSearch がインデックス作成中にテキストフィールドをトークン分割し、そのフィールドに設定された分析スキームに従ってステミングが実行されることに注意してください。通常、Amazon CloudSearch は検索クエリでも同じテキスト処理を実行します。ただし、ワイルドカード演算子(*)または prefix 演算子を持つプレフィックスを検索するときは、プレフィックスに対してステミングは実行されません。つまり、s で終わるプレフィックスを検索すると、単数形の用語とは一致しないことになります。これは、複数形だけでなく末尾が s のあらゆる用語に適用される可能性があります。たとえば、サンプル映画データの actor フィールドで Anders を検索した場合、一致する映画が 3 つあるとします。Ander* を検索した場合、それらの映画に加えて他のいくつかの映画が一致します。一方、Anders* を検索した場合、一致はありません。これは、用語が ander としてインデックスに格納されており、anders はインデックスにないためです。Amazon CloudSearch がテキストを処理する方法とそれが検索に与える影響の詳細については、「Amazon CloudSearch でのテキスト処理」を参照してください。