Facetas estatísticas de vários campos no ElasticSearch

TL; DR – Ao executar múltiplas facetas estatísticas com o mesmo nome, ElasticSearch irá catenar os dados de todos os campos ao executar os resultados. Usando o invólucro Ruby’s Tire no ElasticSearch, apenas a última faceta nomeada será enviada para ElasticSearch.

Os dados nesses exemplos são triviais, mas fazem um trabalho claro ilustrando esse ‘recurso’ não intencional.

Exemplo 1

Sales.search do 
query
{ all }
facet
'stats' do
statistical
:amount
end

puts to_curl

end

curl
-X GET 'http://localhost:9200/sales/sale/_search?size=10&pretty' -d '{"query":{"match_all":{}},"facets":{"stats":{"statistical":{"field":"amount"}}},"size":10}'

@facets={"stats"=>{"_type"=>"statistical",
"count"=>1476,
"total"=>865389.1399999999,
"min"=>1.0, "max"=>9289.0,
"mean"=>586.3070054200541,
"sum_of_squares"=>1252317429.8326,
"variance"=>504697.63864238764,
"std_deviation"=>710.4207476153745}}

Exemplo 2

Sales.search do 
query
{ all }
facet
'stats' do
statistical
:id
end

puts to_curl

end

curl
-X GET 'http://localhost:9200/sales/sale/_search?size=10&pretty' -d '{"query":{"match_all":{}},"facets":{"stats":{"statistical":{"field":"id"}}},"size":10}'

@facets={"stats"=>{"_type"=>"statistical",
"count"=>20,
"total"=>34.0,
"min"=>1.0,
"max"=>4.0,
"mean"=>1.7,
"sum_of_squares"=>78.0,
"variance"=>1.0100000000000002,
"std_deviation"=>1.0049875621120892}}

Exemplo 3

Sales.search do 
query
{ all }
facet
'stats' do
statistical
:id
end
facet
'stats' do
statistical
:amount
end

puts to_curl

end

curl
-X GET 'http://localhost:9200/sales/sale/_search?size=10&pretty' -d '{"query":{"match_all":{}},"facets":{"stats":{"statistical":{"field":"amount"}}},"size":10}'

@facets={"stats"=>{"_type"=>"statistical",
"count"=>1476,
"total"=>865389.1399999999,
"min"=>1.0,
"max"=>9289.0,
"mean"=>586.3070054200541,
"sum_of_squares"=>1252317429.8326,
"variance"=>504697.63864238764,
"std_deviation"=>710.4207476153745}}

Observe acima que Tiro ignorou a primeira faceta e enviou apenas a segunda.

Exemplo 4

Solicitação de curl manuscrita, sem embalagem de pneu

curl -X GET 'http://localhost:9200/sales/sale/_search?size=10&pretty' -d '{"query":{"match_all":{}},"facets":{"stats":{"statistical":{"field":"amount"}},"stats":{"statistical":{"field":"id"}}},"size":10}'

"facets" : {
"stats" : {
"_type" : "statistical",
"count" : 1496,
"total" : 865423.1399999999,
"min" : 1.0,
"max" : 9289.0,
"mean" : 578.4914037433155,
"sum_of_squares" : 1.2523175078326E9,
"variance" : 502458.32937302964,
"std_deviation" : 708.8429511344735
},
"stats" : {
"_type" : "statistical",
"count" : 1496,
"total" : 865423.1399999999,
"min" : 1.0,
"max" : 9289.0,
"mean" : 578.4914037433155,
"sum_of_squares" : 1.2523175078326E9,
"variance" : 502458.32937302964,
"std_deviation" : 708.8429511344735
}
}

Aqui, ambas as facetas são registradas e ambas contêm informações de ambos os campos.

consulte: http://elasticsearch-users.115913.n3.nabble.com/Statistically-facet-on-multiple-fields-td1676993.html para uma discussão sobre o assunto.
consulte também: http://www.elasticsearch.org/guide/reference/api/search/facets/statistically-facet/ para saber a maneira adequada de executar intencionalmente uma faceta de vários campos.