Agregaciones en Elasticsearch -- None camp Relacionados El problema

Aggregations in Elasticsearch


1
vote

problema

Español

Tengo una consulta de la búsqueda de elastics que devuelve un montón de objetos que se ve así:

  {   "took": 1,   "timed_out": false,   "_shards": {     "total": 5,     "successful": 5,     "failed": 0   },   "hits": {     "total": 2,     "max_score": 1,     "hits": [       {         "_index": "searchdb",         "_type": "profile",         "_id": "1825",         "_score": 1,         "_source": {           "id": 1825,           "market": "Chicago",           "geo_location": {             "lat": 41.1234,             "lon": -87.5678           },           "hourly_values": [             {               "datetime": "1997-07-16T19:00:00.00+00:00",               "seconds": 1200             },             {               "datetime": "1997-07-16T19:20:00.00+00:00",               "seconds": 1200             },             {               "datetime": "1997-07-16T19:20:00.00+00:00",               "seconds": 1200             }           ]         }       },       {         "_index": "searchdb",         "_type": "profile",         "_id": "1808",         "_score": 1,         "_source": {           "id": 1808,           "market": "Chicago",           "geo_location": {             "lat": 41.1234,             "lon": -87.5678           },           "hourly_values": [             {               "datetime": "1997-07-16T19:00:00.00+00:00",               "seconds": 900             },             {               "datetime": "1997-07-16T19:20:00.00+00:00",               "seconds": 1200             },             {               "datetime": "1997-07-16T19:20:00.00+00:00",               "seconds": 800             }           ]         }       }     ]   }   

Quiero devolver el mismo resultado, pero con una agregación de los campos de segundos para cada objeto devuelto.

Mi consulta en este momento parece esto:

  {     "query": {         "filtered":{             "filter":{                 "geo_distance":{                     "distance":"1km",                     "geo_location":{                         "lat":"41.1234",                         "lon":"-87.5678"                     }                 }             }         }     },     "aggregations": {         "seconds_sum": {            "sum": {               "field": "hourly_values.seconds"             }         }     } }    

Lo anterior solo agrega todos los segundos para todos los objetos. No puedo averiguar cómo agregar solo los segundos para cada objeto, y devuelve ese agregado con el objeto, para que pueda terminar con algo como este:

  {   "took": 1,   "timed_out": false,   "_shards": {     "total": 5,     "successful": 5,     "failed": 0   },   "hits": {     "total": 2,     "max_score": 1,     "hits": [       {         "_index": "searchdb",         "_type": "profile",         "_id": "1825",         "_score": 1,         "_source": {           "id": 1825,           "market": "Chicago",           "geo_location": {             "lat": 41.1234,             "lon": -87.5678           },           "seconds":3600         }       },       {         "_index": "searchdb",         "_type": "profile",         "_id": "1808",         "_score": 1,         "_source": {           "id": 1808,           "market": "Chicago",           "geo_location": {             "lat": 41.1234,             "lon": -87.5678           },           "seconds":2900         }       }     ]   }   

o algo así ...

Original en ingles

I have an elasticsearch query that returns a bunch of objects that looks like this:

{   "took": 1,   "timed_out": false,   "_shards": {     "total": 5,     "successful": 5,     "failed": 0   },   "hits": {     "total": 2,     "max_score": 1,     "hits": [       {         "_index": "searchdb",         "_type": "profile",         "_id": "1825",         "_score": 1,         "_source": {           "id": 1825,           "market": "Chicago",           "geo_location": {             "lat": 41.1234,             "lon": -87.5678           },           "hourly_values": [             {               "datetime": "1997-07-16T19:00:00.00+00:00",               "seconds": 1200             },             {               "datetime": "1997-07-16T19:20:00.00+00:00",               "seconds": 1200             },             {               "datetime": "1997-07-16T19:20:00.00+00:00",               "seconds": 1200             }           ]         }       },       {         "_index": "searchdb",         "_type": "profile",         "_id": "1808",         "_score": 1,         "_source": {           "id": 1808,           "market": "Chicago",           "geo_location": {             "lat": 41.1234,             "lon": -87.5678           },           "hourly_values": [             {               "datetime": "1997-07-16T19:00:00.00+00:00",               "seconds": 900             },             {               "datetime": "1997-07-16T19:20:00.00+00:00",               "seconds": 1200             },             {               "datetime": "1997-07-16T19:20:00.00+00:00",               "seconds": 800             }           ]         }       }     ]   } 

I want to return the same result, but with an aggregation of the seconds fields for each object returned.

My query right now looks like this:

{     "query": {         "filtered":{             "filter":{                 "geo_distance":{                     "distance":"1km",                     "geo_location":{                         "lat":"41.1234",                         "lon":"-87.5678"                     }                 }             }         }     },     "aggregations": {         "seconds_sum": {            "sum": {               "field": "hourly_values.seconds"             }         }     } }  

The above just aggregates all the seconds for all objects together. I can't figure out how to aggregate just the seconds for each object, and return that aggregate with the object, so I can end up with something like this:

{   "took": 1,   "timed_out": false,   "_shards": {     "total": 5,     "successful": 5,     "failed": 0   },   "hits": {     "total": 2,     "max_score": 1,     "hits": [       {         "_index": "searchdb",         "_type": "profile",         "_id": "1825",         "_score": 1,         "_source": {           "id": 1825,           "market": "Chicago",           "geo_location": {             "lat": 41.1234,             "lon": -87.5678           },           "seconds":3600         }       },       {         "_index": "searchdb",         "_type": "profile",         "_id": "1808",         "_score": 1,         "_source": {           "id": 1808,           "market": "Chicago",           "geo_location": {             "lat": 41.1234,             "lon": -87.5678           },           "seconds":2900         }       }     ]   } 

Or something like that ...

  
 
 

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Eso es bastante fácil. En primer lugar, deberá guardar su hourly_values como objetos anidados .

Tiene que agregarle un valor único usando Términos , en este caso, probablemente va a ser ID, solo entonces tiene que suma . Para resumir las cosas:

Ese sería su asignación

  PUT /test {   "mappings": {     "data": {       "properties": {         "id": {           "type": "integer"         },         "geo_location": {           "type": "geo_point"         },         "hourly_values": {           "type": "nested",           "properties": {             "datetime": {               "type": "date"             },             "seconds": {               "type": "integer"             }           }         }       }     }   } }   

Datos de prueba

  PUT /test/data/1 {   "id": 1825,   "market": "Chicago",   "geo_location": {     "lat": 41.1234,     "lon": -87.5678   },   "hourly_values": [     {       "datetime": "1997-07-16T19:00:00.00+00:00",       "seconds": 1200     },     {       "datetime": "1997-07-16T19:20:00.00+00:00",       "seconds": 1200     },     {       "datetime": "1997-07-16T19:20:00.00+00:00",       "seconds": 1200     }   ] }  PUT /test/data/2 {   "id": 1808,   "market": "Chicago",   "geo_location": {     "lat": 41.1234,     "lon": -87.5678   },   "hourly_values": [     {       "datetime": "1997-07-16T19:00:00.00+00:00",       "seconds": 900     },     {       "datetime": "1997-07-16T19:20:00.00+00:00",       "seconds": 1200     },     {       "datetime": "1997-07-16T19:20:00.00+00:00",       "seconds": 800     }   ] }   

y su agregación

  POST /test/_search {   "size": 0,   "aggs": {     "Ids": {       "terms": {         "field": "id",         "size": 0       },       "aggs": {         "Nesting": {           "nested": {             "path": "hourly_values"           },           "aggs": {             "SumSeconds": {               "sum": {                 "field": "hourly_values.seconds"               }             }           }         }       }     }   } }   

Esto traerá este resultado, que es lo que está buscando

  {   "took": 7,   "timed_out": false,   "_shards": {     "total": 5,     "successful": 5,     "failed": 0   },   "hits": {     "total": 2,     "max_score": 0,     "hits": []   },   "aggregations": {     "Ids": {       "doc_count_error_upper_bound": 0,       "sum_other_doc_count": 0,       "buckets": [         {           "key": 1808,           "doc_count": 1,           "Nesting": {             "doc_count": 3,             "SumSeconds": {               "value": 2900             }           }         },         {           "key": 1825,           "doc_count": 1,           "Nesting": {             "doc_count": 3,             "SumSeconds": {               "value": 3600             }           }         }       ]     }   } }   

Si desea devolver los documentos junto a ellos también, podría usar la agregación de Top Hit junto con suma anidada:

  POST /test/_search {   "size": 0,   "aggs": {     "Ids": {       "terms": {         "field": "id",         "size": 0       },       "aggs": {         "Objects": {           "top_hits": {             "_source": ["id", "market", "geo_location"],             "size": 1           }         },         "Nesting": {           "nested": {             "path": "hourly_values"           },           "aggs": {             "SumSeconds": {               "sum": {                 "field": "hourly_values.seconds"               }             }           }         }       }     }   } }   

y esto le devolvería:

  [[NSNotificationCenter defaultCenter] addObserver:self                                          selector:@selector(stopThumbnailWobble:)                                              name:kTouchPhaseBeganCustomNotification                                            object:nil];  ((CustomUIWindow *)self.window).enableTouchNotification = YES;    0  
 

That's quite easy. First of all, you will need to store your hourly_values as nested objects.

You have to aggregate by unique value using terms, in this case it's probably going to be id, only then you have to sum. To sum things up:

That would be your mapping

PUT /test {   "mappings": {     "data": {       "properties": {         "id": {           "type": "integer"         },         "geo_location": {           "type": "geo_point"         },         "hourly_values": {           "type": "nested",           "properties": {             "datetime": {               "type": "date"             },             "seconds": {               "type": "integer"             }           }         }       }     }   } } 

Test data

PUT /test/data/1 {   "id": 1825,   "market": "Chicago",   "geo_location": {     "lat": 41.1234,     "lon": -87.5678   },   "hourly_values": [     {       "datetime": "1997-07-16T19:00:00.00+00:00",       "seconds": 1200     },     {       "datetime": "1997-07-16T19:20:00.00+00:00",       "seconds": 1200     },     {       "datetime": "1997-07-16T19:20:00.00+00:00",       "seconds": 1200     }   ] }  PUT /test/data/2 {   "id": 1808,   "market": "Chicago",   "geo_location": {     "lat": 41.1234,     "lon": -87.5678   },   "hourly_values": [     {       "datetime": "1997-07-16T19:00:00.00+00:00",       "seconds": 900     },     {       "datetime": "1997-07-16T19:20:00.00+00:00",       "seconds": 1200     },     {       "datetime": "1997-07-16T19:20:00.00+00:00",       "seconds": 800     }   ] } 

And your aggregation

POST /test/_search {   "size": 0,   "aggs": {     "Ids": {       "terms": {         "field": "id",         "size": 0       },       "aggs": {         "Nesting": {           "nested": {             "path": "hourly_values"           },           "aggs": {             "SumSeconds": {               "sum": {                 "field": "hourly_values.seconds"               }             }           }         }       }     }   } } 

This will bring back this result, which is what you're looking for

{   "took": 7,   "timed_out": false,   "_shards": {     "total": 5,     "successful": 5,     "failed": 0   },   "hits": {     "total": 2,     "max_score": 0,     "hits": []   },   "aggregations": {     "Ids": {       "doc_count_error_upper_bound": 0,       "sum_other_doc_count": 0,       "buckets": [         {           "key": 1808,           "doc_count": 1,           "Nesting": {             "doc_count": 3,             "SumSeconds": {               "value": 2900             }           }         },         {           "key": 1825,           "doc_count": 1,           "Nesting": {             "doc_count": 3,             "SumSeconds": {               "value": 3600             }           }         }       ]     }   } } 

If you'd like to return documents next to them too, you could use Top Hits aggregation together with Nested Sum:

POST /test/_search {   "size": 0,   "aggs": {     "Ids": {       "terms": {         "field": "id",         "size": 0       },       "aggs": {         "Objects": {           "top_hits": {             "_source": ["id", "market", "geo_location"],             "size": 1           }         },         "Nesting": {           "nested": {             "path": "hourly_values"           },           "aggs": {             "SumSeconds": {               "sum": {                 "field": "hourly_values.seconds"               }             }           }         }       }     }   } } 

And this would bring back it:

{   "took": 1,   "timed_out": false,   "_shards": {     "total": 5,     "successful": 5,     "failed": 0   },   "hits": {     "total": 2,     "max_score": 0,     "hits": []   },   "aggregations": {     "Ids": {       "doc_count_error_upper_bound": 0,       "sum_other_doc_count": 0,       "buckets": [         {           "key": 1808,           "doc_count": 1,           "Nesting": {             "doc_count": 3,             "SumSeconds": {               "value": 2900             }           },           "Objects": {             "hits": {               "total": 1,               "max_score": 1,               "hits": [                 {                   "_index": "test",                   "_type": "data",                   "_id": "2",                   "_score": 1,                   "_source": {                     "market": "Chicago",                     "geo_location": {                       "lon": -87.5678,                       "lat": 41.1234                     },                     "id": 1808                   }                 }               ]             }           }         },         {           "key": 1825,           "doc_count": 1,           "Nesting": {             "doc_count": 3,             "SumSeconds": {               "value": 3600             }           },           "Objects": {             "hits": {               "total": 1,               "max_score": 1,               "hits": [                 {                   "_index": "test",                   "_type": "data",                   "_id": "1",                   "_score": 1,                   "_source": {                     "market": "Chicago",                     "geo_location": {                       "lon": -87.5678,                       "lat": 41.1234                     },                     "id": 1825                   }                 }               ]             }           }         }       ]     }   } } 
 
 

Relacionados problema

2  Servicestack.Dataannotations ¿Definiciones de atributos faltantes?  ( Servicestack dataannotations missing attributes definitions ) 
Estoy tratando de usar los decoradores de atributos de ServicStack desde ServicesEstack.Dataannotations, pero cuando veo el espacio de nombres de Servicestack...

2  ¿Cómo representar una plantilla por nombre?  ( How to render a template by name ) 
Estoy tratando de obtener mi cabeza alrededor de SERVICESTACK AUTO-AUTHOTHED y la nueva API. Agregar dos vistas del mismo nombre en carpetas separadas res...

28  ¿Cómo borrar el índice de elasticsearch?  ( How to erase elasticsearch index ) 
My unidad / prueba de integración incluye pruebas para la funcionalidad de búsqueda. Mi idea es tener un índice de búsqueda vacío antes de cada prueba. Po...

88  ¿Añadir la versión de Google Play Services al manifiesto de su aplicación?  ( Adding google play services version to your apps manifest ) 
Estoy siguiendo este tutorial: https://developers.google.com / Mapas / Documentación / Android / Inicio # Descripción general sobre cómo agregar Google Maps...

4  Ubicación fusionada a veces se detiene  ( Fused location sometimes stops ) 
He estado trabajando en una aplicación que rastrea la posición del usuario. Para esto, he usado el módulo de ubicación de los servicios de Google Play (a.k.a....

0  Marcos rojos sobre los servicios de Google Play Lib en Eclipse  ( Red mark over google play services lib in eclipse ) 
He seguido a las guías de Sereval, copié la carpeta de la biblioteca en mi área de trabajo y luego lo importó en Eclipse, lo he limpiado una docena de veces y...

1  Mapas de Android V2 ofrecen servicio de juego  ( Android maps v2 offer play service ) 
Tengo el éxito de los mapas de Android para trabajar API V2, pero luego intenté probar si no tengo servicios de Google Play, se ofrecerá la aplicación para in...

0  El uso de la función de automóviles de MADRICESTACK causa la autogeneración del error fallido WSDL  ( Using servicestack autoquery feature causes autogeneration of wsdl failed error ) 
Cuando habilito la función de autoquirería en el error de MADRICESTACK, obtengo un error [Route("/Data/ApplicationLog")] public class AutoQueryApplicationLog...

2  Aplicación de Android Daily ** Desinstala **, ¿cómo se calcula a partir de la consola de desarrollador?  ( Android app daily uninstalls how is it calculated from developer console ) 
¿Alguna idea de cómo Android Developer Console Figuras desinstalaciones diarias? Mi corazonada - a través de la falla de ping de GCM El servicio de Googl...

0  Cómo combinar eficientemente miles de miles de subcadena en una cadena usando elasticsearch [cerrado]  ( How to efficiently match hundred thousands of substring in one string using elas ) 
cerrado . Esta pregunta debe ser más enfocado . Actualmente no está aceptando respuestas. ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos