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

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

ユーザーに提示される実際の結果は、クエリ解釈の信頼度に依存します。信頼度は、クエリ文字列がインデックス付きドキュメントのどこに現れるかなど、いくつかの要因に基づきます。actors というスキーマ フィールドに一貫して出現する文字列(俳優の名前「Tom Hanks」など)は、信頼度が高くなります。同じ文字列(「Tom Hanks」)がスキーマ フィールドではなく段落内に表示されると、信頼度が低下する可能性があります。信頼度が高い場合、クエリ解釈からの結果のみがユーザーに表示されます。信頼度が低い場合、クエリ解釈からの結果に混ざり通常のキーワード検索結果が表示されます。

クエリ解釈の例

映画に関する情報を含むデータベースなどのデータソースがあるとします。図 1 は、検索クエリの例とその結果の解釈を示しています。

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

このクエリの例では、クエリ解釈によって次のことが行われます。

  • スキーマを解析し、データソース内の最上位オブジェクトが objecttype:movies に分類されていると判断します。上記のクエリ解釈では、クエリ内の「movies」がオブジェクト タイプであることが認識されています。

  • スキーマを併用してデータソース内のドキュメントをスキャンし、文字列「action」が現れる場所を特定します。この文字列が主に特定の「genre」データソース フィールドに現れる場合、クエリ解釈では、「action」がスキーマで定義されたプロパティ「genre」のプロパティ値であることを確実にします。この文字列が主にコンテンツの段落のコンテキスト内に現れる場合、クエリ解釈の信頼レベルは低下します。

結果のクエリ解釈は次のようになります。

  actor:“tom hanks” genre:action objecttype:movies

クエリ解釈は、追加の作業なしで、すべての Cloud Search のお客様に対して自動的に有効になります。ただし、最適なクエリ解釈を実現するためには、このドキュメントの指示に従ってスキーマを構造化する必要があります。

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

クエリ解釈を活用できるようにスキーマを構造化する必要があります。

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

Cloud Search のクエリ解釈では、スキーマ内の objectDefinitionspropertyDefinitions を使用して、ユーザーのクエリを解釈し、結果を調整します。これらのスキーマ要素のメリットを最大限に活用するには、プロパティ名に displayLabel、オブジェクト名に objectDisplayLabel、演算子に operatorName を使用して、直感的な表示名を作成する必要があります。

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

{
  "objectDefinitions": [
    {
      "name": "movie",
        "options": {
          "displayOptions": {
          "objectDisplayLabel": "Films"
        }
        ...
      },
      "propertyDefinitions": [
        {
          "name": "genre",
          "isReturnable": true,
          "isRepeatable": true,
          "isFacetable": true,
          "textPropertyOptions": {
          "retrievalImportance": { "importance": "HIGHEST" },
          "operatorOptions": {
            "operatorName": "genre"
          }
        },
        "displayOptions": {
          "displayLabel": "Category"
        }
      },
      ...
      ]
    }
  ]
}

上記の例では、次のようになっています。

  • 映画オブジェクト定義には「Film」objectDisplayLabel があります。

  • genre propertyDefinition には、「genre」operatorName と「Category」displayLabel があります。

これらの表示名により、Cloud Search では次のクエリ解釈を行うことができます。

  • 「action Movies」、「genre action type movies」、「movies genre action」は、genre:action object:movies として解釈されます。
  • 「movies with genre action or build」は objecttype:movies genre:(action OR thriller) として解釈されます。
  • 「action Film」または「action Films」は genre:action objecttype:movies と解釈されます。
  • 「コメディ カテゴリの映画」は genre:comedy objecttype:movies と解釈されます。

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

すべての日付プロパティと数値プロパティでは、IntegerOperatorOptions で指定されている lessThanOperatorNamegreaterThanOperatorName を定義する必要があります。これらの設定により、日付と数値の自動解釈が可能になります。また、並べ替えの解釈を有効にするには、日付と数値のプロパティに isSortable オプションを設定します。次のスキーマは、これらのオプションを有効にする方法を示しています。

