У меня есть некоторые данные, к которым я хотел бы применить оценку / рейтинг, но с использованием динамических c метрик, установленных пользователем. Структура ранжирования / поиска выглядит следующим образом:
{
"scoringMetrics": [
{
"scoringMetric": "itemA",
"type": "countryFilter",
"weighting": 0.2,
"target": ["AU"],
"exclude": []
},
{
"scoringMetric": "itemB",
"type": "countryFilter",
"weighting": 0.2,
"target": ["AU","NZ"],
"exclude": ["US"]
},
{
"scoringMetric": "itemC",
"type": "countryFilter",
"weighting": 0.1,
"target": ["AU"],
"exclude": ["NZ"],
},
{
"scoringMetric": "itemD",
"type": "countryFilter",
"weighting": 0.5,
"target": ["NZ"],
"exclude": ["CA","US","SA"]
},
]
Пользователь может устанавливать свои собственные веса, цели и исключения.
В конечном итоге возвращается
{
"results": {
"scores": [
{
"type": "itemA",
"score": 100,
"result": true,
"scoreStatus": "pass",
"scoreWeighted": 20
},
{
"type": "itemB",
"score": null,
"result": false,
"scoreStatus": null,
"scoreWeighted": null
},
{
"type": "itemC",
"score": 100,
"result": true,
"scoreStatus": "pass",
"scoreWeighted": 10
},
{
"type": "itemD",
"score": 100,
"result": true,
"scoreStatus": "pass",
"scoreWeighted": 50
}
],
"scoreOverall": 75,
"scoreOverallWeighted": 80
}
}
Это нормально для одноразовой страницы с подробностями, но я надеялся включить расширенный поиск и фильтрацию в соответствии с собственными показателями пользователей. Некоторые проблемы, которые я вижу:
- Поиск - пользователь может захотеть найти все элементы, которые имеют оценку от 50 до 80 на основе их собственных показателей, указанных выше, что означает запуск журнала поиска c по все товаров, чтобы получить результат поиска. Мне нужен быстрый способ сделать это
- Кеширование - в идеале, если кто-то использует одни и те же параметры с другим пользователем, и результат был недавно сгенерирован, он должен получить кешированный результат
My текущий стек на Postgres отстает от Hasura с бессерверным узлом, выполняющим эту бизнес-логию c, описанную выше, но, к счастью, Hasura достаточно гибкая, чтобы добавить что-нибудь в стек, чтобы эта работа работала.
Мне интересно, какие варианты для решения такого рода вопросов? Я подумал:
- Postgres и переместите сюда логику ранжирования / бизнеса c - может быть недостаточно быстро при масштабном поиске?
- Elasticsearch, но оценка результаты, основанные на требованиях Dynami c, не сохраняются, поэтому Elasticsearch может не применяться (здесь я могу ошибаться)
Было бы здорово, если бы были идеи о том, как решить эту проблему.