「MongoDB 實用功能分享」- MongoDB Atlas Search 基礎篇

Caspar Chang
9 min readMay 7, 2021

--

今天要來談論的是 MongoDB Atlas 的新功能 Atlas Search — 全文檢索引擎,以及如何透過 MongoDB Atlas Search 來快速打造永久免費的中文搜尋引擎。

緣起

為什麼想寫這篇文章呢? 實際上全文檢索的應用充斥在你我的身邊,從常見的搜尋引擎到購物網站的商品搜尋處處可見,各大網站如 Google/Facebook/LinkedIn/Netflix 等都有許多搜尋相關的應用。

而 MongoDB Atlas新推出的Atlas Search功能,能夠在MongoDB Atlas上直接進行”中文”的全文檢索,這讓我們在應用上更方便,更快速,更直覺。

支援中文搜尋

沒錯,MongoDB終於能夠用中文進行文字搜尋了,這是對於一個不是以搜尋引擎著名的資料庫來說是非常大的突破!

有別於MongoDB 3.2版開始提供的Text Search, MongoDB Atlas Search只能在MongoDB Atlas 4.2版以上使用,而且是透過內建Apache Lucune引擎來做全文檢索 (沒錯!你知道的那個!)。

Atlas Search vs Text Search

Atlas Search與Text Search在功能上會有些微的不同,以下是MongoDB目前提供兩種Search的簡單比較表。

為何推薦 Atlas Search

以往大部分的搜尋都是使用專門的資料庫如 ElasticSearch, Solr來實現,但是企業主要的資料庫通常都不會是以上兩種,所以可想而知當資料需要被搜尋的時候,還要透過同步抄寫的方式把資料丟到搜尋資料庫才能做全文檢索。

例如以下AWS分享如何透過DynamoDB Streams+Lambda+ElasticSearch打造搜尋引擎,就是在分享該如何透過一系列的方式設定並且實現資料自動化抄寫,但其本質上只是減少了一直資料庫抄寫的操作步驟,但並沒有省略其仍為需要人力介入的事實,仍然需要管理兩套資料庫,使用兩種連線與兩種程式碼
https://aws.amazon.com/tw/blogs/compute/indexing-amazon-dynamodb-content-with-amazon-elasticsearch-service-using-aws-lambda/

Atlas Search 如何運作

如果一套資料庫就能做到的功能,何必要組裝多個服務增加複雜度呢?

於是Atlas 從 4.2版開始做了一個很大的功能突破,也就是內建Apache Lucene,能夠直接進行完整的全文檢索。

對於使用者而言,無需再設定任何的資料移轉,無需再切換連線或是使用不同的資料庫操作語言,使用更方便,檢索更即時。

例如:我們可以用搜尋來篩選出感興趣的用戶,並且透過查詢來了解這些客戶的價值,進一步貼上標籤來實現精準營銷,而這些只需要簡單的資料庫語句。

Atlas Search 搜尋功能

現行 Atlas Search 能夠實現大多數市面上常見的搜尋功能 例如Text Search, Autocomplete, Highlighting, Fuzzy matching, Scoring 等等。

拜Lucene所賜,Atlas Search能夠實現大多數搜尋功能。

開始嶄新的搜尋之旅

所以接下來我將全程手把手的教學,帶領著大家透過 Atlas Search 快速打造一個永久免費的全文檢索引擎。

今天的旅程將參考 Atlas Search 範例

1.準備Atlas環境

首先我們需要在Atlas上面建立一個免費的集群,並且Load Sample Dataset, 因為接下來將會使用Movie Data作為演示,由於篇幅的關係關於Atlas的基礎操作就先跳過。

如果對於 Atlas 還不夠熟悉,可以參考我之前的 Webinar : MongoDB Atlas Onlie Workshop ,可以幫助大家快速熟悉介面與操作。

2.建立Search Index

使用Atlas Search非常的簡單,其實從頭到尾只要做一件事情,就是建立Search Index,然後就能夠進行全文檢索。

