2014-12-20 3 views
1

У меня есть документы в elasticsearch, которые что-то вроде:Скопления группа по параметрам в Elasticsearch

{ "numberOfBedrooms": 2, "price": 1500, "type": flat }

Я хотел бы получить статистику, как то, что средняя цена по комнате, что средняя цена по типу а также комбинации, такие как средняя цена за количество комбинаций номеров. Как я могу использовать скопления в упругом поиске для достижения этого?

Спасибо!

+0

я, вероятно, может сделать это вручную, но мне было интересно, если есть более элегантное решение. –

ответ

1

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

  • первый уровень - использовать term aggregation пошагово спальню размеров
  • второй уровень - рассчитать average цену за текущий размер спальни

Например, этот запрос:

curl -XGET 'http://localhost:9200/myindex/houses/_search?pretty&search_type=count' -d '{ 
    "query" : { 
     "match_all" : { } 
    }, 
    "aggs": { 
    "bed_agg": { 
     "terms": {"field": "numberOfBedrooms"},   
     "aggs" : { 
      "avg_price" : { "avg" : { "field" : "price" } } 
     } 
     } 
    } 
    } 
}' 

Должен вернуть что-то вроде:

"aggregations" : { 
    "bed_agg" : { 
     "doc_count_error_upper_bound" : 0, 
     "sum_other_doc_count" : 0, 
     "buckets" : [ { 
    "key" : 2, 
    "doc_count" : 2, 
    "avg_price" : { 
     "value" : 1750.0 
    } 
     }, { 
    "key" : 3, 
    "doc_count" : 1, 
    "avg_price" : { 
     "value" : 2100.0 
    } 
     } ] 
    } 

Для агрегации над другой уровень (например, добавление в тип здания), вы можете либо создать новый уровень агрегирования - например, гнездится «агрегат типа» внутри агрегации «спален».

curl -XGET 'http://localhost:9200/myindex/houses/_search?pretty&search_type=count' -d '{ 
    "query" : { 
     "match_all" : { } 
    }, 
    "aggs": { 
    "bed_agg": { 
     "terms": {"field": "numberOfBedrooms"}, 
     "aggs": { 
     "type_agg": { 
     "terms": {"field": "type"},   
     "aggs" : { 
      "avg_price" : { "avg" : { "field" : "price" } } 
     } 
     } 
     } 
     } 
    } 
    } 
}' 

В качестве альтернативы вы можете создать одно ведро с обоих полей в нем с помощью сценария:

"aggs": { 
     "bed_type_agg": { 
      "terms": { "script" : "doc[\"numberOfBedrooms\"].value+doc[\"type\"].value"},  
       "aggs" : { 
       "avg_price" : { "avg" : { "field" : "price" } } 
      } 
      } 
     } 
+0

Удивительно! Большое спасибо. Еще один вопрос. Если я хочу иметь ведра для 1,2,3,4 спальни и 5+ спален. Есть ли способ повлиять на это? –

+1

Я бы использовал [диапазон агрегации] (http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-range-aggregation.html) - ваши первые 4 агрегации будут небольшими и последний будет 5 и выше. –

+0

Как я могу использовать диапазоны в сочетании с типом? –

Смежные вопросы