如何使这个关键字搜索工作?

时间:2014-11-30 20:17:29

标签: javascript mongodb meteor mongodb-query keyword-search

我正在尝试为我的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
                }
            });
        }
    }

});

1 个答案:

答案 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;对于某些背景。