三月份 MongoDB 推出了 2.4 版,在其 Release Note 中,最大的亮點就是正式推出了 全文搜尋 (Text Search) 功能。

雖然看 Text Search 支援的語言列表中,並不支援中文,但因為搜尋是個我很感興趣的功能,所以還是來試玩看看,整理一下簡單的測試過程。

1. 到官網下載最新版的 MongoDB 2.4 

2. 使用以下指令,啓動 MongoDB

啓動的參數需加上 —setParameter textSearchEnabled=true,以告訴 Server 要啓用 Text Search 功能。

$ mongod --bind_ip 0.0.0.0 --dbpath=D:\tmp\FullTextTest --rest --setParameter textSearchEnabled=true

3. 新增測試資料

3.1 準備測試資料

我準備了一個資料檔 insert.js,在 News collection 下新增測試的文件,每個文件有兩個欄位︰標題 (Subject)內文 (Content)

因為只是簡易測試,所以我只有簡單整理三篇文章,其中兩篇是中文的新聞,另一篇是英文的 Blog 文章。當然如果未來想增加測試文件的數量,只要修改這個檔,加入文件內容就可以了。

內容如下︰

var docs = [{
        "Subject": "「九宮格」都會利用 鐵捕讚建仔:真的不一樣",
        "Content": "中國時報【(執筆:楊舒媚、江慧真)】 中華隊當家鐵捕高志綱對旅外巨投王建民的球有什麼評價?回首2002年釜山亞運,王建民是小聯盟球員,高志綱接建仔的球直覺地說,「哇,應該是大聯盟級的啊,還是大聯盟選手真是高過想像,這樣的程度都還沒辦法上去?」這次經典賽正面迎向王建民,高志綱更驚艷,「在大聯盟待過,他投球的感覺真的不太一樣。」建仔不太需要配球,「只要讓他自己保持好的節奏,結果不會差太多。」高志綱讚嘆,王建民的伸卡球太好了,且很清楚地知道怎麼去利用好球帶位置,「不是邊邊角角兩邊投得準就好,是九宮格都會利用,光是直球,就懂得用不一樣的角度嘗試。」對於郭泓志,「台灣出來的選手找不到像他這麼霸氣的!」高志綱形容,但小小郭上來時,多半是緊急狀況或球賽後半,「要慎重一點,讓他投得更有自信。」"
    },{
        "Subject": "MLB/黑田博樹展大和魂 受傷仍不想被取代",
        "Content": "記者陳浚錡/綜合報導 洋基隊日籍右投黑田博樹4日遭球擊中右手中指,即便接受初步檢查沒有大礙,第二天他仍感到有點不舒服,但他意志堅強不想被取代,接受訪問時表示,還是希望能夠趕上第二場先發。黑田第一戰先發對紅襪狀況不理想,首局就挨3支安打掉1分,2局上維多里諾(Shane Victorino)擊出投手前強襲球,黑田本能反應想伸出右手接,結果打到中指,雖然一開始還待在場上,但一連串的保送後仍被迫退場休息,而且表情痛苦。經過X光檢查以及斷層掃描,黑田手指骨頭並沒有斷,但他還是覺得有些不適,「我得說感覺並不尋常,打到的地方還是有點不舒服,我認為球打到手本來就會痛了。」這位38歲投手表示,他目前的底線就是要趕上下一場先發,不過還是會在6日進牛棚練投後確定狀況。黑田近兩季皆全勤出賽,投球局數更超過200,是洋基隊倚重的長局數先發投手,若他傷得比想像中嚴重,投手輪值勢必元氣大傷。不管黑田能不能投,洋基已經先做好備胎,由前役投5.1局失1分的右投華倫(Adam Warren)待命,去年是華倫大聯盟的第一年,但也只出賽1場,先發僅投2.1局被擊出8支安打,包括2支全壘打失6分,最後靠著洋基堅強打線逃敗。"
    },{
        "Subject": "MongoDB Full Text Search",
        "Content": "Yesterday we released the latest unstable version of MongoDB; the headline feature is basic full-text search. You can read all about MongoDB's full text search in the release notes.This blog had been using a really terrible method for search, involving regular expressions, a full collection scan for every search, and no ranking of results by relevance. I wanted to replace all that cruft with MongoDB's full-text search ASAP. Here's what I did."
    }];

db.News.insert(docs);

3.2 執行新增動作

在命令列下,執行以下指令,在 TextSearchTest DB 下,新增測試文件︰

$ mongo 127.0.0.1:27017/TextSearchTest insert.js

到此,我們已經將 MongoDB 的測試文件給建立好了。接下來就是建立全文索引,和測試搜尋的功能。

4. 建立全文索引

4.1 連接 DB

我們以下指令,連接 TextSearchTest DB︰

$ mongo 127.0.0.1:27017/TextSearchTest 

4.2 建立全文索引

在 MongoDB 下,以下列指令 ,建立 News collection 的全文索引︰

db.News.ensureIndex(
    {
        Subject: "text",
        Content: "text"
    }
);

5. 搜尋測試

再建立全文索引後,接下來就可以正式做搜尋功能的測試了,搜尋功能非常簡單,以要對 News collection 搜尋為例,搜尋指令如下︰

db.News.runCommand( "text" , { search: "搜尋關鍵字 " } )
我們分成英文與中文的功能測試︰

5.1 英文測試

簡單搜尋一下 MongoDB 這個詞︰

db.News.runCommand( "text" , { search: "MongoDB" } )

image


可以看到,結果是我們所預期的,最後一篇關於 MongoDB 的 blog 文章。

5.2 中文測試

我們再針對 王建民 做搜尋︰

db.News.runCommand( "text" , { search: "王建民" } )

image


結果則是無法正確的搜尋,我們所預期的第一篇中文新聞沒有顯示在搜尋結果中。

本文針對 MongoDB 新推出的 Text Search 功能,做一個非常簡單的功能測試。就目前測試的結果,要將 MongoDB 做為中文文件的搜尋引擎,現階段應該還是沒有辦法。或許後續的版本會再將中文搜尋納入支援的語言也不一定。