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

Cloud Search 的查詢解讀功能會自動解讀使用者查詢中的運算子和篩選器,並將這些元素轉換為結構化、以運算子為基礎的查詢。查詢解譯會使用結構定義中的運算子,搭配已編入索引的文件,推斷使用者查詢的意義。使用者只要輸入少量關鍵字,就能透過這項功能取得精確的搜尋結果。

向使用者顯示的實際結果取決於查詢解讀的信心程度。系統會根據多項因素判斷信心等級,包括查詢字串在已索引文件中出現的位置。字串 (例如演員「湯姆漢克斯」的名稱) 若在名為 actors 的結構定義欄位中一致出現,可提高可信度。如果相同字串 (「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"
        }
      },
      ...
      ]
    }
  ]
}

在上述範例中:

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

  • 類型屬性定義包含「genre」operatorName 和「Category」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: 電影」,並依上映日期排序,預設排序順序為遞增。

啟用保留運算子的解讀功能

您也可以使用 typebeforeafterobjecttype 保留的內建運算子,提升查詢解讀能力。建立文件索引時,請執行下列操作:

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

    • 「上週的電影」會列出在前一週索引中更新的所有電影。
    • 「movies before jan 2019」會列出 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 cases severity:s0」這個查詢不受支援,因為「p0 priority cases」是自由文字字詞,而「severity:s0」是運算子字詞。
  • 查詢解讀策略一律會將解讀結果與一般 (未解讀、依關聯度排序) 結果混合。不會執行結果的完整頁面取代作業。