Последний документ для каждой категории? - PullRequest
0 голосов
/ 29 мая 2018

У меня есть документы в ElasticSearch со структурой, подобной этой:

{
    "created_on": [timestamp],
    "source_id": [a string ID for the source],
    "type": [a term],
    ... other fields
}

Очевидно, я могу выбрать эти документы в Kibana, показать их в «обнаружить», создать (например) круговую диаграмму, показывающую термины типаи т. д.

Тем не менее, данное мне требование состоит в том, чтобы использовать только самый последний документ для каждого source_id.

.документы в один контейнер на source_id, затем для каждого контейнера уменьшите, чтобы удалить все документы, кроме самого последнего с created_on.

Однако, когда я использовал агрегатор terms, результат содержал только числоне целые документы, которые я мог бы обработать дальше:

"aggs" : {
    "sources" : {
        "terms" : { "field" : "source_id" }
    }
}

Как мне сделать этот запрос?

1 Ответ

0 голосов
/ 29 мая 2018

Если я правильно понял, что вы пытаетесь сделать, один из способов сделать это - использовать top_hits агрегации на условиях агрегация, которая полезна для группировки результатов по любым критериям, которые вы хотите, для каждого сегмента его родительской агрегации.Следуя вашему примеру, вы можете сделать что-то вроде

{
  "aggs": {
    "by_source_id": {
      "terms": {
        "field": "source_id"
      },
      "aggs": {
        "most_recent": {
          "top_hits": {
            "sort": {
              "created_on": "desc"
            },
            "size": 1
          }
        }
      }
    }
  }
}

Таким образом, вы группируете по source_id, который создаст сегмент для каждого из них, а затем вы получите лучшие попадания для каждого сегмента в соответствии с сортировкой.критерии, установленные в аггре top_hits, в данном случае create_on .

Результат, который вы должны ожидать, будет примерно таким:

....

"buckets": [
        {
          "key": 3,
          "doc_count": 2,
          "most_recent": {
            "hits": {
              "total": 2,
              "max_score": null,
              "hits": [
                {
                  "_index": "so_sample02",
                  "_type": "items",
                  "_id": "2",
                  "_score": null,
                  "_source": {
                    "created_on": "2018-05-01 07:00:01",
                    "source_id": 3,
                    "type": "a"
                  },
                  "sort": [
                    1525158001000
                  ]
                }
              ]
            }
          }
        },
        {
          "key": 5,
          "doc_count": 2, .... and so on

Обратите внимание, как внутри корзины, most_recent , мы получаем соответствующие хиты.Кроме того, вы можете ограничить количество возвращаемых полей, указав в top_hits agg "includes": ["fieldA", "fieldB" .. and so on]

Надеюсь, что это поможет.

...