MongoDB文本搜索逻辑

时间:2016-02-04 16:50:04

标签: mongodb mongoose

如果我想在下面进行MongoDB文本搜索,可以调整什么

var items = [{
  title: 'Fender Jazz Bass Guitar 4 String Barely used'
}, {
  title: 'Mark Bass'
}, {
  title: 'Fender Telecaster'
}, {
  title: 'Fender Double Fat Strat'
}];

db.collection('items').createIndex({ title: 'text'}, function(){});

// Using MongooseJS to query
Items.find({ $text: { $search: 'Fender Jazz Bass Guitar 4 String' }})

// After query this it does not return Fender Jazz Bass Guitar 4 String as the top most search result

我希望结果数组的第一个元素是Fender Jazz Bass Guitar 4 String Barely used

这甚至可能吗?还是我需要另一个更复杂的搜索引擎?

3 个答案:

答案 0 :(得分:1)

默认情况下,文本搜索不会按匹配分数的顺序返回匹配的文档,请参阅documentation。您需要使用$ sort阶段中的$meta表达式按textScore排序。

 Item.find({ $text: { $search: 'Fender Jazz Bass Guitar 4 String' }}, {score: {$meta: "textScore"}}).sort({score:{$meta:"textScore"}})

排序后,包含Fender Jazz Bass Guitar 4 String Barely used的文档应显示为结果中的第一个元素。

答案 1 :(得分:0)

在Mongo中使用文本搜索可以搜索单词(在您的情况下,搜索是针对任何文本索引字段,包含' Fender' OR' Jazz' OR' Bass&#39 ;或者'吉他' 4'或'字符串')

如果您想要专门显示短语,请使用短语约定转义字符串

{ $text: { $search: "\"Fender Jazz Bass Guitar 4 String\"" } }

<强>词 要匹配短语而不是单个字词,请将短语括在转义双引号中(\&#34;)

如果短语搜索选项不是您正在寻找的内容,那么我不知道如何轻松完成您所寻求的目标。可以找到有关构建搜索词组here

的更多信息

*编辑链接到MongoDB文档并澄清短语

答案 2 :(得分:0)

您正在寻找的是根据它们与您的关键字的相关性对结果进行排序。为此,mongodb文本搜索生成元评分.Meta评分是根据输入的关键字的文档的加权平均得分。您可以然后对此元评分进行排序。

这可以这样做:

db.yourcollectioname.find({ $text: { $search:"keywords" } },
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } })

要了解成功运行mongodb文本搜索查询需要遵循的所有步骤,请参阅以下文章:http://codewhoop.com/article/MongoDb%20Text%20Search%20in%20fields%20of%20document

我发现这篇文章非常有用。希望你也觉得它很有用:)