Я отслеживаю заказы, сделанные посетителями магазина, и для каждого заказа я помещаю документ, который входит в индекс, подобный этому:
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