tutorial - Agregando campos adicionales a la agregación de términos de ElasticSearch
puertos elasticsearch (2)
Parece que la mejor manera de mostrar las intenciones es la agregación de los mejores hits : "de cada grupo agregado, seleccione solo un documento", y luego extraiga la plataforma de él:
aggs: {
platforms: {
terms: {field: ''platform.id''},
aggs: {
platform: {top_hits: {size: 1, _source: {include: [''platform'']}}}
}
}
De esta manera, cada golpe se verá como:
{"key": 7,
"doc_count": 529939,
"platform": {
"hits": {
"hits": [{
"_source": {
"platform":
{"id": 7, "name": "Facebook", "url": "http://facebook.com"}
}
}]
}
},
}
Lo cual es un poco demasiado profundo (como es habitual en ES), pero limpio: bucket.platform.hits.hits.first._source.platform
Los documentos indexados son como:
{
id: 1,
title: ''Blah'',
...
platform: {id: 84, url: ''http://facebook.com'', title: ''Facebook''}
...
}
Lo que quiero es contar y sacar estadísticas por plataforma. Para el recuento, puedo usar la agregación de términos con platform.id
como campo para contar:
aggs: {
platforms: {
terms: {field: ''platform.id''}
}
}
De esta manera, recibo las estadísticas en forma de múltiples cubos con el aspecto de {key: 8, doc_count: 162511}
, como se esperaba.
Ahora, ¿puedo agregar de alguna manera a esos grupos también platform.name
y platform.url
(para obtener un buen rendimiento de las estadísticas)? Lo mejor que he visto se ve como:
aggs: {
platforms: {
terms: {field: ''platform.id''},
aggs: {
name: {terms: {field: ''platform.name''}},
url: {terms: {field: ''platform.url''}}
}
}
}
Lo que, de hecho, funciona, y devuelve una estructura bastante complicada en cada cubo:
{key: 7,
doc_count: 528568,
url:
{doc_count_error_upper_bound: 0,
sum_other_doc_count: 0,
buckets: [{key: "http://facebook.com", doc_count: 528568}]},
name:
{doc_count_error_upper_bound: 0,
sum_other_doc_count: 0,
buckets: [{key: "Facebook", doc_count: 528568}]}},
Por supuesto, el nombre y la URL de la plataforma podrían extraerse de esta estructura (como bucket.url.buckets.first.key
), pero ¿hay bucket.url.buckets.first.key
forma más limpia y sencilla de realizar la tarea?
Si no necesariamente necesita obtener el valor de platform.id
, podría salirse con una única agregación en lugar de usar un script
que concatene el name
y la url
los dos campos:
aggs: {
platforms: {
terms: {script: ''doc["platform.name"].value + "," + doc["platform.url"].value''}
}
}