Поиск и сортировка документов по весам, присвоенным тегам - PullRequest
0 голосов
/ 22 июня 2019

Я ищу альтернативу для поиска на основе тегов в 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).Полнотекстовый поиск бесполезен в приложениях с интенсивным движением.Есть ли лучший способ добиться этого и, возможно, оптимизировать и сделать запрос быстрее?

...