【问题标题】:MongoDB full word search with exact phrase not returning expected results带有确切短语的MongoDB全词搜索未返回预期结果
【发布时间】:2015-07-27 17:10:06
【问题描述】:

所以根据 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,居然还返回 Women'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。有趣的是,它的女性得分确实低于男性。

【问题讨论】:

  • 好问题。我在使用 Mongo 3.0.4 时看到了同样奇怪的行为。
  • 因为女装与男装相匹配...

标签: mongodb mongodb-query


【解决方案1】:

您看到的结果是因为 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$/}}))。

【讨论】:

  • 杰森完全正确。问题也在jira.mongodb.org/browse/SERVER-20307中提出
  • 是的,它确实包含字符串,但它应该从结果中排除,因为它不是一个完整的单词匹配。要么,要么搜索“\”Men's\“”也应该返回woMEN's - 但它没有。从本质上讲,它是不一致的行为,具体取决于短语中的单词数量,根据我从 Dan 在错误报告中的回复中了解到的情况,这确实是一个计划修复的错误。
  • 另外,遗憾的是,正则表达式不是一个合适的解决方法,因为您失去了文本搜索的优势(最重要的是词干、评分和速度)。
猜你喜欢
  • 1970-01-01
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 2020-05-20
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
相关资源
最近更新 更多