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
}
使用
createIndex方法和text選項,來在title欄位上建立文字索引。use cosmicworks; db.products.createIndex({ title: "text" })備註
雖然每個集合只能定義一個文字索引,Azure DocumentDB 允許你在多個欄位建立文字索引,讓你能在文件中不同欄位間進行文字搜尋。
可選擇性地建立索引,以支援在
title和content欄位上的搜尋。db.products.createIndex({ title: "text", content: "text" })
設定文字索引選項
Azure DocumentDB 中的文字索引提供多種自訂行為的選項。 例如,你可以指定文字分析的語言、設定權重以優先處理特定欄位,以及設定大小寫不區分的搜尋。 這裡有一個建立帶有選項的文字索引範例:
建立一個索引,以支援
title和content欄位的搜尋,並提供英文語言支援。 另外,給欄位分配較高權重title,以在搜尋結果中優先排序。db.products.createIndex( { title: "text", content: "text" }, { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false } )
文本索引中的權重
建立文字索引時,你可以為索引中的各個欄位分配不同的權重。 這些權重代表搜尋中每個欄位的重要性或相關性。 Azure DocumentDB 在執行文字搜尋查詢時,會根據搜尋詞計算分數並為每份文件分配權重。 分數代表文件與搜尋查詢的相關性。
建立索引以支援在
title和content欄位上進行搜尋。 在「標題」欄位指派權重為 2,在「內容」欄位加權重為 1。db.products.createIndex( { title: "text", content: "text" }, { weights: { title: 2, content: 1 } } )備註
當客戶端執行包含「DocumentDB」一詞的文字搜尋查詢時,該集合中每份文件的分數會根據該詞在「標題」與「內容」欄位中的出現與頻率計算,其中「標題」欄位因權重較高而獲得更高重要性。
使用文字索引進行文字搜尋
建立好文字索引後,你可以在查詢中使用「text」運算子進行文字搜尋。 文字操作員會將搜尋字串與文字索引比對,以找到相關文件。
請對短語
DocumentDB進行文字搜尋。db.products.find( { $text: { $search: "DocumentDB" } } )可選擇性地,在查詢中使用
$meta投影運算子與textScore欄位一同查看權重db.products.find( { $text: { $search: "DocumentDB" } }, { score: { $meta: "textScore" } } )
刪除文字索引
要在 MongoDB 中刪除文字索引,你可以在集合中使用 dropIndex() 方法,並指定你想刪除的文字索引的鍵或名稱。
透過明確指定鍵來刪除文字索引。
db.products.dropIndex({ title: "text" })可以透過指定自動產生的唯一名稱來刪除文字索引。
db.products.dropIndex("title_text")
文字索引的限制
- 一個集合只能定義一個文字索引。
- Hint() 不支援搭配使用 $text 表達式的查詢。
- 排序操作無法使用 MongoDB 中文字索引的排序。
- 與其他索引類型相比,文字索引可能相對較大,佔用相當大的儲存空間。