Thanks Honza. (also for the great work you are doing for the python 
community). 

I may have mistated my problem. 

what I am really looking for is to have a bucket, inside a bucket , inside 
a bucket and then metrics 

the following expression does this 

s1.aggs.bucket('xColor', a).bucket('xMake', b).bucket('xCity', 
c).metric('xMyPriceSum', 'sum', field = 'price').metric('xMyPriceAvg', 
'avg', field = 'price')


the problem is that it has to be written manually (at least I haven't fond 
a way to do this automatically). 

I tried the second approach you suggest and it gives me a different result 
: 
- bucket 1, bucket 2 , bucket 3 and their metrics but not one inside 
another one. 

I hope my question makes sense otherwise I am happy to provide a more 
complete example 

Best regards, 
Mike 


On Monday, March 30, 2015 at 11:06:28 PM UTC+2, Honza Král wrote:
>
> Hello,
>
> you can access buckets already created using ['name'] syntax, in your case 
> you can do (instead of the chaining):
>
> s.aggs['xColor']['xMake']['xCity'].metric(...)
> s.aggs['xColor']['xMake']['xCity'].metric(...)
>
> This way you can add aggregations to already created buckets.
>
> Also you can just use an approach where you keep the pointer to the 
> inner-most bucket 9start with s.aggs) and go from there in your case (bunch 
> of nested buckets and then metrics inside):
>
> b = s.aggs
> for bucket in xVarBuckets:
>     b = s.aggs.bucket(bucket['label'], 'terms', field=bucket['field'])
>
> for metric in xVarMetrics:
>     b.metric(metric['label'], metric['agg_function'], 
> field=metric['field'])
>
>
> Hope this helps,
>
> On Mon, Mar 30, 2015 at 10:55 PM, Mike <almu...@googlemail.com 
> <javascript:>> wrote:
>
>> the python elasticsearch , elasticsearch dsl packages are life-saver and 
>> got me converted to ES. 
>>
>> Now I am trying to use elasticsearch dsl package to create pivot tables 
>> in ES  but am having hard time figuring out how to chain the buckets 
>> programmatically. 
>> while chaining the buckets / metrics manually works,  to chain them 
>> programmatically seems impossible 
>>
>> here is an example 
>>
>>
>> from elasticsearch import Elasticsearch
>> from elasticsearch_dsl import Search as dsl_search, A, Q, F 
>> # create client 
>> es = Elasticsearch('localhost:9200')
>> # data : from the definitive guide, slighlty modified 
>> #data from the definitive guide 
>> xData = [
>> {'doc_id' : 1, 'price' : 10000, 'color' : 'red',   'make' : 'honda',  
>> 'sold' : '2014-10-28', 'city': 'ROME',   'insurance': 'y'},
>> {'doc_id' : 2, 'price' : 20000, 'color' : 'red',   'make' : 'honda',  
>> 'sold' : '2014-11-05', 'city': 'ROME',   'insurance': 'n'},
>> {'doc_id' : 3, 'price' : 30000, 'color' : 'green', 'make' : 'ford',   
>> 'sold' : '2014-05-18', 'city': 'Berlin', 'insurance': 'y'},
>> {'doc_id' : 4, 'price' : 15000, 'color' : 'blue',  'make' : 'toyota', 
>> 'sold' : '2014-07-02', 'city': 'Berlin', 'insurance': 'n'},
>> {'doc_id' : 5, 'price' : 12000, 'color' : 'green', 'make' : 'toyota', 
>> 'sold' : '2014-08-19', 'city': 'Berlin', 'insurance': 'n'},
>> {'doc_id' : 6, 'price' : 20000, 'color' : 'red',   'make' : 'honda',  
>> 'sold' : '2014-11-05', 'city': 'Paris',  'insurance': 'n'},
>> {'doc_id' : 7, 'price' : 80000, 'color' : 'red',   'make' : 'bmw',    
>> 'sold' : '2014-01-01', 'city': 'Paris',  'insurance': 'y'},
>> {'doc_id' : 8, 'price' : 25000, 'color' : 'blue',  'make' : 'ford',   
>> 'sold' : '2014-02-12', 'city': 'Paris',  'insurance': 'y'}]
>>
>> #create a mapping 
>> my_mapping = {
>>     'my_example': {
>>         'properties': {
>>         'doc_id': {'type': 'integer'}, 
>>         'price': {'type': 'integer'},
>>          'color': {'type': 'string', 'index': 'not_analyzed'},
>>          'make': {'type': 'string', 'index': 'not_analyzed'},
>>          'city': {'type': 'string', 'index': 'not_analyzed'},
>>          'insurance': {'type': 'string', 'index': 'not_analyzed'},
>>          'sold': {'type': 'date'}
>> }}}
>>
>>
>> #create an index and add the mapping 
>> if es.indices.exists('my_index_test'):
>>     es.indices.delete(index="my_index_test")
>> es.indices.create('my_index_test')
>>
>> # mapping for the document type 
>> if es.indices.exists_type(index = 'my_index_test', doc_type = 
>> 'my_example'):
>>     es.indices.delete_mapping(index='my_index_test',doc_type='my_example')
>>
>> es.indices.put_mapping(index='my_index_test',doc_type='my_example',body=my_mapping)
>>
>> # indexing 
>> for xRow in xData:
>>     es.index(index = 'my_index',
>>              doc_type= 'my_example',
>>              id = xRow['doc_id'],
>>              body = xRow
>>              )
>>
>>
>> ### MANUALLY CHAINING WORKS 
>>
>> a = A('terms', field = 'color')
>> b = A('terms', field = 'make')
>> c = A('terms', field = 'city')
>>
>> s1 = dsl_search(es, index = 'my_index', doc_type= 'my_example')
>> s1.aggs.bucket('xColor', a).bucket('xMake', b).bucket('xCity', c)\
>>                           .metric('xMyPriceSum', 'sum', field = 'price')\
>>                           .metric('xMyPriceAvg', 'avg', field = 'price')
>> resp = s1.execute()
>> #get results 
>> q1 = resp.aggregations
>> q1
>>
>>
>>
>> #### but not PROGRAMMATICALLY 
>> # Programmatically chaining 
>>
>> xVarBuckets = [{'field': 'color', 'label': 'xColor'},
>>                {'field': 'make',  'label': 'xMake'},
>>                {'field': 'city',  'label': 'xCity'}]
>>
>> xVar_Metrics = [{'field': 'price', 'agg_function': 'sum', 'label': 
>> 'xMyPriceSum'},
>>                 {'field': 'price', 'agg_function': 'avg', 'label': 
>> 'xMyPriceAvg'}]
>>
>>
>> s2 = None 
>> s2 = dsl_search(es, index = 'my_index', doc_type = 'my_example')
>>
>> #add buckets    
>> for xBucketVar in xVarBuckets:
>>     xAgg = A('terms', field= xBucketVar['field'])
>>     s2.aggs.bucket(xBucketVar['label'], xAgg)
>> resp2 = s2.execute()
>> #get results 
>> q2 = resp2.aggregations   
>>
>>
>> I guess it has to do with the fact that the newly create bucket is 
>> overwritten by the new bucket, but how can append the new bucket to the 
>> previous one 
>>
>>
>> Any help appreciated 
>>
>>
>>
>>
>>
>>
>>  -- 
>> You received this message because you are subscribed to the Google Groups 
>> "elasticsearch" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to elasticsearc...@googlegroups.com <javascript:>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/elasticsearch/fa471fcf-9ed7-49f9-9e34-4cbefb90abb8%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/elasticsearch/fa471fcf-9ed7-49f9-9e34-4cbefb90abb8%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>
>
> -- 
> Honza Král
> Python Engineer
> honza...@elastic.co <javascript:>
>  

-- 
You received this message because you are subscribed to the Google Groups 
"elasticsearch" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elasticsearch+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elasticsearch/b59caf91-a3b8-4ee4-8437-d56607ab2f33%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to