我正在尝试为我的meteor webapp创建关键字搜索。在大多数情况下,它的工作原理是问题非常缓慢。在制作文章时的当前形式中,用户给它关键字。 keyS
一次从mongodb查询一篇带有搜索数组中的关键字的文章(skeywords
)然后给它一个分数,并将100个最高得分的文章发送给用户。如何一次查询所有相关文章?
ps我这样做是错的。
来自客户端的数据如下所示。
var keyw = ['java','code','jdk','food','good','cook'];
Meteor.call('keyS',keyw);
来自' keyS'的数据看起来是一系列文章ID。
例如
Sarticles = [someid,someid]
服务器
Meteor.methods({
keyS: function(skeywords) {
article: 'tempid',
var score = {
totalScore: 0
};
var potentials = [];
var badArticles = [];
var i = 0;
while (i < skeywords.length) {
var key = [];
key.push(skeywords[i]);
console.log(key);
if (typeof badarticles == "undefined") {
var theArticle = Articles.findOne({
articlekeywords: {
$in: key
}
});
} else {
var theArticle = Articles.findOne({
$and: [{
articlekeywords: {
$in: key
}
}, {
_id: {
$nin: badArticles
}
}]
});
};
if (typeof theArticle == "undefined") {
console.log("no more articles with that keyword")
i++;
continue
}
score.post = theArticle._id;
console.log(score.article);
score.totalScore = 0;
var points = 0;
var theKeywords = thearticle.keywords;
console.log("score worked");
var points = 0;
for (var a = 0; a < skeywords.length; a++) {
var keynumber = theKeywords.indexOf(skeywords[a]);
if (keynumber > -1) {
points++
} else {
continue
}
};
score.totalScore = points;
console.log(score.totalScore);
if (score.totalScore > 2) {
//limiter on number of posts looked at and number added to potentials
potentials.push({
iD: score.post,
totalScore: score.totalScore
});
var ID = score.article;
badposts.push(score.article);
console.log("added to potential" + ID + "to bad");
} else {
var badId = score.post;
console.log("marked as bad" + badId);
badposts.push(score.post);
}
};
potentials.sort(function(a, b) {
return b.totalScore - a.totalScore
})
for (var b = 0; b < 100; b++) {
if (typeof potentials[b] == "undefined") {
break
};
var ID = potentials[b].iD;
Meteor.users.update({
"_id": this.userId
}, {
"$addToSet": {
"Sarticles": ID
}
});
}
}
});
答案 0 :(得分:0)
我猜问题是服务器往返。为了获得更好的用户体验,您应该发布/订阅关键字列表,例如使其在客户端可用,然后搜索客户端。
您应该记住,关键字列表可能会变长很长时间。在我的搜索包中(Spomet,虽然不是1.0)但我只发布了1000个最常用的单词(除了最常见的单词,比如&#39;和&#39;)。
我的代码并不是很整洁,但它可能有所帮助:
这是客户端处理。在客户端进行搜索,然后使用服务器的实际结果更新客户端结果: https://github.com/Crenshinibon/spomet-pkg/blob/master/client.coffee
这是服务器端代码。发布发生在接近此文件的末尾: https://github.com/Crenshinibon/spomet-pkg/blob/master/server.coffee
另一个方面。您可以考虑撤消关键字的数据表示。使用关键字作为查找(在单独的集合中),并在数组中存储文章ID,如果使用了相关的关键字。在维基百科中搜索“反向索引”#39;对于某些背景。