近日用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\""}})
当然,假如搜索 You know nothing,应该是搜索不到 Jon Snow的
就酱
以上的案例均为虚构,如有侵权请联系作者。
参考文档:
网友评论