【问题标题】:MongoDB text index searchMongoDB 文本索引搜索
【发布时间】:2018-09-27 18:53:19
【问题描述】:

我在 mongo db 中创建了一个集合,如下所示

db.articles.insert([
 { _id: 1, subject: "one", author: "abc", views: 50 },
 { _id: 2, subject: "lastone", author: "abc", views: 5 },
 { _id: 3, subject: "firstone", author: "abc", views: 90  },
 { _id: 4, subject: "everyone", author: "abc", views: 100 },
 { _id: 5, subject: "allone", author: "efg", views: 100 },
 { _id: 6, subject: "noone", author: "efg", views: 100 },
 { _id: 7, subject: "nothing", author: "abc", views: 100 }])

之后,我为字段主题和作者提供了文本索引。

db.articles.createIndex(
    {subject: "text",
    author: "text"})

现在我正在尝试在索引字段中搜索带有“one”的单词。当我执行查询时...

db.articles.count({$text: {$search: "\"one\""}})

...结果是1

问题是当我想要组合单词“one”,“abc”时......

db.articles.count({$text: {$search: "\"one\" \"abc\""}}

...它给出的结果为4。结果包括包含主题名称为“lastone”、“firstone”、“everyone”、“one”的记录。

所以我的问题是为什么第一个查询不获取 4 条记录?以及如何编写一个可以获取包含单词“one”的 4 条记录的查询?

【问题讨论】:

    标签: database mongodb mongodb-query database-administration mongo-shell


    【解决方案1】:

    这个命令...

    db.articles.count({$text: {$search: "\"one\""}})
    

    ... 将计算具有确切短语 "one" 的文档。只有一个这样的文档,因此结果是1

    使用值“one”进行查询应该只返回文档,因为只有一个文档包含“one”或“one”作为词干的某个值。来自the docs

    对于不区分大小写和不区分变音符号的文本搜索,$text 运算符匹配完整的词干词。因此,如果文档字段包含单词 blueberry,则对术语 blue 的搜索将不匹配。但是,blueberryblueberries 会匹配。

    查看您问题中的文件...

    • one 不是 everyone 的词干
    • one 不是 lastone 的词干
    • one 不是 allone 的词干
    • one 不是 firstone 的词干
    • one 不是 noone 的词干

    ...所以这些文档都不会匹配值one

    当然,您可以使用多个值进行查询。例如:

    • docs 建议将其评估为 one or abc 并正确返回 5:

      db.articles.count({$text: {$search: "one abc"}})
      
    • docs 建议将其评估为 "abc" AND ("abc" or "one") 并正确返回 5:

      db.articles.count({$text: {$search: "\"abc\" one"}})
      
    • docs 建议将其评估为"one" AND ("one" or "abc"),但它以某种方式返回 4:

      db.articles.count({$text: {$search: "\"one\" abc"}})
      

    在最后一个示例中,MongoDB 包含主题为“one”、“lastone”、“firstone”、“everyone”的文档,但不包括主题为“nothing”的文档。这表明它以某种方式将“one”视为“lastone”、“firstone”和“everyone”的词干,但在执行count({$text: {$search: "one"}}) 时,它返回1,这清楚地表明one 不被视为词干“lastone”、“firstone”和“everyone”。

    我怀疑这可能是一个错误,可能值得raising with MongoDB

    FWIW,您真正想要的可能是部分字符串搜索,在这种情况下 $regex 可能会起作用。以下查询...

    db.articles.count({ subject: { $regex: /one$/ }, author: { $regex: /abc$/ } })
    

    ... 表示类似count where subject like '%one%' and author like '%abc%' 的意思,对于返回4 的文档,即subject 是“one”、“lastone”、“firstone”、“allone”、“everyone”之一的文档, "noone" 和 author 是 "abc"。

    【讨论】:

    • 我不明白。 db.articles.count({author: "abc"}) 返回 5 个而不是 3 个文档。为什么你说有三个带有“abc”的文件?
    • @glytching 我还发现 db.articles.count({author: "abc"}) 的结果是 mickl 告诉的 5
    • 5 是“包含 abc 的文档”的正确计数。我已经更新了答案。这不会改变您为什么不匹配多个包含“one”的文档的解释。
    • @glytching 我的疑问是为什么当我使用关键字“\”one\“\”abc\“”搜索时它会给出4?如果 "one" 只给出 1 个结果,那么上述情况应该返回 1 而不是 4 对吗?
    • @Sameesh 同意,这令人困惑。我已经更新了我的答案,试图解决这个问题。
    猜你喜欢
    • 2018-10-26
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 2016-05-28
    • 2012-03-26
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    相关资源
    最近更新 更多