multiple - elasticsearch aggregations example
Elasticsearch: valores de acceso desde cubos en agregaciones (1)
Me gustaría crear nubes de palabras para visualizar los resultados de las consultas de Elasticsearch. En la nube de palabras, se deben mostrar todos los términos que aparecen en los documentos que coinciden con la consulta. Entonces, necesito calcular el término frecuencias para todos los términos que ocurren en algún conjunto arbitrario de documentos. El problema es que necesito las frecuencias reales de todos los términos en los documentos, y no solo la cantidad de documentos en los que aparece un término (esto se resuelve fácilmente usando una agregación de términos o facetas).
Dado el siguiente índice de prueba
curl -XPOST localhost:9200/test -d ''{
"mappings": {
"testdoc" : {
"properties" : {
"text" : {
"type" : "string",
"term_vector": "yes"
}
}
}
}
}''
y datos:
curl -XPOST "http://localhost:9200/sports/_bulk" -d''
{"index":{"_index":"test","_type":"testdoc"}}
{"text":"bike bike car"}
{"index":{"_index":"test","_type":"testdoc"}}
{"text":"car"}
{"index":{"_index":"test","_type":"testdoc"}}
{"text":"car car bus bus"}
{"index":{"_index":"test","_type":"testdoc"}}
{"text":"bike car bus"}
''
La siguiente consulta devuelve el término frecuencia del término ''bicicleta''.
curl -XPOST "http://localhost:9200/test/testdoc/_search" -d''
{
"query": {
"match_all": {}
},
"aggs": {
"words": {
"terms": {
"field": "text"
},
"aggs": {
"tf_sum": {
"sum": {
"script": "_index[/"text/"][/"bike/"].tf()"
}
}
}
}
}
}''
Resultado:
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 4,
"max_score": 0,
"hits": []
},
"aggregations": {
"words": {
"buckets": [
{
"key": "car",
"doc_count": 4,
"tf_sum": {
"value": 3
}
},
{
"key": "bike",
"doc_count": 2,
"tf_sum": {
"value": 3
}
},
{
"key": "bus",
"doc_count": 2,
"tf_sum": {
"value": 1
}
}
]
}
}
}
Sin embargo, en lugar de calcular el tf_sum para ''bicicleta'' solamente, me gustaría calcular el tf_sum para todos los términos devueltos por la agregación de palabras. ¿Hay alguna forma de acceder al campo clave de los depósitos en el script de la agregación tf_sum, para que pueda calcular la frecuencia total de términos para todos los términos devueltos por la agregación de palabras?
Bien, podemos lograr esto usando script en términos de agregación. Podemos acceder al valor del término usando la variable _value
curl -XPOST "http://localhost:9200/test/testdoc/_search" -d''
{
"query": {
"match_all": {}
},
"aggs": {
"words": {
"terms": {
"field": "text",
"script" : "_index[/"text/"][_value].tf()"
}
}
}
}''