所以根据MongoDB文档,
如果文档字段包含单词blueberry,则搜索该术语 蓝色与文档不匹配
这对我的用例很有用,这就是我想要发生的事情。但是,考虑到以下数据库条目:
> db.test.drop()
> db.test.insert({ "t" : "Men's Fashion" })
> db.test.insert({ "t" : "Women's Fashion" })
> db.test.ensureIndex({ "t" : "text" })
搜索Men's会返回预期结果:
> db.test.find({ "$text" : { "$search" : "\"Men's\"" } }, { "_id" : 0 })
{ "t" : "Men's Fashion" }
然而,搜索整个短语Men's Fashion,意外地也回归女性时尚:
> db.test.find({ "$text" : { "$search" : "\"Men's Fashion\"" } }, { "_id" : 0 })
{ "t" : "Women's Fashion" }
{ "t" : "Men's Fashion" }
我也尝试了"\"Men's\"\"Fashion\""
并获得了相同的结果。是否有一个解决方法/技巧可以使完整的短语只返回整个单词匹配?
我正在使用Mongo 2.6.4。有趣的是,它确实得分女性低于男性。
答案 0 :(得分:2)
您看到的结果是因为在搜索字符串中搜索字符串 的意义上,woMEN' S FASHION与MEN' S FASHION匹配。
此数据集不会发生匹配行为:
/* 1 */
{
"_id" : ObjectId("55ca6060fb286267994d297e"),
"text" : "potato pancake"
}
/* 2 */
{
"_id" : ObjectId("55ca6075fb286267994d297f"),
"text" : "potato salad"
}
/* 3 */
{
"_id" : ObjectId("55ca612ffb286267994d2980"),
"text" : "potato's pancake"
}
带有查询
db.getCollection('rudy_test').find({$text : {"$search" : "\"potato pancake\""}})
由于条目确实包含整个查询这一事实导致分数降低,因为它也包含其他文本。您可以使用Regular Expression Query(即db.test.find({t : {$regex : /^Men\'s Fashion$/}})
)代替。