Самый быстрый способ выполнить динамическую c оценку на основе пользовательского ввода - PullRequest
0 голосов
/ 02 августа 2020

У меня есть некоторые данные, к которым я хотел бы применить оценку / рейтинг, но с использованием динамических 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
    }
}

Это нормально для одноразовой страницы с подробностями, но я надеялся включить расширенный поиск и фильтрацию в соответствии с собственными показателями пользователей. Некоторые проблемы, которые я вижу:

  1. Поиск - пользователь может захотеть найти все элементы, которые имеют оценку от 50 до 80 на основе их собственных показателей, указанных выше, что означает запуск журнала поиска c по все товаров, чтобы получить результат поиска. Мне нужен быстрый способ сделать это
  2. Кеширование - в идеале, если кто-то использует одни и те же параметры с другим пользователем, и результат был недавно сгенерирован, он должен получить кешированный результат

My текущий стек на Postgres отстает от Hasura с бессерверным узлом, выполняющим эту бизнес-логию c, описанную выше, но, к счастью, Hasura достаточно гибкая, чтобы добавить что-нибудь в стек, чтобы эта работа работала.

Мне интересно, какие варианты для решения такого рода вопросов? Я подумал:

  1. Postgres и переместите сюда логику ранжирования / бизнеса c - может быть недостаточно быстро при масштабном поиске?
  2. Elasticsearch, но оценка результаты, основанные на требованиях Dynami c, не сохраняются, поэтому Elasticsearch может не применяться (здесь я могу ошибаться)

Было бы здорово, если бы были идеи о том, как решить эту проблему.

...