簡易的 app engine 全文檢索

之前在弄 app engine 的全文檢索, 在官方文件都沒找到, 不過小 x 大大指點小弟我說有 SearchableModel 可以用, 才去翻了一下 app engine sdk 的 svn 找到 search 的這個 module, 只是實際試用一下, 這個功能沒支援中文, 它似乎只會把空格切開, 所以對於中文來說, 基本上就是無法使用, 用下面這個訊息舉例:

前幾天在弄 app engine 的全文檢索

這句的全文檢索資料會存成下面這樣的一個 List

[‘前幾天在弄’, ‘app’, ‘engine’, ‘的全文檢索’]

除了 “app" 跟 “engine" 可以搜尋到之外, 就只能用 “前幾天在弄" 跟 “的全文檢索" 這幾個詞可以搜尋到這則訊息, 所以只好捨棄了 SearchableModel 自己來做, 不過因為不熟 app engine, 所以沒有跟 model 做一個很好的整合, 嗯, 是根本沒有 XD 總之就是記錄一下自己的作法, 跟碰到效能的問題。

由於 app engine 的 model 可以直接用 list 來 filter 出結果, 像是:

keywords = ['少女', '時代']
Message.all().filter('keywords IN', keywords)

所以在建立 Message model 時, 就定個叫 keywords 的 StringListProperty, 把我們切好的字都存進去, 之後便可以透過上面的方法來搜尋。

而切字的作法是基本上跟 SearchableModel 的做法一樣, 先用空白切, 這樣就可以切開有正常空格的英文字, 但是得仍常會看到英文跟中文黏在一起的狀況, 像是:

測試twitter備份功能

相上面這種狀況這也得另外處理, 然後把中文相鄰的兩個字, 一組一組切開, 像是:

[‘測試’, ‘twitter’, ‘備份’, ‘份功’, ‘功能’]

其實原本我是切一個字跟兩個字, 不過因為 StringListProperty 在存入大量的 List 的時候, 會吃掉許多效能, 在 app engine dashboard 會一直看到紅字, 透過 appstats 就一直看到是在寫入 keywords 得部分吃掉最多 cpu time, 所以後來就只切兩個字, 減少 List 的長度。

反正基本上不允許搜尋一個字的就是了, 不過都只切成兩個字的話, 使用者搜尋的時候就不能打三個字或四個字來進行搜尋, 這時候就得把搜尋的字串也切一下, 例如上面這一句的狀況, 使用者可能會輸入 “備份功能", 這時候用同一個切字功能切成下面這樣就完全 match 了 XD

[‘備份’, ‘份功’, ‘功能’]

總之就變成使用者一定得輸入兩個字以上才能進行搜尋。 anyway 這樣一來就可以做個簡易的全文檢索了 ~ 當然 keywords 得給個 index 囉。

tzangms

Read more posts by this author.

Subscribe to Oceanic / 海海人生

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!