Получить документы, в которых сумма значений в отфильтрованных вложенных документах соответствует заданным условиям - PullRequest
0 голосов
/ 26 июня 2019

Я отслеживаю заказы, сделанные посетителями магазина, и для каждого заказа я помещаю документ, который входит в индекс, подобный этому:

DELETE visitor_carts

PUT visitor_carts
{
  "mappings" : {
    "_doc": {
      "properties" : {
        "order_id": {
          "type": "text"
        },
        "products": {
          "type": "nested",
          "properties": {
            "event_quantity": {
              "type": "long"
            },
            "event_value": {
              "type": "float"
            },
            "product_id": {
              "type": "text"
            },
            "product_lists": {
              "type": "text"
            },
            "product_name": {
              "type": "text"
            }
          }
        },
        "visitor_id": {
          "type": "text"
        }
      }
    }
  }
}

Пример документа будет выглядеть следующим образом:

PUT visitor_carts/_doc/1
{
  "visitor_id" : "VisitorUid_1",
  "order_id" : "1000",
  "products" : [
    {
      "product_id" : "10_6",
      "product_name" : "product_10_6",
      "event_value" : 100.56,
      "event_quantity" : 4,
      "product_lists" : [
        "1"
      ]
    },
    {
      "product_id" : "10_6",
      "product_name" : "product_10_6",
      "event_value" : 11,
      "event_quantity" : 2,
      "product_lists" : [
        "42"
      ]
    }
  ]
}

Из множества покупок, которые совершил посетитель, я хотел бы получить количество документов, по которым товары соответствуют определенным критериям:

  • Оценивать только те продукты, которые имеют "42" в product_lists
  • Суммируйте стоимость этих продуктов по event_value, и это должно быть, например, между 100,00 и 200,00, чтобы выполнить условие
  • Суммируйте количество этих продуктов по event_quantity, и оно должно быть между 2 и 4, чтобы выполнить условие

Мой инстинкт подсказывает мне, что, как только я сделаю начальный запрос, в котором я выберу конкретный visitor_id, мне придется применить фильтр к результатам запроса, возможно, с помощью безболезненного сценария, который оценит каждый продукт и сравнит результат с набор параметров (значение product_lists, диапазон для event_value и диапазон для event_quantity), но я сидел над этим уже несколько дней и не могу заставить его работать, потому что он работает с вложенными документами. Все, что мне удалось сделать, - это подсчитать все вложенные документы для данного посетителя, но это даже не близко к тому, что мне нужно.

Пожалуйста, помогите, возможно, есть лучший способ сделать это. До сих пор я достиг чего-то вроде этого, но это очень долгий путь от дома:

POST visitor_carts/_search
{
  "query" : {
    "bool": {
      "must": [
        {
          "term": {
            "visitor_id": "VisitorUid_1"
          }
        },
        {
         "nested": {
           "path": "products",
           "query": {
             "bool": {
               "must": [
                 {
                   "term": {
                     "products.product_lists": "42"
                   }
                 }
               ]
             }
           }
         }
        }
      ]
    }
  }
}

Я использую версию 6.5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...