共用方式為


在 Azure DocumentDB 中使用文字索引進行搜尋與查詢

Azure DocumentDB 提供的一項關鍵功能是文字索引,能有效搜尋與查詢文字資料。 此服務會實作第 2 版文字索引。 版本 2 支援大小寫敏感度,但不支援變音符號敏感度。

Azure DocumentDB 中的文字索引是特殊的資料結構,用來優化基於文字的查詢,使其更快更有效率。 它們設計用來處理文字內容,如文件、文章、評論或其他大量文字資料。 文字索引運用分詞、詞幹處理及停止詞等技術,建立提升文字搜尋效能的索引。

先決條件

  • Azure 訂用帳戶

    • 如果您沒有 Azure 訂用帳戶,請建立 免費帳戶
  • 一個現有的 Azure DocumentDB 叢集

定義文字索引

為了簡化起見,讓我們來舉一個部落格應用程式的範例,其設置如下:

  • 資料庫名稱cosmicworks
  • 收藏名稱products

此範例應用程式將文章儲存為以下結構的文件:

{
  "_id": ObjectId("617a34e7a867530bff1b2346"),
  "title": "Azure DocumentDB - A Game Changer",
  "content": "Azure DocumentDB 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 DocumentDB 允許你在多個欄位建立文字索引,讓你能在文件中不同欄位間進行文字搜尋。

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

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

設定文字索引選項

Azure DocumentDB 中的文字索引提供多種自訂行為的選項。 例如,你可以指定文字分析的語言、設定權重以優先處理特定欄位,以及設定大小寫不區分的搜尋。 這裡有一個建立帶有選項的文字索引範例:

  1. 建立一個索引,以支援titlecontent欄位的搜尋,並提供英文語言支援。 另外,給欄位分配較高權重 title ,以在搜尋結果中優先排序。

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

文本索引中的權重

建立文字索引時,你可以為索引中的各個欄位分配不同的權重。 這些權重代表搜尋中每個欄位的重要性或相關性。 Azure DocumentDB 在執行文字搜尋查詢時,會根據搜尋詞計算分數並為每份文件分配權重。 分數代表文件與搜尋查詢的相關性。

  1. 建立索引以支援在 titlecontent 欄位上進行搜尋。 在「標題」欄位指派權重為 2,在「內容」欄位加權重為 1。

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

    備註

    當客戶端執行包含「DocumentDB」一詞的文字搜尋查詢時,該集合中每份文件的分數會根據該詞在「標題」與「內容」欄位中的出現與頻率計算,其中「標題」欄位因權重較高而獲得更高重要性。

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

建立好文字索引後,你可以在查詢中使用「text」運算子進行文字搜尋。 文字操作員會將搜尋字串與文字索引比對,以找到相關文件。

  1. 請對短語 DocumentDB進行文字搜尋。

    db.products.find(
        { $text: { $search: "DocumentDB" } }
    )
    
  2. 可選擇性地,在查詢中使用 $meta 投影運算子與 textScore 欄位一同查看權重

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

刪除文字索引

要在 MongoDB 中刪除文字索引,你可以在集合中使用 dropIndex() 方法,並指定你想刪除的文字索引的鍵或名稱。

  1. 透過明確指定鍵來刪除文字索引。

    db.products.dropIndex({ title: "text" })
    
  2. 可以透過指定自動產生的唯一名稱來刪除文字索引。

    db.products.dropIndex("title_text")
    

文字索引的限制

  • 一個集合只能定義一個文字索引。
  • Hint() 不支援搭配使用 $text 表達式的查詢。
  • 排序操作無法使用 MongoDB 中文字索引的排序。
  • 與其他索引類型相比,文字索引可能相對較大,佔用相當大的儲存空間。

後續步驟