我想使用以下代码在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 } )
答案 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": []
}
现在很容易理解哪些词条将与此搜索匹配。