首页 > 解决方案 > MongoDB中精确单词文本搜索的问题

问题描述

我想使用以下代码查询 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 } )

标签: mongodbmongodb-query

解决方案


特定短语的语法是:

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

不幸的是,实际上不可能在单词上搜索完全匹配,这是由于 mongo 使用雪球来词干和索引单词。

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

例子:

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

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

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

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

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

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


推荐阅读