「MongoDB 實用功能分享」- MongoDB Atlas Search 基礎篇
今天要來談論的是 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打造搜尋引擎,就是在分享該如何透過一系列的方式設定並且實現資料自動化抄寫,但其本質上只是減少了一直資料庫抄寫的操作步驟,但並沒有省略其仍為需要人力介入的事實,仍然需要管理兩套資料庫,使用兩種連線與兩種程式碼。
Atlas Search 如何運作
如果一套資料庫就能做到的功能,何必要組裝多個服務增加複雜度呢?
於是Atlas 從 4.2版開始做了一個很大的功能突破,也就是內建Apache Lucene,能夠直接進行完整的全文檢索。
對於使用者而言,無需再設定任何的資料移轉,無需再切換連線或是使用不同的資料庫操作語言,使用更方便,檢索更即時。
例如:我們可以用搜尋來篩選出感興趣的用戶,並且透過查詢來了解這些客戶的價值,進一步貼上標籤來實現精準營銷,而這些只需要簡單的資料庫語句。
Atlas Search 搜尋功能
現行 Atlas Search 能夠實現大多數市面上常見的搜尋功能 例如Text Search, Autocomplete, Highlighting, Fuzzy matching, Scoring 等等。
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為剛剛建立的jsonuse 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三個公有雲,並且永久免費使用 (只限制可用資源)。