建立及註冊結構定義

Google Cloud Search 結構定義是 JSON 結構,用於定義編列資料索引和查詢資料時使用的物件、屬性和選項。內容連結器會從存放區讀取資料,並根據您註冊的結構化定義,建構資料結構及建立索引。

您可以將 JSON 結構定義物件提供給 API,然後註冊該物件,藉此建立結構定義。您必須先為每個存放區註冊架構物件,才能為資料建立索引。

本文將說明建立結構定義的基本概念。如要瞭解如何調整結構化資料來提升搜尋體驗,請參閱「提升搜尋品質」。

建立結構定義

以下是建立 Cloud Search 結構定義的步驟:

  1. 找出預期使用者行為
  2. 初始化資料來源
  3. 建立結構定義
  4. 完整範例結構定義
  5. 註冊結構定義
  6. 建立資料索引
  7. 測試結構定義
  8. 調整結構定義

找出預期的使用者行為

預測使用者會提出的查詢類型,有助於制定建立結構定義的策略。

舉例來說,對電影資料庫發出查詢時,您可能會預期使用者會提出「顯示所有勞勃瑞福主演的電影」這類查詢。因此,您的結構定義必須支援根據「特定演員的所有電影」查詢結果。

如要定義結構定義來反映使用者的行為模式,請考慮執行下列工作:

  1. 評估不同使用者提出的各種所需查詢。
  2. 找出可能用於查詢的物件。物件是相關資料的邏輯集合,例如電影資料庫中的電影。
  3. 找出組成物件的屬性和值,這些屬性和值可能會用於查詢。「屬性」是物件的可編列索引屬性,可包含原始值或其他物件。舉例來說,電影物件可能會有電影名稱和上映日期等屬性,做為原始值。電影物件也可能包含其他物件,例如演員,這些物件本身也有屬性,例如姓名或角色。
  4. 找出屬性的有效值範例。是屬性編列索引的實際資料。舉例來說,資料庫中某部電影的名稱可能是「Raiders of the Lost Ark」。
  5. 決定使用者想要的排序和排名選項。舉例來說,查詢電影時,使用者可能想依時間排序,並依觀眾評分排名,不需要依片名依字母順序排序。
  6. (選用) 考慮是否要使用其中一個屬性代表搜尋可能執行的更具體情境,例如使用者的職責或部門,以便根據情境提供自動完成建議。舉例來說,搜尋電影資料庫的使用者可能只對特定類型的電影感興趣。使用者可以定義搜尋結果要顯示的類型,這可能屬於使用者設定檔的一部分。這樣一來,當使用者開始輸入電影查詢內容時,系統只會建議他們偏好的類型,例如「動作片」。
  7. 列出這些物件、屬性和範例值,以便用於搜尋。(如要進一步瞭解如何使用這份清單,請參閱「定義運算子選項」一節)。

初始化資料來源

資料來源代表已編列索引並儲存在 Google Cloud 的存放區資料。如要瞭解如何初始化資料來源,請參閱「管理第三方資料來源」。

系統會從資料來源傳回使用者的搜尋結果。使用者點選搜尋結果時,Cloud Search 會使用索引要求中提供的網址,將使用者導向實際項目。

定義物件

結構定義中的基本資料單位是「物件」,也稱為「結構定義物件」,是資料的邏輯結構。在電影資料庫中,其中一個資料的邏輯結構是「電影」。另一個物件可能是「person」,代表參與電影的演員和工作人員。

架構中的每個物件都有一系列屬性或屬性,用於描述物件,例如電影的片名和片長,或是人物的姓名和生日。物件的屬性可以包含原始值或其他物件。

圖 1 顯示電影和人物物件,以及相關聯的屬性。

實體之間的結構定義連結圖
圖 1. 範例結構定義,顯示兩個物件和一個子物件。

Cloud Search 結構定義基本上是 objectDefinitions 標記中定義的物件定義陳述式清單。下列結構定義程式碼片段顯示電影和人物結構定義物件的 objectDefinitions 陳述式。

{
  "objectDefinitions": [
    {
      "name": "movie",
      ...
    },
    {
      "name": "person",
      ...
    }
  ]
}

定義結構定義物件時,您必須為物件提供 name,且該物件在結構定義中的所有其他物件中必須是唯一的。通常您會使用描述物件的 name 值,例如電影物件的 movie。結構化定義服務會使用 name 欄位做為可建立索引物件的金鑰 ID。如要進一步瞭解 name 欄位,請參閱物件定義

