首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB文本索引搜索

MongoDB文本索引搜索
EN

Stack Overflow用户
提问于 2018-04-17 17:39:03
回答 1查看 1.6K关注 0票数 4

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

代码语言:javascript
复制
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 }])

在此之后,我对字段、主题和作者进行了文本索引。

代码语言:javascript
复制
db.articles.createIndex(
    {subject: "text",
    author: "text"})

现在,我试图在索引字段中搜索一个带有"one“的单词。当我执行查询时..。

代码语言:javascript
复制
db.articles.count({$text: {$search: "\"one\""}})

..。结果是1

问题是当我想把“一”和"abc“结合起来的时候.

代码语言:javascript
复制
db.articles.count({$text: {$search: "\"one\" \"abc\""}}

..。给出了结果为4。其中包含主题名的记录为"lastone“、"firstone”、"everyone“、"one”作为结果。

因此,我的问题是,为什么第一个查询不获取4个记录?如何编写一个查询,该查询可以用单词"one“获取4条记录?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-17 20:37:01

这个命令..。

代码语言:javascript
复制
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可能会工作。以下查询..。

代码语言:javascript
复制
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“之一的文档。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49884312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档