Агрегация Elasticsearch не работает с полями вложенного типа

Я не могу сделать фильтр агрегации elasticsearch + для работы с вложенными полями. Схема данных (соответствующая часть) выглядит следующим образом:

"mappings": {
 "rb": {
 "properties": {
 "project": {
 "type": "nested",
 "properties": {
 "age": {
 "type": "long"
 },
 "name": {
 "type": "string",
 "index": "not_analyzed"
 }
 }
 } 
 }
 }
}

По существу объект "rb" содержит вложенное поле "проект", которое содержит еще два поля - "имя" и "возраст". Запрос Я запускаю:

"aggs": {
 "root": {
 "aggs": {
 "group": {
 "aggs": {
 "filtered": {
 "aggs": {
 "order": {
 "percentiles": {
 "field": "project.age",
 "percents": ["50"]
 }
 }
 },
 "filter": {
 "range": {
 "last_updated": {
 "gte": "2015-01-01",
 "lt": "2015-07-01"
 }
 }
 }
 }
 },
 "terms": {
 "field": "project.name",
 "min_doc_count": 5,
 "order": {
 "filtered>order.50": "asc"
 },
 "shard_size": 10,
 "size": 10
 }
 }
 },
 "nested": {
 "path": "project"
 }
 }
}

В этом запросе предполагается создать 10 лучших проектов (поле project.name), которые соответствуют фильтру даты, отсортированному по их среднему возрасту, игнорируя проекты с менее чем 5 упоминаниями в базе данных. Медиана должна рассчитываться только для проектов, соответствующих фильтру (диапазон дат).

Несмотря на наличие более чем сотни тысяч объектов в базе данных, этот запрос создает пустой список. Нет ошибок, только пустой ответ. Я пробовал это как на ES 1.6, так и на ES 2.0-бета.

1 ответ

Я немного упорядочил ваш запрос на агрегирование, и я могу получить некоторые результаты. Основной момент - тип, так как вы агрегируете вокруг типа nested, я вынул агрегацию filter в поле last_updated и переместил ее вверх по иерархии в качестве первой агрегации. Затем происходит агрегация nested в поле project и, наконец, terms и percentile.

Кажется, что все получилось очень хорошо. Попробуйте.

{
 "size": 0,
 "aggs": {
 "filtered": {
 "filter": {
 "range": {
 "last_updated": {
 "gte": "2015-01-01",
 "lt": "2015-07-01"
 }
 }
 },
 "aggs": {
 "root": {
 "nested": {
 "path": "project"
 },
 "aggs": {
 "group": {
 "terms": {
 "field": "project.name",
 "min_doc_count": 5,
 "shard_size": 10,
 "order": {
 "order.50": "asc"
 },
 "size": 10
 },
 "aggs": {
 "order": {
 "percentiles": {
 "field": "project.age",
 "percents": [
 "50"
 ]
 }
 }
 }
 }
 }
 }
 }
 }
 }
}

licensed under cc by-sa 3.0 with attribution.