MongoDB文本索引搜索

时间:2018-04-17 17:39:04

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

我在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"})

现在我正在尝试用"一个"在索引字段中。当我执行查询...

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

...结果是1

问题在于,当我想要组合单词" one"," abc" ...

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

...它将结果显示为4。包括包含主题名称的记录为" lastone"," firstone"," everyone"," one"作为结果。

所以我的问题是为什么第一个查询dosn不能获取4条记录?我怎样才能编写一个可以用#34;一个"?

获取4条记录的查询

1 个答案:

答案 0 :(得分:3)

这个命令......

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

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

查询vaule“one”应仅返回文档,因为只有一个文档包含“one”或某个值,其中“one”是词干。来自the docs

  

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

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

  • 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”的文档。这表明它在某种程度上被视为“一个”是“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”,“所有人“,”每个人“,”没人“和author是”abc“。