Elasticsearch api - агрегирование заказов по @timestamp - PullRequest
1 голос
/ 02 августа 2020

В моем индексе много документов с другой структурой. Общие ключи для всех документов - это следующие ключи: (Магазин, владелец, продукты, метка времени)

{"Store":"books for school","owner":"user_15","products":40,"@timestamp":2020/08/02T18:00, "a1":1,"a2":...}
{"Store":"books for school","owner":"user_15","products":45,"@timestamp":2020/08/02T19:00,"b1":1...}
{"Store":"books for school","owner":"user_17","products":55,"@timestamp":2020/08/02T20:00, "b2":1....}

В моем приложении я пытаюсь получить самые последние общие ключи для каждого магазина (владелец ,товары). Итак, для этого примера я хотел получить последний документ в этом примере.

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

{
  "size": 0,
  "aggs": {
    "store_aggr": {
      "terms": {
        "field": "Store"
      },
      "aggs": {
        "owner_aggr": {
          "terms": {
            "field": "owner"
          }
          }
          ,
            "products_aggr": {
              "terms": {
                "field": "products"
              }
            }
                
        }
      }
    }
  
}

Как я могу упорядочить внутренние сегменты запроса с помощью @timestamp? Таким образом, я могу просто взять первое значение, и оно определенно будет самым новым ..

Кроме того, как я могу отфильтровать данные, чтобы документы были за последние два дня? Нужно ли мне добавлять фильтр запросов в поле @timestamp?

1 Ответ

1 голос
/ 02 августа 2020

Да, вам понадобится запрос range, чтобы выбрать только последние два дня. Что касается сортировки - вы можете использовать упорядоченный top_hits agg для получения базовых документов:

{
  "query": {
    "range": {
      "@timestamp": {
        "gte": "now-2d"
      }
    }
  }, 
  "size": 0,
  "aggs": {
    "store_aggr": {
      "terms": {
        "field": "Store"
      },
      "aggs": {
        "owner_aggr": {
          "terms": {
            "field": "owner"
          },
          "aggs": {
            "top_hits_aggr": {
              "top_hits": {
                "sort": {
                  "@timestamp": {
                    "order": "desc"
                  }
                }
              }
            }
          }
        },
        "products_aggr": {
          "terms": {
            "field": "products"
          },
          "aggs": {
            "top_hits_aggr": {
              "top_hits": {
                "sort": {
                  "@timestamp": {
                    "order": "desc"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
...