定義物件屬性

如「ObjectDefinition」的參考資料所述,物件名稱後方會接續一組 options,以及 propertyDefinitions 清單。options 可進一步包含 freshnessOptionsdisplayOptionsfreshnessOptions 用於根據商品的新鮮度調整搜尋排名。displayOptions 可用於定義特定標籤和屬性是否會顯示在物件的搜尋結果中。

您可以在 propertyDefinitions 區段中定義物件的屬性,例如電影名稱和發行日期。

以下程式碼片段顯示具有兩項屬性的 movie 物件:movieTitlereleaseDate

{
  "objectDefinitions": [
    {
      "name": "movie",
      "propertyDefinitions": [
        {
          "name": "movieTitle",
          "isReturnable": true,
          "isWildcardSearchable": true,
          "textPropertyOptions": {
            "retrievalImportance": { "importance": "HIGHEST" },
            "operatorOptions": {
              "operatorName": "title"
            }
          },
          "displayOptions": {
            "displayLabel": "Title"
          }
        },
        {
          "name": "releaseDate",
          "isReturnable": true,
          "isSortable": true,
          "datePropertyOptions": {
            "operatorOptions": {
              "operatorName": "released",
              "lessThanOperatorName": "releasedbefore",
              "greaterThanOperatorName": "releasedafter"
            }
          },
          "displayOptions": {
            "displayLabel": "Release date"
          }
      ...
      ]
    }
  ]
}

PropertyDefinition 包含下列項目:

  • name 字串。
  • 與型別無關的選項清單,例如上一個程式碼片段中的 isReturnable
  • 類型及其相關聯的類型專屬選項,例如上一個程式碼片段中的 textPropertyOptionsretrievalImportance
  • operatorOptions,說明如何將屬性做為搜尋運算子使用。
  • 一或多個 displayOptions,例如先前程式碼片段中的 displayLabel

屬性的 name 在所含物件中不得重複,但其他物件和子物件可使用相同名稱。在圖 1 中,電影的片名和上映日期已定義兩次:一次是在 movie 物件中,另一次是在 person 物件的 filmography 子物件中。這個結構定義會重複使用 movieTitle 欄位,因此結構定義可以支援兩種搜尋行為:

  • 在使用者搜尋電影名稱時顯示電影結果
  • 當使用者搜尋演員演出的電影名稱時,顯示人物結果

同樣地,由於 releaseDate 欄位對兩個 movieTitle 欄位具有相同意義,因此結構定義會重複使用該欄位。

開發自己的結構化定義時,請考量存放區可能有哪些相關欄位含有您想在結構化定義中多次宣告的資料。

新增與類型無關的選項

「PropertyDefinition」PropertyDefinition會列出所有屬性通用的搜尋功能選項,不論資料類型為何。

  • isReturnable:指出屬性是否會識別應透過 Query API 在搜尋結果中傳回的資料。所有電影屬性範例都可傳回。系統可使用無法傳回的屬性搜尋或排序結果,但不會傳回給使用者。
  • isRepeatable - 指出屬性是否允許多個值。舉例來說,電影只有一個上映日期,但可以有多位演員。
  • isSortable - 表示屬性可用於排序。可重複的屬性不得為 true。舉例來說,電影結果可以依上映日期或觀眾評等排序。
  • isFacetable:表示該屬性可用於產生商情項目。 商情項目用於縮小搜尋結果範圍,使用者會先看到初始結果,然後新增條件或商情項目,進一步縮小結果範圍。如果屬性類型為物件,這個選項就不能為 true,且必須為 true 才能設定這個選項。isReturnable最後,這個選項僅支援列舉、布林值和文字屬性。舉例來說,在我們的範例結構定義中,我們可能會將 genreactorNameuserRatingmpaaRating 設為可切面,以便用於互動式修正搜尋結果。
  • isWildcardSearchable 表示使用者可以對這個屬性執行萬用字元搜尋。這個選項僅適用於文字資源。文字欄位的萬用字元搜尋運作方式,取決於 exactMatchWithOperator 欄位中設定的值。如果 exactMatchWithOperator 設為 true,系統會將文字值權杖化為一個原子值,並對其執行萬用字元搜尋。舉例來說,如果文字值為 science-fiction,萬用字元查詢 science-* 就會與該值相符。如果 exactMatchWithOperator 設為 false,系統會將文字值權杖化,並對每個權杖執行萬用字元搜尋。舉例來說,如果文字值為「science-fiction」,萬用字元查詢 sci*fi* 會與項目相符,但 science-* 不會相符。

這些一般搜尋功能參數都是布林值,預設值皆為 false,且必須設為 true 才能使用。

下表顯示所有 movie 物件屬性設為 true 的布林參數:

屬性 isReturnable isRepeatable isSortable isFacetable isWildcardSearchable
movieTitle true true
releaseDate true true
genre true true true
duration true
actorName true true true true
userRating true true
mpaaRating true true

genreactorName 都設為 true,因為電影可能屬於多個類型,而且通常有多位演員。isRepeatable如果屬性可重複或包含在可重複的子物件中,就無法排序。

定義類型

「PropertyDefinition」PropertyDefinition參考部分列出數個 xxPropertyOptions,其中 xx 是特定類型,例如 boolean。如要設定屬性的資料類型,您必須定義適當的資料類型物件。為屬性定義資料類型物件,即可建立該屬性的資料類型。舉例來說,為 movieTitle 屬性定義 textPropertyOptions,表示電影名稱為文字類型。以下程式碼片段顯示 movieTitle 屬性,並使用 textPropertyOptions 設定資料型別。

{
  "name": "movieTitle",
  "isReturnable": true,
  "isWildcardSearchable": true,
  "textPropertyOptions": {
    ...
  },
  ...
},

資源只能有一個相關聯的資料類型。舉例來說,在電影結構定義中,releaseDate 只能是日期 (例如 2016-01-13) 或字串 (例如 January 13, 2016),但不能同時使用兩者。

以下資料類型物件用於指定範例電影結構定義中屬性的資料類型:

屬性 資料類型物件
movieTitle textPropertyOptions
releaseDate datePropertyOptions
genre enumPropertyOptions
duration textPropertyOptions
actorName textPropertyOptions
userRating integerPropertyOptions
mpaaRating textPropertyOptions

為屬性選擇的資料類型取決於預期的用途。 在這個電影結構定義的想像情境中,使用者預期會想依時間順序排序結果,因此 releaseDate 是日期物件。舉例來說,如果預期用途是比較歷年 12 月和 1 月的發行內容,字串格式可能就很有用。

設定類型專屬選項

PropertyDefinition」參考部分會連結至各類型的選項。大多數類型專屬選項都是選用,但 enumPropertyOptions 中的 possibleValues 清單除外。此外,您也可以使用 orderedRanking 選項,根據值之間的相對關係進行排序。下列程式碼片段顯示 movieTitle 屬性,其中 textPropertyOptions 會將資料類型設為 textPropertyOptions,並提供 retrievalImportance 類型專屬選項。

{
  "name": "movieTitle",
  "isReturnable": true,
  "isWildcardSearchable": true,
  "textPropertyOptions": {
    "retrievalImportance": { "importance": "HIGHEST" },
    ...
  },
  ...
}

以下是範例結構定義中使用的其他類型專屬選項:

屬性 類型 類型專屬選項
movieTitle textPropertyOptions retrievalImportance
releaseDate datePropertyOptions
genre enumPropertyOptions
duration textPropertyOptions
actorName textPropertyOptions
userRating integerPropertyOptions orderedRankingmaximumValue
mpaaRating textPropertyOptions

定義運算子選項

除了類型專屬選項外,每種型別都有一組選用選項。operatorOptions這些選項說明屬性如何做為搜尋運算子使用。下列程式碼片段顯示 movieTitle 屬性,其中 textPropertyOptions 會設定資料型別,而 retrievalImportanceoperatorOptions 則會設定型別專屬選項。

{
  "name": "movieTitle",
  "isReturnable": true,
  "isWildcardSearchable": true,
  "textPropertyOptions": {
    "retrievalImportance": { "importance": "HIGHEST" },
    "operatorOptions": {
      "operatorName": "title"
    }
  },
  ...
}

每個 operatorOptions 都有 operatorName,例如 movieTitletitle。運算子名稱是該資源的搜尋運算子。搜尋運算子是指您預期使用者在縮小搜尋範圍時使用的實際參數。舉例來說,如要根據電影名稱搜尋電影,使用者可以輸入 title:movieName,其中 movieName 是電影名稱。

運算子名稱不必與屬性名稱相同。請改用反映貴機構使用者最常用字詞的運算符名稱。舉例來說,如果使用者偏好使用「名稱」一詞來指稱電影名稱,而非「片名」,則運算子名稱應設為「名稱」。

只要所有屬性都解析為相同類型,您就可以為多個屬性使用相同的運算子名稱。在查詢期間使用共用運算子名稱時,系統會擷取使用該運算子名稱的所有屬性。舉例來說,假設電影物件有 plotSummaryplotSynopsis 屬性,而這些屬性各有 operatorNameplot。只要這兩個屬性都是文字 (textPropertyOptions),使用 plot 搜尋運算子的單一查詢就會同時擷取這兩個屬性。

除了 operatorName 之外,可排序的屬性在 operatorOptions 中還可包含 lessThanOperatorNamegreaterThanOperatorName 欄位。使用者可以根據與提交值的比較結果,使用這些選項建立查詢。

最後,textOperatorOptionsoperatorOptions 中有 exactMatchWithOperator 欄位。如果將 exactMatchWithOperator 設為 true,查詢字串必須與整個屬性值相符,而不只是在文字中找到。在運算子搜尋和 facet 比對中,文字值會視為一個不可分割的值。

舉例來說,假設您要為書籍或電影物件建立索引,並加入類型屬性。類型可能包括「科幻」、「科學」和「小說」。如果將 exactMatchWithOperator 設為 false 或省略,搜尋類型或選取「科學」或「小說」層面時,也會傳回「科幻」的結果,因為系統會將文字權杖化,而「科幻」中存在「科學」和「小說」權杖。如果 exactMatchWithOperatortrue, 系統會將文字視為單一符記,因此「Science」和「Fiction」都不會與「Science-Fiction」相符。

(選用) 新增 displayOptions 區段

任何 propertyDefinition 區段結尾都有選填的 displayOptions 區段。這個部分包含一個 displayLabel 字串。displayLabel 是建議使用的屬性文字標籤,方便使用者辨識。如果屬性已設定為使用 ObjectDisplayOptions 顯示,這個標籤會顯示在屬性前方。如果屬性已設定為顯示,但未定義 displayLabel,則只會顯示屬性值。

下列程式碼片段顯示 movieTitle 屬性,其中 displayLabel 設為「Title」。

{
  "name": "movieTitle",
  "isReturnable": true,
  "isWildcardSearchable": true,
  "textPropertyOptions": {
    "retrievalImportance": { "importance": "HIGHEST" },
    "operatorOptions": {
       "operatorName": "title"
    }
},
  "displayOptions": {
    "displayLabel": "Title"
  }
},

以下是範例結構定義中 movie 物件所有屬性的 displayLabel 值:

屬性 displayLabel
movieTitle Title
releaseDate Release date
genre Genre
duration Run length
actorName Actor
userRating Audience score
mpaaRating MPAA rating

(選用) 新增 suggestionFilteringOperators[] 區段

任何 propertyDefinition 區段結尾都有選填的 suggestionFilteringOperators[] 區段。使用這個部分定義用於篩選自動完成建議的屬性。舉例來說,您可能會定義 genre 的運算子,根據使用者偏好的電影類型篩選建議。這樣一來,使用者輸入搜尋查詢時,自動完成建議只會顯示符合偏好類型的電影。

註冊結構定義

如要讓 Cloud Search 查詢傳回結構化資料,您必須向 Cloud Search 結構定義服務註冊結構定義。註冊結構定義時,需要您在「初始化資料來源」步驟中取得的資料來源 ID。

使用資料來源 ID 發出 UpdateSchema 要求,註冊結構定義。

如「UpdateSchema」參考頁面所述,請發出下列 HTTP 要求來註冊結構定義:

PUT https://cloudsearch.googleapis.com/v1/indexing/{name=datasources/*}/schema

要求內容應包含下列項目:

{
  "validateOnly": // true or false,
  "schema": {
    // ... Your complete schema object ...
  }
}

使用 validateOnly 選項測試結構定義的有效性,不必實際註冊。

建立資料索引

註冊結構定義後,請使用 Index 呼叫填入資料來源。建立索引的作業通常會在內容連結器中完成。

使用電影結構化資料時,單一電影的 REST API 索引要求如下所示:

{
  "name": "datasource/<data_source_id>/items/titanic",
  "acl": {
    "readers": [
      {
        "gsuitePrincipal": {
          "gsuiteDomain": true
        }
      }
    ]
  },
  "metadata": {
    "title": "Titanic",
    "sourceRepositoryUrl": "http://www.imdb.com/title/tt2234155/?ref_=nv_sr_1",
    "objectType": "movie"
  },
  "structuredData": {
    "object": {
      "properties": [
        {
          "name": "movieTitle",
          "textValues": {
            "values": [
              "Titanic"
            ]
          }
        },
        {
          "name": "releaseDate",
          "dateValues": {
            "values": [
              {
                "year": 1997,
                "month": 12,
                "day": 19
              }
            ]
          }
        },
        {
          "name": "actorName",
          "textValues": {
            "values": [
              "Leonardo DiCaprio",
              "Kate Winslet",
              "Billy Zane"
            ]
          }
        },
        {
          "name": "genre",
          "enumValues": {
            "values": [
              "Drama",
              "Action"
            ]
          }
        },
        {
          "name": "userRating",
          "integerValues": {
            "values": [
              8
            ]
          }
        },
        {
          "name": "mpaaRating",
          "textValues": {
            "values": [
              "PG-13"
            ]
          }
        },
        {
          "name": "duration",
          "textValues": {
            "values": [
              "3 h 14 min"
            ]
          }
        }
      ]
    }
  },
  "content": {
    "inlineContent": "A seventeen-year-old aristocrat falls in love with a kind but poor artist aboard the luxurious, ill-fated R.M.S. Titanic.",
    "contentFormat": "TEXT"
  },
  "version": "01",
  "itemType": "CONTENT_ITEM"
}

請注意,objectType 欄位中的 movie 值與結構定義中的物件定義名稱相符。Cloud Search 會比對這兩個值,判斷要在建立索引時使用哪個結構定義物件。

另請注意,由於結構定義屬性 releaseDate 是透過使用 datePropertyOptions 定義為 date 資料類型,因此 releaseDate 的索引會使用 yearmonthday 的子屬性 (繼承自這些屬性)。不過,由於結構定義中未定義 yearmonthday,因此您無法查詢其中一個屬性 (例如 year) 個別設定。

另請注意,可重複的 actorName 屬性如何使用值清單編入索引。

找出潛在的索引問題

與結構化資料和索引相關的兩個最常見問題如下:

  • 您的索引要求包含未向結構定義服務註冊的結構定義物件或屬性名稱。這個問題會導致系統忽略屬性或物件。

  • 您的索引要求含有屬性,但類型值與結構定義中註冊的類型不同。這個問題會導致 Cloud Search 在建立索引時傳回錯誤。

使用多種查詢類型測試結構定義

為大型正式版資料存放區註冊結構定義前,建議先使用較小的測試資料存放區進行測試。使用較小的測試存放區進行測試,可讓您快速調整結構定義,並刪除已建立索引的資料,不會影響較大的索引或現有的正式版索引。如果是測試資料存放區,請建立 ACL,只授權給測試使用者,這樣其他使用者就不會在搜尋結果中看到這項資料。

如要建立搜尋介面來驗證搜尋查詢,請參閱「搜尋介面」一文。

本節包含多個不同的範例查詢,可用於測試電影結構定義。

使用一般查詢進行測試

一般查詢會傳回資料來源中包含特定字串的所有項目。使用搜尋介面時,您可以輸入「鐵達尼號」"titanic",然後按下 Return 鍵,對電影資料來源執行一般查詢。搜尋結果應會傳回所有含有「鐵達尼號」一詞的電影。

與接線人員測試

在查詢中加入運算子,可將結果限制為符合該運算子值的項目。舉例來說,您可以使用 actor 運算子,找出由特定演員主演的所有電影。使用搜尋介面時,只要輸入 operator=value 配對 (例如 "actor:Zane"),然後按下 Return 鍵,即可執行這項運算子查詢。搜尋結果應會顯示所有由 Zane 演出的電影。

調整結構定義

開始使用結構定義和資料後,請持續監控使用者體驗,瞭解哪些功能正常運作,哪些功能無法正常運作。在下列情況下,您應考慮調整結構定義:

  • 為先前未編入索引的欄位建立索引。舉例來說,使用者可能會根據導演姓名重複搜尋電影,因此您可以調整結構定義,支援將導演姓名做為運算子。
  • 根據使用者意見回饋變更搜尋運算子名稱。運算子名稱應方便使用者辨識,如果使用者一直「記得」錯誤的運算子名稱,建議您變更名稱。

結構定義變更後重新建立索引

變更結構定義中的下列任何值需要重新為資料建立索引。您只要提交新的 UpdateSchema 要求,索引就會繼續運作:

  • 運算子名稱。
  • 整數最小值和最大值。
  • 整數和列舉排序等級。
  • 新鮮度選項。
  • 顯示選項。

如果進行下列變更,先前建立索引的資料會繼續根據先前註冊的架構運作。不過,如果更新後的結構定義有下列變更,您必須重新為現有項目建立索引,才能看到相關變更:

  • 新增或移除新資源或物件
  • isReturnableisFacetableisSortablefalse 變更為 true

只有在有明確的用途和需求時,才應將 isFacetableisSortable 設為 true

最後,當您透過標記屬性 isSuggestable 更新結構定義時,必須重新為資料建立索引,這會導致該屬性的自動完成功能延遲使用。

不允許的屬性變更

即使重新為資料建立索引,系統也不允許某些結構定義變更,因為這些變更會導致索引損毀,或產生不佳或不一致的搜尋結果。包括:

  • 屬性資料類型。
  • 屬性名稱。
  • exactMatchWithOperator」設定。
  • retrievalImportance」設定。

不過,您可以採取其他做法來解決這項限制。

進行複雜的結構定義變更

為避免變更導致搜尋結果品質不佳或搜尋索引損毀,Cloud Search 會在存放區建立索引後,禁止在 UpdateSchema 要求中進行特定變更。舉例來說,屬性的資料類型或名稱設定後就無法變更。即使重新為資料建立索引,也無法透過簡單的 UpdateSchema 要求達成這些變更。

如果必須對結構定義進行不允許的變更,通常可以進行一系列允許的變更,達到相同效果。一般來說,這項作業會先將已建立索引的屬性從舊版物件定義遷移至新版,然後只使用新版屬性傳送索引要求。

如要變更資源的資料類型或名稱,請按照下列步驟操作:

  1. 在結構定義中,將新屬性新增至物件定義。使用與要變更的屬性不同的名稱。
  2. 使用新定義發出 UpdateSchema 要求。請記得在要求中傳送整個結構定義,包括新舊屬性。
  3. 從資料存放區增補索引。如要回填索引,請使用新屬性傳送所有索引要求,但不要使用舊屬性,否則會導致查詢比對結果重複計算。

    1. 在索引回填期間,請檢查新屬性並預設為舊屬性,避免行為不一致。
    2. 回填完成後,請執行測試查詢來驗證。
  4. 刪除舊屬性。發出另一個 UpdateSchema 要求,但不要使用舊屬性名稱,並在日後的索引要求中停止使用舊屬性名稱。

  5. 將所有舊資源的使用情形遷移至新資源。舉例來說,如果將屬性名稱從「creator」變更為「author」,就必須更新查詢程式碼,將先前參照「creator」的位置改為參照「author」。

為避免重複使用已刪除的屬性或物件,導致索引結果不符預期,Cloud Search 會保留這些項目 30 天。在這 30 天內,您應停止使用已刪除的物件或屬性,包括從日後的索引要求中省略這些項目。這樣一來,日後如果決定恢復該屬性或物件,就能以確保索引正確性的方式進行。

瞭解大小限制

Cloud Search 對結構化資料物件和結構定義的大小設有限制。 這些限制包括:

  • 頂層物件的數量上限為 10 個。
  • 結構化資料階層的深度上限為 10 層。
  • 物件中的欄位總數上限為 1000 個,包括原始欄位數,以及每個巢狀物件中的欄位數總和。

後續步驟

您可以採取下列幾個後續步驟:

  1. 建立搜尋介面,測試結構定義。

  2. 調整結構化定義,提升搜尋品質

  3. 建立結構定義,以便最佳解讀查詢

  4. 瞭解如何運用 _dictionaryEntry 結構定義,為貴公司常用的字詞定義同義詞。如要使用 _dictionaryEntry 架構,請參閱定義同義詞

  5. 建立連接器