在 Azure Cosmos DB for MongoDB 虛擬核心中文字索引進行搜尋和查詢
適用於: MongoDB 虛擬核心
Azure Cosmos DB for MongoDB 虛擬核心提供的主要功能之一是文字索引編製,可讓您有效率地搜尋和查詢以文字為基礎的資料。 此服務會實作第 2 版文字索引。 第 2 版支援區分大小寫,但不支援區分變音符號。
Azure Cosmos DB for MongoDB 中的文字索引屬於特殊資料結構,可最佳化以文字為基礎的查詢,使其更快速且更有效率。 其設計目的是要處理文件、文章、註解或任何其他文字密集型資料等文字內容。 文字索引會使用 Token 化、詞幹和停用字詞等技術來建立索引,以改善以文字為基礎的搜尋效能。
必要條件
- 現有的 Azure Cosmos DB for MongoDB 虛擬核心叢集。
- 如果您沒有 Azure 訂用帳戶,請建立免費帳戶。
- 如果您有現有的 Azure 訂用帳戶,請建立新的 Azure Cosmos DB for MongoDB 虛擬核心叢集。
定義文字索引
為了簡單起見,我們以採用下列設定的部落格應用程式為例:
- 資料庫名稱:
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
}
使用
createIndex
方法搭配text
選項,在title
欄位上建立文字索引。use cosmicworks; db.products.createIndex({ title: "text" })
注意
雖然每個集合只能定義一個文字索引,但 Azure Cosmos DB for MongoDB 虛擬核心可讓您在多個欄位上建立文字索引,而能夠在文件中的不同欄位間執行文字搜尋。
選擇性地建立索引,以支援對
title
和content
欄位的搜尋。db.products.createIndex({ title: "text", content: "text" })
設定文字索引選項
Azure Cosmos DB for MongoDB 中的文字索引附有數個可自訂行為的選項。 例如,您可以指定文字分析的語言、設定權數以排定特定欄位的優先順序,以及設定不區分大小寫的搜尋。 以下是使用選項建立文字索引的範例:
建立索引,以支援對
title
和content
欄位的搜尋 (支援英文)。 此外,為title
欄位指派較高的權數,以在搜尋結果中提高其優先順序。db.products.createIndex( { title: "text", content: "text" }, { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false } )
文字索引中的權數
在建立文字索引時,您可以將不同的權數指派給索引中的個別欄位。 這些權數代表搜尋中每個欄位的重要性或相關性。 Azure Cosmos DB for MongoDB 虛擬核心會在執行文字搜尋查詢時,根據搜尋字詞為每個文件計算分數及指派權數。 此分數代表文件與搜尋查詢的相關性。
建立索引,以支援對
title
和content
欄位的搜尋。 將權數 2 指派給 "title" 欄位,並將權數 1 指派給 "content" 欄位。db.products.createIndex( { title: "text", content: "text" }, { weights: { title: 2, content: 1 } } )
注意
當用戶端使用 "Cosmos DB" 一詞執行文字搜尋查詢時,集合中每份文件的分數將會根據該字詞在 "title" 和 "content" 欄位中存在與否及其頻率來計算,而 "title" 欄位由於權數較高,因此會有較高的重要性。
使用文字索引執行文字搜尋
建立文字索引後,您可以在查詢中使用「文字」運算子來執行文字搜尋。 文字運算子會採用搜尋字串,並將其與文字索引比對以尋找相關的文件。
執行片語
Cosmos DB
的文字搜尋。db.products.find( { $text: { $search: "Cosmos DB" } } )
選擇性地在查詢中使用
$meta
投射運算子與textScore
欄位以查看權數db.products.find( { $text: { $search: "Cosmos DB" } }, { score: { $meta: "textScore" } } )
卸除文字索引
若要在 MongoDB 中卸除文字索引,您可以在集合上使用 dropIndex()
方法,並指定您要移除之文字索引的索引鍵或名稱。
明確指定索引鍵,藉以卸除文字索引。
db.products.dropIndex({ title: "text" })
選擇性地指定自動產生的唯一名稱,藉以卸除文字索引。
db.products.dropIndex("title_text")
文字索引限制
- 一個集合只能定義一個文字索引。
- 文字索引支援簡單的文字搜尋,且不提供規則運算式搜尋之類的進階搜尋功能。
- 不支援將 Hint() 與使用 $text 運算式的查詢搭配使用。
- 排序作業無法使用 MongoDB 中的文字索引順序。
- 相較於其他索引類型,文字索引可能相對較大,因而耗用較大的儲存空間。