primeros - ElasticSearch-Cómo mostrar un nombre de campo adicional en la consulta de agregación
elasticsearch tutorial (4)
¿Cómo puedo agregar una nueva clave llamada ''agency_name'' en mi cubo de salida?
Estoy ejecutando un código de agregación como se muestra a continuación
{
"aggs": {
"name": {
"terms": {
"field": "agency_code"
}
}
}
}
Voy a recibir la salida como
"aggregations": {
"name": {
"doc_count_error_upper_bound": 130,
"sum_other_doc_count": 39921,
"buckets": [
{
"key": "1000",
"doc_count": 105163
},
{
"key": "2100",
"doc_count": 43006
}
]
}
}
Mientras se muestra, necesito mostrar el nombre de la agencia, el código y doc_count
¿Cómo puedo modificar la consulta de agregación para poder obtener el siguiente formato? Soy nuevo en ElasticSearch, no estoy seguro de cómo solucionar este problema
"aggregations": {
"name": {
"doc_count_error_upper_bound": 130,
"sum_other_doc_count": 39921,
"buckets": [
{
"key": "1000",
"doc_count": 105163,
"agency_name": ''Agent 1''
},
{
"key": "2100",
"doc_count": 43006,
"agency_name": ''Agent 2''
}
]
}
}
Datos de muestra en ElasticSearch (los campos son analizados)
{
"_index": "feeds",
"_type": "news",
"_id": "22005",
"_version": 1,
"_score": 1,
"_source": {
"id": 22005,
"name": "Test News",
"agency_name": "Agent 1",
"agency_code": "1000",
}
}
Creo que necesitarías agregarle otros "aggs". Pero no estaría en el formato en el que desea, pero como otro campo en la salida, la razón es que actualmente está agregando según el "código de agencia" y la cuenta_doc muestra cuántas veces se produce el código de la agencia en particular. Ahora, cuando desee agregarlo en función de "nombre_agencia", el campo podría ser de diferentes documentos que "código de agencia" y también en números diferentes, si siempre existen en par que esta indexación padre-hijo podría ser de alguna ayuda.
https://www.elastic.co/guide/en/elasticsearch/guide/current/indexing-parent-child.html
ES no tiene forma de saber el nombre de la agency_name
y el mapa de la agency_code
uno a uno. Por lo tanto, recomendaría una serie de posibles estrategias.
- No analice
agency_name
y use el término agg en ese campo. Me sorprendería si realmente tuviera que hacer tokenización del nombre de laagency_name
. - Almacene la asignación de ID a nombre en una base de datos relacional o en una caché de archivos sin formato y realice la combinación del lado del cliente
- Almacene los documentos de la agencia como otro tipo y haga dos llamadas. El primero en obtener los ID y luego el segundo para buscar las agencias por ID
Como Aditya Patel mencionó anteriormente, las relaciones entre padres e hijos también pueden ayudar, pero creo que todavía tendrá que usar una de las estrategias anteriores para resolver el mapeo de id-> name.
Esta es una publicación antigua, sin embargo, me encontré con el mismo problema y seguí lo que se proporciona en https://www.elastic.co/guide/en/elasticsearch/reference/current/agg-metadata.html . Agregue detalles de metadatos y se devolverá como parte del resultado sobre el grupo. Espero que ayude a alguien en el futuro.
Puedes usar la agregación de los mejores hits como en el enlace de abajo. El formato será ligeramente diferente, ya que la creación de la agregación adicional incrustará el nombre de la agencia bajo otra tecla de "aciertos".
Agregando campos adicionales a la agregación de términos de ElasticSearch
{
"aggs": {
"name": {
"terms": {
"field": "agency_code"
},
"aggs": {
"agency_names" : {
"top_hits": {
size: 1,
_source: {
include: [''agency_name'']
}
}
}
}
}
}
}