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

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

我正在尝试为我的meteor webapp创建关键字搜索。在大多数情况下,它是有效的,问题是它非常慢。在当前表单中,当制作一篇文章时,用户会给它提供关键字。keyS使用搜索阵列中的关键字从mongodb一次查询一篇文章,然后给它评分,并将评分最高的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
                }
            });
        }
    }

});

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

您应该记住,关键字列表可能会增长很长。在我的搜索包Spomet中,不是1.0版本,尽管我只发布了1000个最常用的单词,除了最常见的停止词,如“and”

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

这里是客户端处理。在客户端搜索,然后使用来自服务器的真实结果更新客户端结果:

这是服务器端代码。发布发生在文件末尾附近:


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

根据我的经验,任何时候一种方法这么长,它都会从重构中受益——这可能会暴露问题所在。但更重要的是,让我问一下:用户类型是什么,预期结果是什么?例如,用户类型:'meteor mongodb performance'和一些文章被扫描,看它们是否标记了一个或多个关键词,然后根据它们实际拥有的关键词数量进行评分?@SteveRoss我添加了一些我认为应该有助于解释的内容。如果不行,我会再试一次。谢谢你的帮助。