Javascript 如何使这个关键字搜索工作?
我正在尝试为我的meteor webapp创建关键字搜索。在大多数情况下,它是有效的,问题是它非常慢。在当前表单中,当制作一篇文章时,用户会给它提供关键字。keyS使用搜索阵列中的关键字从mongodb一次查询一篇文章,然后给它评分,并将评分最高的100篇文章发送给用户。它怎么能一次查询所有相关文章 ps:我是不是做错了 来自客户端的数据如下所示Javascript 如何使这个关键字搜索工作?,javascript,mongodb,meteor,mongodb-query,keyword-search,Javascript,Mongodb,Meteor,Mongodb Query,Keyword Search,我正在尝试为我的meteor webapp创建关键字搜索。在大多数情况下,它是有效的,问题是它非常慢。在当前表单中,当制作一篇文章时,用户会给它提供关键字。keyS使用搜索阵列中的关键字从mongodb一次查询一篇文章,然后给它评分,并将评分最高的100篇文章发送给用户。它怎么能一次查询所有相关文章 ps:我是不是做错了 来自客户端的数据如下所示 var keyw = ['java','code','jdk','food','good','cook']; Meteor.call('keyS',k
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
}
});
}
}
});
我想问题在于服务器往返。为了获得更好的用户体验,您应该发布/订阅关键字列表,例如,在客户端使其可用,然后搜索客户端 您应该记住,关键字列表可能会增长很长。在我的搜索包Spomet中,不是1.0版本,尽管我只发布了1000个最常用的单词,除了最常见的停止词,如“and” 我的代码不是很整洁,但它可能会有所帮助: 这里是客户端处理。在客户端搜索,然后使用来自服务器的真实结果更新客户端结果: 这是服务器端代码。发布发生在文件末尾附近:
另一方面。您可能会考虑反转关键字的数据表示。将关键字用作单独集合中的查找,并在数组中存储文章ID(如果使用了相关关键字)。在维基百科上搜索“反向索引”,查找一些背景信息。根据我的经验,任何时候一种方法这么长,它都会从重构中受益——这可能会暴露问题所在。但更重要的是,让我问一下:用户类型是什么,预期结果是什么?例如,用户类型:'meteor mongodb performance'和一些文章被扫描,看它们是否标记了一个或多个关键词,然后根据它们实际拥有的关键词数量进行评分?@SteveRoss我添加了一些我认为应该有助于解释的内容。如果不行,我会再试一次。谢谢你的帮助。