How can I add a new key called \'agency_name\' in my output bucket.
I am running an aggregation code as shown below
{
\"aggs\": {
\"name\": {
What I do is use something like the following query:
"aggs" : {
"products" : {
"filter" : { "term": { "item.category": "children" }},
"aggs" : {
"count" : {
"terms" : {
"script": "doc['item.id'].value + ':' + doc['item.name'].value"
}
}
}
}
}
Which returns something like this:
...
"aggregations" : {
"products" : {
"doc_count" : 1050,
"count" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "x2_90QBj9k:Baby Oil",
"doc_count" : 45
},
...
]
...
And then I can use a string operation on bucket[i]["key"], for each i in a loop, to extract the relevant field.
This is old post, however, I ran into same issue and I followed what is given at https://www.elastic.co/guide/en/elasticsearch/reference/current/agg-metadata.html. Add metadata details and it is return as part of the result above bucket. Hope it will help someone in future.
ES has no way of knowing agency_name
and agency_code
map one-to-one. Therefore I would recommend a number of possible strategies.
agency_name
and use the term agg over that field. I would be surprised if you actually need to do tokenization of the agency_name
.As Aditya Patel mentioned above, parent child relationships may help out as well but I believe you will still have to use one of the above strategies to resolve the id->name mapping.
I think you would need to add another "aggs" to it. But it would not be in the format in which you want but as another field in the output , reason being currently you are aggregating based on "agency_code" and the doc_count shows how many times the particular agency code occurs. Now when you want to aggregate it based on "agency_name" the field might in different documents than "agency_code" and in different numbers as well , if they always exist in pair than this parent-child indexing might be of some help.
https://www.elastic.co/guide/en/elasticsearch/guide/current/indexing-parent-child.html
You can use the top hits aggregation like in the link below. The format will be slightly different since creating the extra aggregation will embed the agency name under another 'hits' key.
Adding additional fields to ElasticSearch terms aggregation
{
"aggs": {
"name": {
"terms": {
"field": "agency_code"
},
"aggs": {
"agency_names" : {
"top_hits": {
size: 1,
_source: {
include: ['agency_name']
}
}
}
}
}
}
}