Упругие получить документы с минимальным / максимальным и последним значением - PullRequest
0 голосов
/ 13 февраля 2019

Допустим, у меня есть индекс эластичности со следующими данными:

{"var1": 14, "time": "2019-02-12T13:01:00.000Z"}
{"var2": 1423, "time": "2019-02-12T13:01:02.000Z"}
{"var3": 114, "time": "2019-02-12T13:01:03.000Z"}
{"var2": 214, "time": "2019-02-12T13:01:04.000Z"}
{"var3": 414, "time": "2019-02-12T13:01:05.000Z"}
{"var1": 124, "time": "2019-02-12T13:01:06.000Z"}
{"var2": 914, "time": "2019-02-12T13:01:07.000Z"}
{"var3": 8614, "time": "2019-02-12T13:01:06.000Z"}
{"var2": 74, "time": "2019-02-12T13:01:07.000Z"}
{"var3": 174, "time": "2019-02-12T13:01:08.000Z"}
{"var4": 144, "time": "2019-02-12T13:01:09.000Z"}
{"var4": 714, "time": "2019-02-12T13:01:10.000Z"}
{"var4": 813, "time": "2019-02-12T13:01:11.000Z"}
{"var2": 65, "time": "2019-02-12T13:01:12.000Z"}
{"var1": 321, "time": "2019-02-12T13:01:13.000Z"}

Я хотел бы написать ОДИН запрос, который может извлечь минимум переменной, максимум переменной и последние n значенийпеременной в данном интервале времени.Важно, чтобы мне был нужен фактический документ с минимальным или максимальным или последним значением (поэтому я использую top_hits для минимального и максимального значений вместо минимального или максимального агрегирования).

ИтакНа данный момент у меня есть этот запрос:

{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "time": {
              "gte": "2019-02-12T13:01:00.000Z",
              "lt": "2019-02-12T13:01:15.000Z"
            }
          }
        }
      ]
    }
  },
  "size": 0,
  "aggs": {
    "max_var1": {
      "top_hits": {
        "size": 1,
        "sort": [{
          "var1": {"order": "desc"}
        }]
      }
    },
    "min_var2": {
      "top_hits": {
        "size": 1,
        "sort": [{
          "var2": {"order": "asc"}
        }]
      }
    },
    "last_var4": {
      "top_hits": {
        "size": 3,
        "sort": [{
          "time": {"order": "desc"}
        }],
        "_source": ["var4"]
      }
    }
  }
}

Запрос корректно возвращает минимальное и максимальное значения, но не возвращает правильное последнее значение 3 для var4, поскольку он берет последнее из всех документовв данный промежуток времени, а не документы, которые var4 в нем.Таким образом, вопрос заключается в том, как получить последние n документов для данной переменной внутри этого запроса.

Я знаю, что мог бы использовать API множественного поиска для выполнения нескольких запросов одновременно, но я хотел бы знать, если этовозможно иметь его в одном запросе.

Спасибо.

1 Ответ

0 голосов
/ 13 февраля 2019

Отфильтрованная агрегация на помощь.Просто убедитесь, что объединение last_var4 ограничено только теми документами, которые действительно имеют поле var4.

{
    ...
    "last_var4": {
      "filter": {
        "bool": {
          "filter": {
            "exists": {
              "field": "var4"
            }
          }
        }
      },
      "aggs": {
        "last_var4": {
          "top_hits": {
            "size": 3,
            "sort": [
              {
                "time": {
                  "order": "desc"
                }
              }
            ],
            "_source": [
              "var4"
            ]
          }
        }
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...