Я ищу альтернативу для поиска на основе тегов в mongodb, которая могла бы хорошо работать в приложениях с интенсивным трафиком (не менее 100 запросов / сек).
Ниже приведен пример документации. 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"]
Коллекция имеет 900 тыс. Документов.Бэкэнд API находится в Голанге.Если я буду искать «проницательного лидера CastleBlack», оба документа будут соответствовать 2 тегам.Но я хочу, чтобы «Сэмвелл Тарли» появился первым.Результаты должны быть оптимизированы для приложений с большим трафиком.
Я достиг этого, динамически назначая веса в строку поиска в моем 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).Полнотекстовый поиск бесполезен в приложениях с интенсивным движением.Есть ли лучший способ добиться этого и, возможно, оптимизировать и сделать запрос быстрее?