假設有一個交友網站,信息表以下:數據庫
美女1:「我要找在上海作 PHP 的哥哥。」架構
須要匹配 性別、城市、語言列。框架
美女2:「我要找北京的愛旅遊、愛漂亮食的 JAVA 哥哥。」分佈式
更復雜了是吧,實際場景中,會有更復雜的排列組合。網站
對於這類的搜索,關係型數據庫的索引就很難應付了,適合使用全文搜索的倒排索引。spa
倒排索引是一種數據庫的索引形式,存儲了 「內容 -> 文檔」 映射關係,目的是快速的進行全文搜索。3d
主要包括2個過程:blog
舉個例子,有2個文檔:索引
「 Recipe of pasta with sauce pesto」
「 Recipe of delicious carbonara pasta」
先對文檔進行分詞,造成一個個的 token,也就是 單詞,而後保存這些 token 與文檔的對應關係。token
結果以下:
搜索示例:
先分詞,獲得2個 token,( 「pasta」、「recipe」 )。
而後去倒排索引中進行匹配。
這2個詞在2個文檔中都匹配,因此2個文檔都會返回,並且分數相同。
一樣,2個文檔都匹配,都會返回。
此次 document#2 的分數要比 document#1 高。
由於 #2 匹配了2個詞(「carbonara」、「pasta」),#1 只匹配了一個(「pasta」)。
有時咱們能夠在保存和搜索以前對 token 進行一些轉換,最廣泛的例如:
中止詞是那些使用量很是大,但又沒有什麼意義的詞。
例如英文中的 「of」, 「the」, 「for」 ……
把單詞處理爲字典中的標準詞,例如:
「running」 => 「run」
「walks」 => 「walk」
「thought」 =>「think」
經過切斷詞尾將一個詞轉換成詞根形式的過程。
不能處理不規則動詞的狀況,但能夠處理字典中沒有的詞。
推薦閱讀: