近日用mongodb做文本搜索遇到一個問題。針對國外的人的姓名搜索,之前的中文名完全匹配的搜索不能用了。
比如我們想Jon Snow 和 Snow Jon都能搜到,但名單庫裏,他的名字是有mid name的,比如Jon Aegon Snow。這樣,以前的match方式,是完全搜不到的。
想過用正則$regex,超級慢。。。
幸好發現了全文搜索。$text
db.persons.createIndex({"NameValue":"text"}) // 建立索引
幾種常用搜索
簡單的搜索
db.persons.find({$text:{$search:"Jon"}})
多關鍵詞搜索,注意這種搜索是 or的關係,有index 或者 有 operator都可以,所以,這個搜索會出來 Jon Snow,Jon Bon Jovi, Don Jon 等好多名字,而且 Jon Aegon Snow還不一定能出現在第一個
db.persons.find({$text:{$search:"Jon Snow"}})
有Jon 但是沒有Don的
db.persons.find({$text:{$search:"Jon -Don"}})
搜索包含Jon Snow的詞組。用這個搜索,我發現就出不來了。 因爲我們的庫裏面的詞組是Jon Aegon Snow
db.persons.find({$text:{$search:"\"Jon Snow\""}})
所以我以爲是評分的問題,加了下評分權重的排序。
db.persons.find( {$text:{$search:"Jon Snow"}}, {score:{$meta:"textScore"}} ).sort({score:{$meta:"textScore"}})
然並卵,Jon Snow還是不一定能排到最前面,我有點懵逼了
難道沒有辦法了麼。我已經開始找ES的資料了,妄圖用es和mongodb連接起來用。
萬幸,我在一個答案中找到了結果。
使用兩個短語,這就是一個邏輯上的AND關係,完美。假如你要使用mongodb 多個字符串匹配的查詢,就用這個。不過,據說對中文分詞不行。
db.persons.find({$text:{$search:"\"Jon\"\"Snow\""}})
就醬
以上的名字和案例均爲虛構,如有侵權請聯繫作者。
參考文檔:
- https://www.jb51.net/article/112641.htm MongoDB學習之Text Search文本搜索功能
- mongodb官方文檔-$text搜索 (https://docs.mongodb.com/manual/reference/operator/query/text/)
- MongoDB text search logical AND
我的原文鏈接:https://www.jianshu.com/p/30b221eecc3b