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

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
  • 「movies with genre action or thriller」 -> objecttype:movies genre:(action OR thriller)
  • 「comedy category movies」 -> 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
  • 「movies with runtime less than 90」 -> objecttype:movies runtimelessthan:90

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

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

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

クエリ解釈の制限

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