Ruby on rails Elasicsearch通过脚本聚合获得前5名结果
我正在尝试使用Rails中的elasticsearch获得收入部订购的前5名产品 我的问题是:Ruby on rails Elasicsearch通过脚本聚合获得前5名结果,ruby-on-rails,
elasticsearch,Ruby On Rails,
elasticsearch,我正在尝试使用Rails中的elasticsearch获得收入部订购的前5名产品 我的问题是: query = { bool: { filter: { bool: { must: [ { term: { store_id: store.id } } # Limiting the products by store ] } } } } aggs
query = {
bool: {
filter: {
bool: {
must: [
{ term: { store_id: store.id } } # Limiting the products by store
]
}
}
}
}
aggs = {
by_revenue: {
terms: {
size: 5,
order: {revenue: "desc"}
},
aggs: {
revenue: {
max: {
script: "doc['price_as_float'].value * doc['quantity'].value"
}
}
}
}
}
response = OrderItem.search(query: query, aggs: aggs, size: 0)
我发现错误无法找到适当的值上下文来执行[按收入]聚合
谢谢 您需要根据产品参考汇总订单,然后将价格*数量相加,以嵌套的总和聚合(而不是最大值)获得一个产品的收入:
aggs: {
products: {
terms: {
field: "product_ref",
order: { revenues: "desc" },
},
aggs: {
revenues: {
sum: { script: "doc['price_as_float'].value * doc['quantity'].value" }
}
}
}
}
不要在术语聚合中使用大小选项,因为您不确定顶级产品的所有订单都位于同一个分片中;您应该从响应中获取它们。它位于OrderItem索引中,因此每个产品没有一个字段,而是每次销售时的集合。因此,您如何获得它将按单个订单的单个产品产生的大部分收入进行排序。好的,那么您只是缺少按产品参考进行的聚合。请看我的最新答案。你太棒了!从今天早上开始,我一直在努力解决这个问题。非常感谢!