根据分配给标签的权重对文档进行搜索和排序

时间:2019-06-22 01:52:22

标签: arrays mongodb mongodb-query aggregation-framework

我正在寻找mongodb中基于标签的搜索的替代方法,该方法在交通繁忙的应用程序中(至少100 req / sec)可以很好地运行

以下是文档的示例。
Doc1

"unique_id": "cOxmb8",
"name":"Jon Snow",
"knows":"Nothing",
"height":173,
"tags": [
  "leader",
  "king in the north",
  "stark",
  "CastleBlack"] 

Doc2

"unique_id": "qxbf0d",
"name":"Samwell Tarly",
"knows":"Everything",
"height":172,
"tags": [
  "insightful",
  "sam the slayer",
  "tarly",
  "CastleBlack"]

馆藏有90万个文档。后端api位于golang中。 如果我搜索“ CastleBlack有见识的领导者”,则两个文档都将匹配2个标签。但我希望“ Samwell Tarly”首先出现。结果应针对高流量应用进行优化。

我通过将权重动态分配给api中的搜索字符串并根据权重之和对它们进行排序来实现此目的。以下是我在汇总中使用的管道。

CastleBlack := 3,
insightful := 2,
leader := 1


[{"$match":
    {"root_words":{"$all":["CastleBlack"]}},
    {"root_words":{"$all":["insightful"]}},
    {"root_words":{"$all":["leader"]}}
},
{"$project":
    {
    "unique_id":0,
    "name":1,
    "knows":1,
    "weight":
        {"$add":[ 
            {"$multiply":[{"$size":{"$setIntersection":["$root_words",["CastleBlack"]]}},3]},
            {"$multiply":[{"$size":{"$setIntersection":["$root_words",["insightful"]]}},2]},
            {"$multiply":[{"$size":{"$setIntersection":["$root_words",["leader"]]}},1]}
        ]}

    }
},
{"$sort":
    {
        "weight": -1,
    }

}
]

我使用$ all代替$ in,因为$ in在负载测试(100 req / sec)下表现不佳。全文搜索在交通繁忙的应用程序中毫无用处。有没有更好的方法可以实现这一目标,并可能优化查询并使查询速度更快?

0 个答案:

没有答案