共用方式為


在 Azure Cosmos DB for MongoDB 虛擬核心中文字索引進行搜尋和查詢

適用於: MongoDB 虛擬核心

Azure Cosmos DB for MongoDB 虛擬核心提供的主要功能之一是文字索引編製,可讓您有效率地搜尋和查詢以文字為基礎的資料。 此服務會實作第 2 版文字索引。 第 2 版支援區分大小寫,但不支援區分變音符號。

Azure Cosmos DB for MongoDB 中的文字索引屬於特殊資料結構,可最佳化以文字為基礎的查詢,使其更快速且更有效率。 其設計目的是要處理文件、文章、註解或任何其他文字密集型資料等文字內容。 文字索引會使用 Token 化、詞幹和停用字詞等技術來建立索引,以改善以文字為基礎的搜尋效能。

必要條件

定義文字索引

為了簡單起見,我們以採用下列設定的部落格應用程式為例:

  • 資料庫名稱cosmicworks
  • 集合名稱products

此範例應用程式會將文章儲存為具有下列結構的文件:

{
  "_id": ObjectId("617a34e7a867530bff1b2346"),
  "title": "Azure Cosmos DB - A Game Changer",
  "content": "Azure Cosmos DB is a globally distributed, multi-model database service.",
  "author": "John Doe",
  "category": "Technology",
  "published": true
}
  1. 使用 createIndex 方法搭配 text 選項,在 title 欄位上建立文字索引。

    use cosmicworks;
    
    db.products.createIndex({ title: "text" })
    

    注意

    雖然每個集合只能定義一個文字索引,但 Azure Cosmos DB for MongoDB 虛擬核心可讓您在多個欄位上建立文字索引,而能夠在文件中的不同欄位間執行文字搜尋。

  2. 選擇性地建立索引,以支援對 titlecontent 欄位的搜尋。

    db.products.createIndex({ title: "text", content: "text" })
    

設定文字索引選項

Azure Cosmos DB for MongoDB 中的文字索引附有數個可自訂行為的選項。 例如,您可以指定文字分析的語言、設定權數以排定特定欄位的優先順序,以及設定不區分大小寫的搜尋。 以下是使用選項建立文字索引的範例:

  1. 建立索引,以支援對 titlecontent 欄位的搜尋 (支援英文)。 此外,為 title 欄位指派較高的權數,以在搜尋結果中提高其優先順序。

    db.products.createIndex(
        { title: "text", content: "text" },
        { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false }
    )
    

文字索引中的權數

在建立文字索引時,您可以將不同的權數指派給索引中的個別欄位。 這些權數代表搜尋中每個欄位的重要性或相關性。 Azure Cosmos DB for MongoDB 虛擬核心會在執行文字搜尋查詢時,根據搜尋字詞為每個文件計算分數及指派權數。 此分數代表文件與搜尋查詢的相關性。

  1. 建立索引,以支援對 titlecontent 欄位的搜尋。 將權數 2 指派給 "title" 欄位,並將權數 1 指派給 "content" 欄位。

    db.products.createIndex(
    { title: "text", content: "text" },
    { weights: { title: 2, content: 1 } }
    )
    

    注意

    當用戶端使用 "Cosmos DB" 一詞執行文字搜尋查詢時,集合中每份文件的分數將會根據該字詞在 "title" 和 "content" 欄位中存在與否及其頻率來計算,而 "title" 欄位由於權數較高,因此會有較高的重要性。

使用文字索引執行文字搜尋

建立文字索引後,您可以在查詢中使用「文字」運算子來執行文字搜尋。 文字運算子會採用搜尋字串,並將其與文字索引比對以尋找相關的文件。

  1. 執行片語 Cosmos DB 的文字搜尋。

    db.products.find(
        { $text: { $search: "Cosmos DB" } }
    )
    
  2. 選擇性地在查詢中使用 $meta 投射運算子與 textScore 欄位以查看權數

    db.products.find(
        { $text: { $search: "Cosmos DB" } },
        { score: { $meta: "textScore" } }
    )
    

卸除文字索引

若要在 MongoDB 中卸除文字索引,您可以在集合上使用 dropIndex() 方法,並指定您要移除之文字索引的索引鍵或名稱。

  1. 明確指定索引鍵,藉以卸除文字索引。

    db.products.dropIndex({ title: "text" })
    
  2. 選擇性地指定自動產生的唯一名稱,藉以卸除文字索引。

    db.products.dropIndex("title_text")
    

文字索引限制

  • 一個集合只能定義一個文字索引。
  • 文字索引支援簡單的文字搜尋,且不提供規則運算式搜尋之類的進階搜尋功能。
  • 不支援將 Hint() 與使用 $text 運算式的查詢搭配使用。
  • 排序作業無法使用 MongoDB 中的文字索引順序。
  • 相較於其他索引類型,文字索引可能相對較大,因而耗用較大的儲存空間。

後續步驟