mongodb全文檢索

近日用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\""}})

就醬

以上的名字和案例均爲虛構,如有侵權請聯繫作者。

參考文檔:

  1. https://www.jb51.net/article/112641.htm MongoDB學習之Text Search文本搜索功能
  2. mongodb官方文檔-$text搜索 (https://docs.mongodb.com/manual/reference/operator/query/text/)
  3. MongoDB text search logical AND

我的原文鏈接:https://www.jianshu.com/p/30b221eecc3b

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章