ценообразование на основе правил с ElasticSearch — предложения

Я новичок в ElasticSearch, реализую поиск товаров, цены на которые рассчитываются на основе правил по запрошенному количеству. Например:

  • От 1 до 5 единиц -> цена = единицы * X + Y
  • От 6 до 10 единиц 8 $ -> цена = единицы * Z
  • От 11 до 15 единиц 6 $ -> цена = единицы * Вт

(X, Y, Z, W могут быть константами или формулами)

Я пытался использовать безболезненный расчет цены во время запроса, но это было очень дорого, и для получения результата требовалось много времени.

Вторая стратегия, которую я применил, заключалась в том, чтобы определить базовую цену для каждого продукта, сохранить ее в elasticSearch, а затем применить формулу цены к каждому продукту (в nodejs) с учетом запрошенного количества. Этот подход был лучше с точки зрения производительности.

сложность, с которой я столкнулся сейчас, заключается в том, что мне нужно реализовать фильтр для цен с минимальным и максимальным значением, но я не могу фильтровать продукты, так как я рассчитываю цену после их получения. Я также не могу назначить цену во время индексации, потому что она зависит от запрошенного количества (n)

Знаете ли вы какое-либо быстрое и надежное решение, которое можно применить в тех случаях, когда цена продукта зависит от запрашиваемого количества и правил ценообразования, которые применяются к этому количеству?

Заранее благодарю за ваши комментарии :)


person Jacob    schedule 18.03.2021    source источник


Ответы (2)


Я бы посоветовал выполнить расчет в API, из которого вы вызываете ElasticSearch, и применить бизнес-логику (такие правила, как вы упомянули, с расчетом цены в зависимости от количества продуктов).

Что может быстро стать сложным, если вы придерживаетесь Elasticsearch для этого, так это синхронизация — не только любые изменения в продукте должны быть отражены в Elasticsearch (здесь я предполагаю, что вы используете Elasticsearch в качестве поисковой системы — объекты, вероятно, хранятся где-то еще [SQL, другой NoSQL]), но также необходимо синхронизировать любые изменения бизнес-правил. По моему опыту, работа с Elasticsearch в целом сложна (запросы — это одна тема, но обслуживание сложнее, чем, например, SQL).

person djaszczurowski    schedule 23.03.2021

ElasticSearch может выполнять формулы только с помощью Painless (который может быть чрезвычайно болезненным в использовании и мучительно медленным).

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

  • Price_cat1
  • Price_cat2
  • Price_cat3

Таким образом, ваши агрегации будут быстрее, и вы сможете выбрать правильный столбец из node.js, когда категория уже известна.

* Если категории могут часто меняться или ожидается, что их число вырастет до очень большого, вероятно, это не тот путь...

person Muhammad Ali    schedule 23.03.2021