2016-02-04 77 views
0

什么有关MongoDB的文本搜索调整,如果我想这下面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

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

回答

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的文档应该显示为结果中的第一个元素。

+0

ahhh!我明白了,这完全有效!谢谢 –

0

在Mongo中使用文本搜索可以搜索单词(对于包含'Fender'或'Jazz'或'Bass'或'吉他'或'4'或'String'的任何文本索引字段搜索)

如果你想明确这个词组的出现,使用转义字符串

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

要匹配上一个短语,而不是个别条款的短语惯例,逃脱双封闭短语引号(\“)

如果短语搜索选项不是你正在寻找的,那么我不知道一个简单的方法来完成你正在寻找的东西。可以找到关于结构化搜索的更多信息短语here

*编辑链接到MongoDB的文档和澄清词

0

您正在寻找的是根据它们与关键字相关性对结果进行排序。为此,mongodb文本搜索会生成meta分数.Meta分数是根据输入关键字的文档的加权平均分数。您然后可以对这个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

我发现这篇文章非常有用的,你也发现它很有用:)