我在mongo中创建了一个集合,如下所示
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。
问题是当我想把“一”和"abc“结合起来的时候.
db.articles.count({$text: {$search: "\"one\" \"abc\""}}..。给出了结果为4。其中包含主题名的记录为"lastone“、"firstone”、"everyone“、"one”作为结果。
因此,我的问题是,为什么第一个查询不获取4个记录?如何编写一个查询,该查询可以用单词"one“获取4条记录?
发布于 2018-04-17 20:37:01
这个命令..。
db.articles.count({$text: {$search: "\"one\""}})..。将计算具有确切短语"one"的文档。只有一个这样的文档,因此结果是1。
查询“一”应该只返回文档,因为只有一个包含“一个”或某个值的文档,其中“一个”是词干。来自医生们
对于不区分大小写和不区分对话框的文本搜索,
$text运算符与完整的词干词匹配。因此,如果文档字段包含单词blueberry,则搜索blue将不匹配。然而,蓝莓或蓝莓将与之相匹配。
看看你问题中的文件..。
one不是everyone的茎one不是lastone的茎one不是allone的茎one不是firstone的茎one不是noone的茎..。因此,所有这些文档都不会与值one相匹配。
当然,您可以使用多个值进行查询。例如:
one or abc,并正确地返回5:
db.articles.count({$text:{$search:"one abc“})"abc" AND ("abc" or "one"),并正确地返回5:
db.articles.count({$text:{$search:"\"abc\“one”})"one" AND ("one" or "abc"),但它以某种方式返回4:
db.articles.count({$text:{$search:“\”1\“abc”})在最后一个示例中,MongoDB包含"one“、"lastone”、"firstone“、"everyone”中的主题文档,但不包括主题为"nothing“的文档。这表明它以某种方式将"one“视为"lastone”、"firstone“和"everyone”的词干,但在执行count({$text: {$search: "one"}})时返回1,这清楚地表明one并不是"lastone“、"firstone”和"everyone“的词干。
我怀疑这可能是一个bug,可能值得用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“之一的文档。
https://stackoverflow.com/questions/49884312
复制相似问题