首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MongoDb中为搜索的文档分配权重?

如何在MongoDb中为搜索的文档分配权重?
EN

Stack Overflow用户
提问于 2015-06-25 12:01:45
回答 1查看 1.2K关注 0票数 1

这对你来说可能听起来很简单,但我已经花了3个多小时来实现它,但我被困在了中途。

输入

  1. 关键词列表
  2. 标签列表

问题陈述:我需要从数据库中找到满足以下条件的所有文档:

  1. 列出具有一个或多个匹配关键字的文档。(已达到)
  2. 列出具有一个或多个匹配标记的文档。(已达到)
  3. 根据权重对发现的文档进行排序:每个关键字匹配携带2分,每个标记匹配携带1分。

查询:如何实现requirement#3。

我的尝试:在我的尝试中,我只能在关键字匹配的基础上列出(这也不会使权重与2相乘)。

标记是文档的数组。结构,每个标记的结构如下

代码语言:javascript
复制
{
   "id" : "ICC",
   "some Other Key" : "some Other value"
}

关键字是字符串数组:

代码语言:javascript
复制
["women", "cricket"]

查询:

代码语言:javascript
复制
var predicate = [
    {
        "$match": {
            "$or": [
                {
                    "keywords" : {
                        "$in" : ["cricket", "women"]
                    }
                },
                {
                    "tags.id" : {
                        "$in" : ["ICC"]
                    }
                }
            ]
        }
    },
    {
        "$project": {
            "title":1,
            "_id": 0,
            "keywords": 1,
            "weight" : {
                "$size": {
                    "$setIntersection" : [
                        "$keywords" , ["cricket","women"]
                    ]
                }
            },
            "tags.id": 1
        }   
    },
    {
        "$sort": {
            "weight": -1
        }
    }
]; 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-25 13:47:28

看起来,您的尝试很接近,但是您当然需要实现一些东西来“匹配您的逻辑”,以获得您想要的最终“得分”值。

这只是一个稍微改变投影逻辑的问题,并且假设“关键字”和“标记”都是文档中的数组:

代码语言:javascript
复制
db.collection.aggregate([
    // Match your required documents
    { "$match": {
        "$or": [
            {
                "keywords" : {
                    "$in" : ["cricket", "women"]
                }
            },
            {
                "tags.id" : {
                    "$in" : ["ICC"]
                }
            }
        ]
    }},

    // Inspect elements and create a "weight"
    { "$project": {
        "title": 1,
        "keywords": 1,
        "tags": 1,
        "weight": {
            "$add": [
                { "$multiply": [
                    {"$size": {
                        "$setIntersection": [
                            "$keywords",
                            [ "cricket", "women" ]             
                        ]
                    }}
                ,2] },
                { "$size": {
                    "$setIntersection": [
                        { "$map": {
                            "input": "$tags",
                            "as": "t",
                            "in": "$$t.id"
                        }},
                        ["ICC"]
                    ]
                }}
            ]
        }
    }},

    // Then sort by that "weight"
    { "$sort": { "weight": -1 } }
])

因此,这里基本的$map逻辑是“转换”另一个数组,只给出id值,以便与所需的"set“解决方案进行比较。

$add操作符向您想要“加权”您的响应的成员提供额外的“权重”。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31049822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档