1. 程式人生 > >MongoDB的全文索引

MongoDB的全文索引

Table of Contents

背景

如何使用

準備工作:插入資料

建立全域性索引

查詢結果

使用中存在哪些問題?

英文存在停止詞

中文無法採用全文索引


前面瞭解了多種索引方式,比如單鍵索引,多鍵索引,複合索引等,這些感覺都太空,咱今天學習一下實用的索引——全文索引。

背景

比如我們在慕課中搜索一個內容mongodb,他是在全域性搜尋,包括課程,猿問,手記等。如果這個時候我們通過常見的查詢,要寫多個模糊查詢,並且效能很慢,比如有些課程的題目中並沒有mongodb,但是課程的簡介中有mongodb,也需要查詢出來。這個對效能的要求就太高了,有可能查詢出來的時間根本忍受不了,就要砸電腦啦。

這個時候我們就可以使用MongoDB的全文索引功能。

如何使用

準備工作:插入資料

我們先做好準備工作,往資料庫裡面插入四條資料,如下圖

建立全域性索引

下圖的意思是在name欄位上建立全域性索引,注意index type為text,意思是建立全域性索引。

如果欄位選擇了$**,即表示全部欄位。下面都是用了在name欄位上加了全域性索引。

查詢結果

我們查詢name為zhangsan的資料,如下圖。

我們查詢name為zhangsan或lisi的資料,如下圖,空格連線,即空格表示或關係。

我們查詢name為zhangsan,排除為lisi的資料,如下圖,橫槓表示非的關係。

我們查詢name為zhangsan且name為one的資料,如下圖,轉義字元表示引號,如果字元加了引號即表示且的關係。

使用中存在哪些問題?

英文存在停止詞

上面的查詢雖然查詢出來挺好的,但是下面我們將找找他的問題。

比如現在資料庫中的資料如下。

我們要查詢name包含is的資料,按道理來說,我們應該查出兩條資料,可是執行結果如下。

一條資料都沒查出來,這是因為is為停止詞,具體原因:(該段取自https://www.cnblogs.com/yako/p/6805717.html)。

原來在英語裡面會遇到很多a,the,or等使用頻率很多的字或詞,常為冠詞、介詞、副詞或連詞等。如果搜尋引擎要將這些詞都索引的話,那麼幾乎每個網站都會被索引,也就是說工作量巨大。可以毫不誇張的說句,只要是個英文網站都會用到a或者是the。那麼這些英文的詞跟我們中文有什麼關係呢? 在中文網站裡面其實也存在大量的stopword,我們稱它為停止詞。比如,我們前面這句話,“在”、“裡面”、“也”、“的”、“它”、“為”這些詞都是停止詞。這些詞因為使用頻率過高,幾乎每個網頁上都存在,所以搜尋引擎開發人員都將這一類詞語全部忽略掉。如果我們的網站上存在大量這樣的詞語,那麼相當於浪費了很多資源。

中文無法採用全文索引

最大的問題來了,這貨居然不支援中文。啊啊啊,是不是要瘋啦。準確的來說,支援中文的能力沒有想象中強大。

比如資料如下,

我想查詢名稱中包含張的資料,結果是查詢不出來。

但我要查詢名稱中包含李的資料,結果卻有。

這說明MongoDB中文全文索引建立方式與英文幾乎相同 是根據詞(英文單詞)的方式建立的。 
如果一個值裡面有多個值 則需要按空格方式隔開,”李 四” 系統則認為是兩個詞。 
感覺MongodB的中文全文索引沒有想象中的強大。