0

我正在尝试为我的流星 webapp 创建关键字搜索。在大多数情况下,它的工作问题是它非常慢。在当前形式中,用户在撰写文章时为其提供关键字。一次从 mongodbkeyS中用搜索数组(skeywords怎么可能一次查询所有相关文章?

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
                }
            });
        }
    }

});
4

1 回答 1

0

我想问题是服务器往返。为了更好的用户体验,您应该发布/订阅关键字列表,例如使其在客户端可用,然后搜索客户端。

您应该记住,关键字列表可能会变得很长。在我的搜索包(Spomet,虽然没有准备好 1.0)中,我只发布了 1000 个最常用的词(除了最常见的停用词,比如“和”)。

我的代码不是很整洁,但它可能会有所帮助:

这是客户端处理。在客户端搜索,然后使用来自服务器的真实结果更新客户端结果: https ://github.com/Crenshinibon/spomet-pkg/blob/master/client.coffee

这是服务器端代码。发布发生在此文件的末尾附近: https ://github.com/Crenshinibon/spomet-pkg/blob/master/server.coffee

另一方面。您可能会考虑反转关键字的数据表示。使用关键字作为查找(在单独的集合中)并将文章 ID(如果使用了相关关键字)存储在数组中。在维基百科中搜索“倒排索引”以获取一些背景信息。

于 2014-12-01T13:20:35.713 回答