而 Atlas Search Index 使用的是 Lucene Index (inverted index) ,也是依賴Analyzer進行分詞存放與索引,有用過搜尋資料庫應該都不陌生。

註:關於Analyzer的說明,我會留在下一篇 "Atlas Search : 延伸使用" 作補充

我們會使用MongoDB Atlas的Sample Dataset當中的Movie collection來做電影的 標題/類型/大綱 的搜尋。

目前提供兩種建立Index有方式,Visual與JSON,兩種格式互通,可以互相轉換。

我們將使用JSON Editor, 並且選定namespace: sample_mflix.movies, 輸入indexname:json, 然後輸入下段JSON文字以建立search index。

{
"mappings": {
"dynamic": false,
"fields": {
"title": {
"type": "string",
"analyzer": "lucene.standard",
"multi": {
"keywordAnalyzer": {
"type": "string",
"analyzer": "lucene.keyword"
}
}
},
"genres": {
"type": "string",
"analyzer": "lucene.standard"
},
"plot": {
"type": "string",
"analyzer": "lucene.standard"
}
}
}
}

觀察Index建立的狀況,Index建立完成後就可以使用Atlas Search了!

註:免費的Tier 最多只能建立三組 Search Index

3.開始搜尋

之前提過,使用Atlas Search的優點就是使用同樣的語言進行查詢與搜尋,所以在下面的範例中,我們將使用MongoDB的Aggregation Pipeline進行。

查詢語法範例

//查詢電影的類型必須為"Comedy""Drama"use sample_mflix;
db.movies.aggregate([{$match: { genres: {$in: ["Comedy", "Drama"]}}}]);

搜尋語法範例

//搜尋電影的大綱類似"baseball"
//需指定indexname為剛剛建立的json
use sample_mflix;
db.movies.aggregate([{$search: { "index":"json", "text": { "query":"baseball", "path":"plot"}}}]);

進階搜尋

//搜尋情節有夏威夷或阿拉斯加,具有年代敘述,風格為喜劇或浪漫,標題有海灘或雪的電影use sample_mflix;
db.movies.aggregate([
{
$search: {
"index":"json",
"compound": {
"must": [ {
"text": {
"query": ["Hawaii", "Alaska"],
"path": "plot"
},
},
{
"regex": {
"query": "([0-9]{4})",
"path": "plot",
"allowAnalyzedField": true
}
} ],
"mustNot": [ {
"text": {
"query": ["Comedy", "Romance"],
"path": "genres"
}
},
{
"text": {
"query": ["Beach", "Snow"],
"path": "title"
}
} ]
}
}
},
{
$project: {
"title": 1,
"plot": 1,
"genres": 1,
"_id": 0
}
}
]);

4.延伸使用

由於篇幅的關係,關於Atlas Search進階的內容例如Fuzzy, Auto Complete, Custom Analyzer, 以及中文檢索等, 就留到下次持續跟大家分享了!

結語

Atlas Search屬於非常容易上手使用的功能,簡單實用,如果之前有搜尋相關的經驗,一定會有非常強烈的即視感(XD)。

但整體而言,這也是MongoDB Atlas持續提升用戶體驗的一個方式,希望能夠持續提供更多更好的功能來服務用戶。

Atlas Search是MongoDB Atlas在提供雲端資料庫的範疇內,從MongoDB Core Engine延伸出來專門針對全文檢索加強的功能,目前此功能也已經上線運作接近一年的時間,在功能與效能上都相對的穩定可用。

關於Atlas Search的功能演進,可持續關注Change Log

關於 MongoDB Atlas

MongoDB Atlas是由MongoDB公司直營的雲端資料庫服務,能夠免費創建一組MongoDB集群於AWS,AZURE,GCP三個公有雲,並且永久免費使用 (只限制可用資源)。

--

--

Caspar Chang

具有十年以上的資料庫開發與維運管理經驗,現任職於 MongoDB Taiwan 解決方案架構師