that's what happens when I try to be quick and don't verify my code - there is an error in my example:
b = s.aggs for bucket in xVarBuckets: # this needs to be b = b.bucket instead of what I had previously b = b.bucket(bucket['label'], 'terms', field=bucket['field']) for metric in xVarMetrics: b.metric(metric['label'], metric['agg_function'], field=metric['field']) On Mon, Mar 30, 2015 at 11:21 PM, Mike <almug...@googlemail.com> wrote: > 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> 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. >>> 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 >> > -- > 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 > <https://groups.google.com/d/msgid/elasticsearch/b59caf91-a3b8-4ee4-8437-d56607ab2f33%40googlegroups.com?utm_medium=email&utm_source=footer> > . > > For more options, visit https://groups.google.com/d/optout. > -- Honza Král Python Engineer honza.k...@elastic.co -- 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/CAC4Vrty1Ox_8V-uPLFJCX0koEpGMRM0QK6gm5kiDHSkQAPcPzQ%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.