建立結構定義以最佳化查詢解譯

Cloud Search 的查詢解讀功能會自動解讀使用者查詢中的運算子和篩選條件,然後再將這些元素轉換成以運算子為基礎的結構化查詢。查詢解釋功能會使用結構定義中定義的運算子搭配建立索引的文件,推斷使用者的查詢意義。這項功能可讓使用者僅使用最少的關鍵字進行搜尋,但依然可以取得精確的結果。

使用者實際看到的結果,取決於查詢解讀的信心。可信度取決於多項因素,包括查詢字串在已建立索引文件中的顯示位置。字串 (如演員「Tom Hanks」) 的名稱一致顯示在名為「actors」的結構定義欄位中,結果可信度較高。同一字串 (「Tom Hanks」) 出現在段落中 (而非結構定義欄位) 可能會降低可信度。如果是高信賴水準,使用者就只會看到查詢解讀的結果。如果是較弱的信賴,查詢解讀的結果會與一般關鍵字搜尋結果混合。

查詢解讀範例

假設您有包含電影相關資訊的資料來源 (例如資料庫),圖 1 顯示搜尋查詢範例和產生的解釋。

查詢解讀總覽
圖 1. 查詢解讀

根據這個查詢範例,查詢解釋功能會進行以下操作:

  • 剖析結構定義,並判定資料來源中的頂層物件歸類為 objecttype:movies。現在查詢解釋功能知道查詢中的「電影」是物件類型。

  • 掃描資料來源中的文件搭配結構定義,以確定字串「動作」出現的位置。如果字串主要發生在特定的「類型」資料來源欄位中,那麼查詢解釋可以確信「動作」是結構定義中定義的「類型」屬性值。如果字串主要發生在內容段落,則查詢解讀的信賴水準會下降。

產生的查詢解釋如下:

  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"
        }
      },
      ...
      ]
    }
  ]
}

在上一個範例中:

  • 電影物件定義含有「電影」objectDisplayLabel

  • 類型屬性定義具有「類型」operatorName 和「類別」displayLabel

這些顯示名稱可讓 Cloud Search 解讀下列查詢:

  • 「動作電影」、「類型動作類型電影」或「電影類型動作」會以 genre:action object:movies 表示。
  • 「具有類型動作或驚悚的電影」會解讀為 objecttype:movies genre:(action OR thriller)
  • 「動作片」或「動作片」視為 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
  • 假設本週是遊行的第三週,「上週上映的電影」會解讀為 objecttype: movies releasedafter:2019-3-10 releasedbefore:2019-3-16
  • 「電影長度小於 90 的電影」會解讀為 objjecttype: movies runtimelessthan:90
  • 假設今年是 2019 年,「今年上映的電影且片長超過 120 個」就會解讀為 releasedafter:2019-1-1 releasedbefore:2019-12-31 objecttype:movies runtimegreaterthan:120
  • 「依發行日期排序電影」會篩選「objecttype: Movies」,而顯示的結果會按照發行日期排序,預設排序順序為遞增。

啟用保留運算子解釋

您也可以使用 typebeforeafterobjecttype 保留的內建運算子,強化查詢解釋。為文件建立索引時,請執行下列步驟:

  1. 填入 ItemMetadata 中的 updateTime 欄位,以使用 beforeafter 運算子。這些設定可讓 Cloud Search 解讀下列查詢:

    • 「上週的電影」會列出前一週更新的所有電影。
    • 「在 2019 年 1 月以前的電影」會列出 2019 年 1 月前編入索引的所有電影。
  2. 填入 ItemMetadata 中的 mimeType 欄位,以使用類型自動偵測。查詢「動作影片」會列出 MIME 類型為 application/mp4application/mpeg4application/x-shockwave-flashvideo/application/vnd.google-apps.video 的所有動作電影文件。

查詢解釋限制

查詢解釋功能有下列限制。

  • 查詢解讀功能僅適用於下列資料來源 ACL:
    • 所有文件皆為公開網域 (網域中的所有人皆可存取)。
    • 所有文件皆為公開資料來源 (可存取資料來源 ACL 的所有文件)。
    • 資料來源中大多數的文件都有相同的 ACL (所有文件都會沿用相同容器項目的 ACL),但未定義其他讀取器。
  • 如果多個結構定義運算子具有相同的值,該值對查詢運算子意圖的解釋取決於查詢解釋系統傳回的整體可信度因素。舉例來說,假設您有 priorityseverity 屬性,和結構定義中定義的運算子名稱相同。假設兩個運算子都可以值 0、1、2 或 3。在這個範例中,查詢中的「0」可以參照 priorityseverity 的運算子值。這些值不明確,且信賴水準較低。
  • 根據預設,Cloud Search 的查詢解讀功能會在解讀查詢時降低欄位值的大小寫,但以 exactMatchWithOperator 選項定義的文字運算子除外。
  • 查詢不支援 source 運算子。
  • 如果查詢結合運算子型字詞和任意文字字詞,則無法解讀。舉例來說,「p0 Priority case severity:s0」查詢不會支援,因為「p0 優先案件」是免費文字字詞,而「severity:s0」是依據運算子使用的字詞。
  • 查詢解釋策略一律會混合解讀的結果與一般 (非解釋、關聯性排序) 結果。但不會執行完整的頁面替換結果。