オートコンプリートの実装

Cloud Search のオートコンプリートは、ユーザーが検索クエリを入力するときに単語を提案することでユーザーを支援します。候補は、ドキュメント タイトルからの単語、検索演算子、検索演算子の値、G Suite ドメインからの名前とメールなどになります。

オートコンプリートは、インデックスに登録されたドキュメントのタイトルからフレーズを抽出し、n-gram モデルを使用して、Suggest API で提供する提案を決定します。たとえば、映画に関するデータを含む次のデータソースがあるとします。

  • データソースには 2 つのドキュメントが含まれています。
  • 各ドキュメントには、タイトル(ItemMetadata.title)と 2 つのプロパティ、genrecharacters があります。
  • 最初のドキュメントは、タイトルが「Avengers Infinity War」で、genre=science fictioncharacters=Iron Man, Hulk とされています。
  • 2 番目のドキュメントは、タイトルが「Harry Potter」で、genre=Adventure, Fantasy andcharacters=Hermione, Harry Potter とされています。

図 1 は、ドキュメントのタイトル、プロパティ、プロパティ値から、オートコンプリートの提案がどのように抽出されるかを示しています。

2 つのドキュメントと結果の ngram
図 1. オートコンプリートに使用される 2 つのドキュメントと結果の n-gram

ドキュメント 1 から、「Avengers」、「Infinity」、「War」、「Avengers Infinity」、「Infinity War」、「Avengers Infinity War」の各 ngram(トライグラムまで)を抽出します。同様に、ドキュメント 2 から、「Harry」、「Potter」、「Harry Potter」を生成します。

このデータソースをクエリするとき、ユーザー入力の先頭が「h」だったとしましょう。ユーザーに示される提案は次のとおりです。

  • Harry
  • Hermione
  • Hulk
  • Harry Potter

ユーザーがオートコンプリート候補「Hermione」を選択し、ユーザーの次のキーストロークが文字「a」だったとしましょう。ユーザーに示されるオートコンプリートの提案は次のとおりです。

  • Hermione Adventure
  • Hermione Action
  • Hermione Avengers

Cloud Search のオートコンプリートでは、ドキュメントのコンテンツから、最大 5 つの提案と 2 つの人名の提案を返します。

デフォルトでは、ドキュメント タイトルのフレーズはオートコンプリートで表示されます。スキーマ プロパティに対応するプロパティ名と値が API によってオートコンプリートされるようにするには、そのスキーマ プロパティを is_suggestable として明示的にマークする必要があります。

オートコンプリート API と統合する

デフォルトの検索アプリケーションまたは埋め込み可能な検索ウィジェットを使用している場合、Cloud Search のオートコンプリート機能は、追加作業なしでネイティブにサポートされます。デフォルトでは、ドキュメント タイトルのフレーズはオートコンプリートで表示されます。スキーマ プロパティに対応するプロパティ名と値が API によってオートコンプリートされるようにするには、そのスキーマ プロパティを is_suggestable として明示的にマークする必要があります。

カスタム検索アプリケーションを構築する場合は、/query/suggest API エンドポイントをクエリすることにより、オートコンプリートを使用できます。

制限事項

オートコンプリートには次の制限があります。

  • スキーマで定義された FilterOptions を使用して Cloud Search のオートコンプリート フレーズを制限する機能は、objectype フィルタ、mimetype フィルタ、type フィルタの各組み込みフィルタを除き、サポートされていません。

  • クエリ履歴ベースの提案(以前に検索アプリケーションでユーザーが実行した検索)はサポートされていません。

  • 最大 20 個のプロパティを is_suggestable としてマークできます。この上限は、Cloud Search サポートに連絡することで増やすことができます。

  • 検索演算子のオートコンプリートは、exact_match_with_operator プロパティに対しては使用できません。