MongoDB全字搜索,精确短语不返回预期结果

JBY*_*JBY 7 mongodb mongodb-query

所以根据MongoDB文档,

如果文档字段包含单词blueberry,则对术语blue的搜索将与文档不匹配

这对我的用例很有用,这就是我想要发生的事情.但是,给定以下数据库条目:

> db.test.drop()
> db.test.insert({ "t" : "Men's Fashion" })
> db.test.insert({ "t" : "Women's Fashion" })
> db.test.ensureIndex({ "t" : "text" })
Run Code Online (Sandbox Code Playgroud)

搜索Men's会返回预期结果:

> db.test.find({ "$text" : { "$search" : "\"Men's\"" } }, { "_id" : 0 })
{ "t" : "Men's Fashion" }
Run Code Online (Sandbox Code Playgroud)

然而,搜索整个短语Men's Fashion,意外地也回归女性时尚:

> db.test.find({ "$text" : { "$search" : "\"Men's Fashion\"" } }, { "_id" : 0 })
{ "t" : "Women's Fashion" }
{ "t" : "Men's Fashion" }
Run Code Online (Sandbox Code Playgroud)

我也尝试过"\"Men's\"\"Fashion\""同样的结果.是否有一个解决方法/技巧来使完整的短语只返回整个单词匹配?

我正在使用Mongo 2.6.4.有趣的是,它确实得分女性低于男性.

Jas*_*ols 3

您看到的结果是因为 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"
}
Run Code Online (Sandbox Code Playgroud)

与查询

db.getCollection('rudy_test').find({$text : {"$search" : "\"potato pancake\""}})
Run Code Online (Sandbox Code Playgroud)

这是由于条目确实包含整个查询,分数较低,因为它还包含其他文本。您可以改用正则表达式查询(即db.test.find({t : {$regex : /^Men\'s Fashion$/}}))。