{
  "objectDefinitions": [
    {
      "options": {
        "displayOptions": {
          "objectDisplayLabel": "Films"
        }
      },
      "propertyDefinitions": [
        {
          "name": "runtime",
          "isReturnable": true,
          "isSortable": true,
          "integerPropertyOptions": {
            "orderedRanking": "DESCENDING",
            "minimumValue": {
              "value": 10
            },
            "maximumValue": {
              "value": 500
            },
            "operatorOptions": {
              "operatorName": "runtime",
              "lessThanOperatorName": "runtimelessthan",
              "greaterThanOperatorName": "runtimegreaterthan"
            }
          },
          "displayOptions": {
            "displayLabel": "Length"
          }
        },
        {
          "name": "releasedate",
          "isReturnable": true,
          "isSortable": true,
          "datePropertyOptions": {
            "operatorOptions": {
              "operatorName": "releasedate",
              "lessThanOperatorName": "releasedbefore",
              "greaterThanOperatorName": "releasedafter"
            }
          }
        }
      ]
    }
  ]
}

上記の例では、次のようになっています。

  • 数値プロパティ runtime は映画の長さを表します。このプロパティには runtimelessthanruntimegreaterthan が設定されています。
  • 日付プロパティ releaseDate は、映画が劇場で公開される日付を示します。このプロパティには releasedbeforereleasedafter が設定されています。

これらの設定により、Cloud Search では次のクエリ解釈を行うことができます。

  • 年が 2019 年の場合、「今年リリースされた映画」は objecttype: movies releasedafter:2019-1-1 releasedbefore:2019-12-31 と解釈されます。
  • 週が 3 月の 3 週目の場合、「先週リリースされた映画」は objecttype: movies releasedafter:2019-3-10 releasedbefore:2019-3-16 と解釈されます。
  • 「Movies with runtime than 90」は、objjecttype: movies runtimelessthan:90 と解釈されます。
  • 年が 2019 年の場合、「今年公開され、長さが 120 を超える映画」は releasedafter:2019-1-1 releasedbefore:2019-12-31 objecttype:movies runtimegreaterthan:120 と解釈されます。
  • 「sort movies by release date」の場合は「objecttype: movies」でフィルタリングが実行され、表示される結果は公開日で並べ替えられます。デフォルトの並べ替え順は昇順です。

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

予約済みの組み込み演算子 typebeforeafterobjecttype を使用して、クエリの解釈を強化することもできます。ドキュメントをインデックス付けするときは、次のようにしてください。

  1. ItemMetadataupdateTime フィールドに入力し、before および after 演算子を使用します。これらの設定により、Cloud Search では次のクエリ解釈を行うことができます。

    • 「movies from last week」は、先週インデックス内で更新されたすべての映画を一覧表示します。
    • 「movies before jan 2019」は、2019 年 1 月以前にインデックスに登録されたすべての映画を一覧表示します。
  2. タイプの自動検出を使用するには、ItemMetadatamimeType フィールドに値を設定します。「アクション動画」というクエリでは、MIME タイプが application/mp4application/mpeg4application/x-shockwave-flashvideo/application/vnd.google-apps.video のすべてのアクション映画ドキュメントが一覧表示されます。

クエリ解釈の制限

クエリ解釈機能には次の制限があります。

  • クエリ解釈は、次のデータソース ACL でのみ機能します。
    • すべてのドキュメントがドメイン公開にされている(ドメイン内の全員がアクセスできる)。
    • すべてのドキュメントがデータソース公開にされている(データソース ACL にアクセスできるすべての人)。
    • データソース内のドキュメントの大多数は同じ ACL を持ち(すべてのドキュメントが同じコンテナ アイテムから ACL を継承する)、追加のリーダーが定義されていない。
  • 複数のスキーマ演算子が同じ値を持つ場合、クエリについての演算子の意図に対するその値の解釈は、クエリ解釈システムによって返される総合的な信頼度係数に依存します。たとえば、プロパティ priorityseverity に、スキーマで定義された同じ演算子名があるとします。両方の演算子の値が 0、1、2、3 のいずれかの値を使用できるとします。 この例では、クエリ内の「0」は、priority または severity のいずれかの演算子の値を参照できます。これらの値は曖昧なため、信頼レベルは低くなります。
  • デフォルトでは、Cloud Search のクエリ解釈では、クエリの解釈時にフィールド値の大文字が小文字になります。ただし、exactMatchWithOperator オプションで定義されたテキスト演算子は除きます。
  • source 演算子はクエリではサポートされていません。
  • 演算子ベースの用語とフリーテキスト形式の用語を組み合わせたクエリは解釈されません。たとえば、「p0 priority cases severity:s0」というクエリはサポートされません。これは、「p0 priority cases」はフリーテキスト形式の用語で、「severity:s0」は演算子ベースの用語であるためです。
  • クエリ解釈戦略では、解釈された結果と通常の(解釈されていない、関連性でランク付けされている)結果が常にブレンドされます。結果の全ページ置換は実行されません。