usa tutorial que puertos para instalar index funciona elastic crear como comandos elasticsearch

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''} } }