Агрегирование Elasticsearch top_hits против последнего документа
Я пытаюсь получить список пользователей, которые в качестве своей последней активности "подключаются". В идеале я хочу, чтобы это было в виде метрики, или таблицы данных в Кибане, показывающей количество пользователей, которые подключились последними, и список их соответственно. Однако я отказался от возможности делать это в Кибане. Я могу получить нечто подобное непосредственно от Elasticsearch, используя агрегацию терминов, за которой следует top_hits, как показано ниже. Но проблема в том, что, хотя я сортирую top_hits по @timestamp, полученный документ НЕ самый последний.
{
"size" : 0,
"sort": { "@timestamp": {"order": "desc"} },
"aggs" : {
"by_user" : {
"terms" : {
"field" : "fields.username.keyword",
"size" : 1
},
"aggs": {
"last_message": {
"top_hits": {
"sort": [
{
"@timestamp": {
"order": "desc"
}
}
],
"_source": {
"includes": ["fields.username.keyword", "@timestamp", "status"]
},
"size": 1
}
}
}
}
}
}
- Есть ли способ сделать это прямо в Кибане?
- Как я могу убедиться, что top_hits дает мне самые последние результаты, а не "самые актуальные"?
1 ответ
Я думаю, что вы хотите, чтобы коллапс поля, который быстрее, чем агрегация.
Нечто подобное должно работать для вашего варианта использования:
GET my-index/_search {
"query": {
"match_all": { }
},
"collapse" : {
"field" : "fields.username.keyword"
},
"sort": [ {
"@timestamp": {
"order": "desc"
}
} ] }
Возможно, я что-то упускаю, но я не думаю, что Кибана поддерживает это в данный момент.