我正在寻找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)下表现不佳。全文搜索在交通繁忙的应用程序中毫无用处。有没有更好的方法可以实现这一目标,并可能优化查询并使查询速度更快?