Агрегация корзины для объекта вместо ключевого слова

У меня есть документы в моем индексе, в которых есть вложенный объект locations.

"locations": [
    {
        "name": "California",
        "coordinates": {
            "lat": 36.78,
            "long": -119.42
        }
    }, ...
]

Я написал агрегацию терминов для создания корзин для названий местоположений, которые появляются в наборе данных:

"aggs": {
    "global": {
        "nested": {
            "path": "locations"
        },
        "aggs":{
            "locations": {
                "terms": { 
                    "field": "locations.name.keyword"
                }
            }
        }
    }
}

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

Есть ли что-то вроде агрегации терминов, которая работает с объектом, а не просто с ключевым словом?

Или (поскольку координаты всегда одинаковы для одного и того же местоположения) можно ли вернуть координаты первого местоположения для каждого ведра вместе со счетчиком?


person Carasel    schedule 01.05.2018    source источник
comment
Ваш массив locations отображается как поле nested?   -  person Val    schedule 01.05.2018
comment
@Val это не сейчас, но легко может быть   -  person Carasel    schedule 01.05.2018
comment
Ну, вы должны, иначе ваши ведра будут неправильными.   -  person Val    schedule 01.05.2018
comment
@Val Каждое местоположение появляется максимум один раз в документе, поэтому я думаю, что результаты должны быть в порядке, но вы правы, оно должно отображаться как вложенное.   -  person Carasel    schedule 01.05.2018
comment
Если это массив, то значит у вас может быть несколько локаций (и в этом случае она должна быть вложенной), иначе нет смысла иметь массив   -  person Val    schedule 01.05.2018
comment
@Val Я обновил вопрос, чтобы показать вложенную агрегацию, которую я использую.   -  person Carasel    schedule 02.05.2018


Ответы (1)


Хорошо, отличное начало. Теперь, чтобы получить координаты первого местоположения для каждого сегмента вместе со счетчиком, вы можете сделать это, добавив субагрегацию top_hits следующим образом:

"aggs": {
    "global": {
        "nested": {
            "path": "locations"
        },
        "aggs":{
            "locations": {
                "terms": { 
                    "field": "locations.name.keyword"
                },
                "aggs": {
                   "location": {
                      "top_hits": {
                         "size": 1,
                         "_source": ["locations.coordinates"]
                      }
                   }
                }
            }
        }
    }
}
person Val    schedule 02.05.2018