最適なクエリ解釈のためのスキーマを構造化する

Cloud Search のクエリ解釈 は、ユーザーのクエリ内の演算子とフィルタを自動的に構造化された演算子ベースのクエリに変換します。この機能は、スキーマで定義された演算子とインデックス付きドキュメントを使用して、クエリの意図を推測します。これにより、ユーザーは最小限のキーワードで検索できるとともに、正確な結果が得られます。

結果の表示は信頼度 によって異なります。クエリ文字列が特定のスキーマ フィールド(actors フィールドの「Tom Hanks」など)に一貫して表示されると、信頼度が高くなります。文字列が一般的な文章内に表示されると、信頼度が低くなります。信頼度が高い場合は解釈された結果のみが表示され、信頼度が低い場合は標準のキーワード検索結果とブレンドされます。

クエリ解釈の例

映画情報を含むデータベースについて考えてみましょう。図 1 は、検索クエリの例とその解釈を示しています。

クエリ解釈の概要
図 1.クエリ解釈

この例では、クエリ解釈は次のようになります。

  • スキーマから、最上位オブジェクトが objecttype:movies であることを判別します。
  • ドキュメントをスキャンして、「action」が出現する場所を特定します。主に genre フィールドに表示される場合は、そのフィールドのプロパティ値であるという信頼度が高くなります。

結果の解釈は actor:"tom hanks" genre:action objecttype:movies となります。

クエリ解釈はすべてのユーザーに対して自動的に行われますが、以降のセクションで説明するようにスキーマを構造化することで最適化できます。

クエリ解釈のためにスキーマを構造化する

スキーマを最適化することで、クエリ解釈のメリットを享受できます。

表示名の解釈を有効にする

クエリ解釈では、objectDefinitionspropertyDefinitions を使用してクエリを解釈します。プロパティには displayLabel 、オブジェクトには objectDisplayLabel 、演算子にはoperatorNameを使用して、直感的な表示名を作成します。

次の例は、映画オブジェクトの直感的な表示名を示しています。

{
  "objectDefinitions": [{
    "name": "movie",
    "options": {
      "displayOptions": { "objectDisplayLabel": "Films" }
    },
    "propertyDefinitions": [{
      "name": "genre",
      "isReturnable": true,
      "textPropertyOptions": {
        "operatorOptions": { "operatorName": "genre" }
      },
      "displayOptions": { "displayLabel": "Category" }
    }]
  }]
}

これらの表示名により、次のような解釈が可能になります。

  • 「アクション映画」-> genre:action object:movies
  • 「ジャンルがアクションまたはスリラーの映画」-> objecttype:movies genre:(action OR thriller)
  • 「コメディ カテゴリの映画」-> genre:comedy objecttype:movies

日付、数値、並べ替えの解釈を有効にする

すべての日付と数値のプロパティについて、 IntegerOperatorOptionslessThanOperatorNamegreaterThanOperatorNameを定義します。並べ替えを有効にするには、isSortable を設定します。

この例では、次のオプションが有効になります。

{
  "objectDefinitions": [{
    "propertyDefinitions": [
      {
        "name": "runtime",
        "isSortable": true,
        "integerPropertyOptions": {
          "operatorOptions": {
            "operatorName": "runtime",
            "lessThanOperatorName": "runtimelessthan",
            "greaterThanOperatorName": "runtimegreaterthan"
          }
        }
      },
      {
        "name": "releasedate",
        "isSortable": true,
        "datePropertyOptions": {
          "operatorOptions": {
            "operatorName": "releasedate",
            "lessThanOperatorName": "releasedbefore",
            "greaterThanOperatorName": "releasedafter"
          }
        }
      }
    ]
  }]
}

これらの設定により、次のような解釈が可能になります。

  • 「今年公開された映画」-> objecttype:movies releasedafter:2019-1-1 releasedbefore:2019-12-31
  • 「上映時間が 90 分未満の映画」-> objecttype:movies runtimelessthan:90

予約済み演算子の解釈を有効にする

typebeforeafterobjecttype などの組み込み演算子を使用します。

  1. beforeafter を使用するには、 ItemMetadataupdateTime を入力します。
  2. 自動検出を行うには、ItemMetadatamimeType を入力します。たとえば、「アクション動画」では、動画の MIME タイプのドキュメントが一覧表示されます。

クエリ解釈の制限

  • 次のデータソース ACL に対してのみ機能します。
    • ドメインで一般公開。
    • データソースで一般公開。
    • ドキュメントの大部分が同じ継承された ACL を共有している。
  • 演算子名が共有されている場合(priorityseverity の両方で 0 ~ 3 を使用している場合など)、信頼度が低下します。
  • デフォルトでは、exactMatchWithOperator を使用しない限り、解釈ではフィールド値に小文字が使用されます。
  • source 演算子は対象外です。
  • 演算子とフリーテキストの用語を組み合わせたもの(「p0 cases severity:s0」など)は解釈されません。
  • 結果は常に、関連性でランク付けされた結果とブレンドされます。