在MongoDB中實現複雜的全文檢索搜尋或AI驅動的向量檢索時,通常需要引入並維護獨立的搜尋引擎(如Elasticsearch),這會增加系統架構的複雜性,並帶來額外的資料同步和營運成本。
MongoDB Search功能通過在MongoDB執行個體中整合專用的搜尋節點(mongot),提供與資料庫無縫整合的全文檢索索引和向量檢索能力。無需管理外部搜尋系統,即可使用MongoDB查詢語言(MQL)完成多模態搜尋任務,從而簡化開發、降低營運負擔。
計費說明(免費試用活動)
MongoDB Search功能當前處於邀測階段,可通過填寫表單申請試用。在此期間,開通並使用Search功能不收取mongot搜尋節點的費用,只需支付MongoDB主執行個體的費用。
適用範圍
當前僅支援MongoDB 8.0版本的複本集獨享型規格執行個體。暫不支援分區叢集。
當前僅支援公用雲地區。
工作原理
MongoDB Search通過為執行個體添加專用的mongot搜尋節點來隔離搜尋負載。該架構確保高強度的搜尋任務不影響核心資料庫(mongod節點)的請求處理效能。
架構核心:
mongot節點是承載全文檢索索引和向量檢索的獨立計算資源,專門負責處理$search(全文檢索索引)和$vectorSearch(向量檢索)請求。資料同步:mongot 節點通過 Change Stream 的方式非同步複製 mongod 節點的 oplog 來保持索引資料同步,保證最終一致性。
查詢路由:發起包含
$search或$vectorSearch的彙總查詢時,mongos會將搜尋部分路由到mongot節點執行,然後將搜尋結果與mongod節點上的常規查詢結果合并,最終返回統一的結果集。
開通Search服務
目的
為已有的MongoDB執行個體啟用Search功能,以建立專用的mongot搜尋節點。
操作步驟
訪問MongoDB複本集執行個體列表,在上方選擇資源群組和地區,然後單擊目標執行個體ID。
在左側導覽列,選擇MongoDB Search。
在MongoDB Search頁面,單擊立即開通。
在 開通 Search 面板中,配置搜尋節點規格。
參數
說明
規格
為
mongot搜尋節點選擇合適的計算規格。可根據預期的查詢並發量(QPS)和資料複雜度選擇。儲存
為
mongot節點分配用於儲存Search索引的磁碟空間。該空間獨立於主執行個體的儲存。可根據來源資料量和索引複雜度預估,並留出一定餘量。建議搜尋節點規格和儲存大小不低於主執行個體的規格和儲存大小,後續可根據實際負載進行變更配置。
閱讀並勾選服務合約。
單擊去支付。
等待建立成功後,可在 MongoDB Search 頁面查看新建立的Search節點資訊,並進行變更配置、重啟、釋放操作。
管理Search節點
在 MongoDB Search 頁面,可對已建立的Search節點執行以下操作:
變更配置:調整
mongot節點的計算規格或儲存空間以適應業務變化。Search節點數量預設為2個,暫不支援變更。重啟:在排查問題或應用某些配置時,可以重啟
mongot節點。重啟期間,搜尋服務將短暫不可用。釋放:如果不再需要Search功能,可釋放
mongot節點。重要釋放操作會永久刪除所有已建立的Search索引,且不可恢複。
建立與使用Search索引
目的
通過建立不同類型的Search索引,啟用全文檢索索引或向量檢索功能。所有操作均通過MongoDB Shell(mongosh)或相容的MongoDB驅動程式完成。
前提條件
已使用mongosh或應用程式串連到目標MongoDB執行個體。
樣本一:實現商品評論的全文檢索索引
本樣本示範如何為reviews集合建立全文Search索引,並執行關鍵詞查詢。
建立動態映射的Search索引。
dynamic: true使MongoDB自動為集合中的所有欄位建立索引,適合快速原型驗證。// 在名為 'reviews' 的集合上建立一個名為 'reviews_full_text_index' 的Search索引 db.reviews.createSearchIndex({ name: "reviews_full_text_index", definition: { "mappings": { "dynamic": true } } });使用
$search彙總階段查詢包含特定關鍵詞的評論。 以下查詢將尋找comment欄位中包含“good”的評論,並返回評論內容、評分和商品ID。db.reviews.aggregate([ { $search: { index: "reviews_full_text_index", // 指定要使用的Search索引 text: { query: "good", // 查詢關鍵詞 path: "comment" // 在 'comment' 欄位中搜尋 } } }, { $limit: 5 }, { $project: { _id: 0, productId: 1, rating: 1, comment: 1, score: { $meta: "searchScore" } // 返回搜尋相關性得分 } } ]);
樣本二:實現基於圖片特徵的以圖搜圖
本樣本示範如何為儲存了圖片向量特徵的集合images建立向量Search索引,並執行相似性搜尋。
建立向量Search索引。 需指定向量欄位的路徑、維度(
numDimensions)和相似性計算方法(similarity)。// 在名為 'images' 的集合上建立一個名為 'vector_index' 的向量索引 db.images.createSearchIndex( "vector_index", "vectorSearch", { "fields": [ { "type": "vector", "path": "plot_embedding_voyage_3_large",// 儲存向量的欄位 "numDimensions": 2048,// 向量的維度 "similarity": "dotProduct",// 相似性計算方法 "quantization": "scalar" } ] } );使用
$vectorSearch彙總階段尋找與給定圖片最相似的圖片。 需提供一個查詢向量(queryVector),它通常由AI模型根據輸入圖片產生。numCandidates:候選集大小。這是一個效能與召回率的權衡參數。增加此值可以提高召回準確率,但會消耗更多資源並可能增加延遲。// 假設 QUERY_EMBEDDING 是由AI模型產生的1024維向量 const QUERY_EMBEDDING = [0.12, 0.45, -0.23, ...]; // 樣本向量,請替換為真實向量資料 // 根據向量相似複雜度進行檢索 db.images.aggregate([ { "$vectorSearch": { "index": "vector_index", "path": "plot_embedding_voyage_3_large", "queryVector": QUERY_EMBEDDING, "numCandidates": 150, "limit": 10, "quantization": "scalar" } }, { "$project": { "_id": 0, "plot": 1, "title": 1, "score": { $meta: "vectorSearchScore" } } } ])
應用於生產環境
監控與營運
監控指標:
mongot搜尋節點暫時沒有獨立的監控指標。可通過觀察主執行個體的CPU、記憶體、IO和網路指標來間接評估搜尋負載的影響。日誌管理:
mongot節點暫不支援作業記錄、慢日誌或審計日誌的查看。對於慢查詢,建議使用explain()方法分析$search或$vectorSearch階段的執行計畫來定位效能瓶頸。索引管理:可通過
db.collection.getSearchIndexes()命令查看已建立的Search索引及其狀態。
高可用與故障切換
Search節點預設以2節點架構部署。當其中一個節點發生故障時,系統會自動執行故障切換,將流量路由到健康的節點,請確保業務具備重試機制。
備份恢複與資料同步
備份恢複:通過備份檔案恢複的新執行個體不包含原執行個體的Search索引。需在新執行個體上重新開通Search服務並重建所有Search索引。
資料移轉:使用Data Transmission Service(DTS)等工具進行資料移轉或同步時,Search索引不會被同步。需在目標執行個體上手動建立索引。
常見問題
Q:寫入資料後多久可以搜尋?
A:資料同步是非同步,通常在秒級延遲內即可搜尋。延遲受執行個體寫入負載、文檔大小和網路狀況等因素影響。
Q:在什麼情況下會觸發索引重建?升降配是否會觸發索引重建?
A:當更改索引定義時,mongot會自動在後台重建新的索引,此時舊索引仍可支援查詢, 一旦新索引完成構建,舊索引就不再可用。搜尋節點升降配和索引重建並沒有直接關聯。