【问题标题】:Problem with Exact Word text search In MongoDBMongoDB中精确单词文本搜索的问题
【发布时间】:2019-04-28 11:14:11
【问题描述】:

我想使用以下代码查询 mongodb (3.6) 中的文本条目:

collection.aggregate([{$match:{$text:{$search: "gram"}}}])

在此查询中,将返回如下结果:

[{content:"Telegram is a messaging ...",tags:"Telegram"}, 
{content:"Instagram is a social ..." tags:"Instagram"}, 
{content:"gram is a unit of weight", tags:"gram"},
{content:"Mobogram is a shell for telegram", tags:"Mobogram"}]

但想要的结果是:

{ontent: "gram is a unit of weight",tags:"gram"}

这意味着我们正在寻找完全匹配。如何更改查询以获得完全匹配?

编辑:

索引是:

weights:{contents:1, tags:1}
default_language:english
language_override:language

这是用这个创建的:

collection.createIndex( { "content": 1, "tags": 1 } )

【问题讨论】:

  • 文本索引是如何创建的?结果文档的确切结构是什么(仅相关部分就足够了,即作为索引一部分的字段)?
  • 我编辑了原始问题。

标签: mongodb mongodb-query


【解决方案1】:

特定短语的语法是:

   { $text: { $search: '\"gram is a unit of weight\"' } }

不幸的是,实际上不可能在单词上搜索完全匹配,这是因为 mongo 使用 snowball 来对单词进行词干和索引。

但是,您可以尝试在文本搜索中匹配高于某个元分数。

例子:

假设我们有 2 个带有文本字段的文档,一个带有 sleep 一词,另一个带有 sleep 一词。 在创建文本索引时,mongo 会为这两个词保存术语“睡眠”。 因此,一旦我去搜索术语 sleep,即使我添加了完全匹配的语法,由于索引的性质,两者都将作为匹配返回。

了解 mongo 如何解析某些单词的一个可爱提示是运行:

model.find({$text: {$search: 'sleeping'}}).explain()

这将在winningPlan 对象中返回一个JSON:

{
  "terms": [
    "sleep"
  ],
  "negatedTerms": [],
  "phrases": [],
  "negatedPhrases": []
}

现在很容易理解哪些术语将匹配此搜索。

【讨论】:

  • 我试图重现该问题,但它实际上对我有用...我创建了几个带有 text 字段的文档,其中包含 OP 提供的内容,然后创建了一个带有默认设置的文本索引场地。 $match:{$text:{$search: "gram"}} 聚合阶段提供了正确的结果,即作为精确的单词匹配工作。使用 MongoDB 4.0.3 测试
  • 这又取决于 mongo 词干的方式,例如,如果我有 2 个文档,其中包含单词 sleep 和 sleep 。由于 mongo 索引这些术语的方式,一旦我搜索任何一个 sleep 都会得到两者。
猜你喜欢
  • 1970-01-01
  • 2011-07-04
  • 2023-03-28
  • 1970-01-01
  • 2022-12-22
  • 2018-09-27
  • 1970-01-01
  • 2018-12-07
  • 2017-10-21
相关资源
最近更新 更多