【问题标题】:searching for a phrase in Mongodb: weird behaviour在MongoDB中搜索一个短语:奇怪的行为
【发布时间】:2022-01-10 21:43:14
【问题描述】:

我有以下收藏:

books> db.books.find()
[
  {
    _id: ObjectId("61ab85b0056b5357b5e23e6b"),
    fields: 'hello good morning'
  },
  { _id: ObjectId("61ab85b5056b5357b5e23e6c"), fields: 'good morning' },
  {
    _id: ObjectId("61ab8679056b5357b5e23e6d"),
    fields: 'hello good morning guys'
  },
  {
    _id: ObjectId("61ab8684056b5357b5e23e6e"),
    fields: 'good morning guys'
  }
]

然后,我运行这个查询:

db.books.find({$text : {$search : "\"good morning\" hello"}})

我得到:

[
  { _id: ObjectId("61ab85b5056b5357b5e23e6c"), fields: 'good morning' },
  {
    _id: ObjectId("61ab8684056b5357b5e23e6e"),
    fields: 'good morning guys'
  },
  {
    _id: ObjectId("61ab85b0056b5357b5e23e6b"),
    fields: 'hello good morning'
  },
  {
    _id: ObjectId("61ab8679056b5357b5e23e6d"),
    fields: 'hello good morning guys'
  }
]

你能帮我理解输出吗?第一个结果对我来说没有多大意义(文档_id:...23e6c),因为它不包含“hello”字符串。

read第一个回答这个问题。这是否意味着,就我而言,mongodb 正在搜索

(good morning) AND (good OR morning OR hello)

这可以解释我的问题,但我在 mongodb documentation 中找不到对此的确切参考

提前致谢

【问题讨论】:

    标签: mongodb text-search


    【解决方案1】:

    直接来自docs

    MongoDB 解析并用于查询文本索引的术语字符串。 MongoDB 对术语执行逻辑 OR 搜索,除非指定为短语。有关该字段的更多信息,请参阅行为。

    这只是文本索引允许的行为,您可以做什么将每个表达式标记为“短语”,如下所示:

    {$text : {$search : "\"good morning\" \"hello\""}}
    

    这将强制执行$and 逻辑。

    【讨论】:

    • 在文档的同一页中,我还读到“如果 $search 字符串包含短语和单个术语,则文本搜索将仅匹配包含该短语的文档。”。我是否正确理解,通过在搜索字符串中包含一个短语,mongodb 将忽略任何额外的单个术语?它也可以解释我的输出。
    • 是的,你理解正确。我编辑了我的答案以反映这是一个更好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2015-09-25
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    相关资源
    最近更新 更多