MongoDB中的精确Word文本搜索问题

时间:2019-04-28 11:14:12

标签: mongodb mongodb-query

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

1 个答案:

答案 0 :(得分:0)

特定短语的语法为:

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

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

不过,您可以尝试在文字搜索中将匹配度提高到某个元得分以上。

示例:

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

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

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

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

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

现在很容易理解哪些词条将与此搜索匹配。