我在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条记录的查询答案 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“。