如何过滤 ElasticSearch 中的热门术语聚合?
How to filter top terms aggregation in ElasticSearch?
我有 orders
个这样的文档:
{
"customer":{
"id":1,
"Name":"Foobar"
},
"products":[
{
"id":1,
"name":"Television",
"category": 11
},
{
"id":2,
"name":"Smartphone",
"category": 12
}
]
}
我正在执行top_terms_aggregation
以了解最畅销的产品。要在全球范围内进行,我使用:
{
"size":0,
"aggs":{
"products":{
"nested":{
"path":"products"
},
"aggs":{
"top_terms_aggregation":{
"terms":{
"field":"products.id",
"size":10
}
}
}
}
}
}
但是,如果给定 category_id
,我将如何筛选产品?我尝试添加此过滤器:
"query":{
"bool":{
"must":[
{
"match":{
"products.category":11
}
}
]
}
}
但这会过滤包含 一些 给定类别产品的订单本身,并且聚合会损坏。
我想获取属于给定类别的畅销产品。
您可以使用filter aggregation
GET _search
{
"size":0,
"aggs":{
"products":{
"nested":{
"path":"products"
},
"filter": {
"term": {
"category": 11
}
},
"aggs":{
"top_terms_aggregation":{
"terms":{
"field":"products.id",
"size":10
}
}
}
}
}
}
这样解决的:
{
"size":0,
"aggs":{
"products":{
"nested":{
"path":"products"
},
"aggs":{
"first_filter":{
"filter":{
"term":{
"products.category":11
}
},
"aggs":{
"top_terms_aggregation":{
"terms":{
"field":"products.id",
"size":10
}
}
}
}
}
}
}
}
一定是 aggs
或 "stranger things" 的确切顺序发生了。
我有 orders
个这样的文档:
{
"customer":{
"id":1,
"Name":"Foobar"
},
"products":[
{
"id":1,
"name":"Television",
"category": 11
},
{
"id":2,
"name":"Smartphone",
"category": 12
}
]
}
我正在执行top_terms_aggregation
以了解最畅销的产品。要在全球范围内进行,我使用:
{
"size":0,
"aggs":{
"products":{
"nested":{
"path":"products"
},
"aggs":{
"top_terms_aggregation":{
"terms":{
"field":"products.id",
"size":10
}
}
}
}
}
}
但是,如果给定 category_id
,我将如何筛选产品?我尝试添加此过滤器:
"query":{
"bool":{
"must":[
{
"match":{
"products.category":11
}
}
]
}
}
但这会过滤包含 一些 给定类别产品的订单本身,并且聚合会损坏。
我想获取属于给定类别的畅销产品。
您可以使用filter aggregation
GET _search
{
"size":0,
"aggs":{
"products":{
"nested":{
"path":"products"
},
"filter": {
"term": {
"category": 11
}
},
"aggs":{
"top_terms_aggregation":{
"terms":{
"field":"products.id",
"size":10
}
}
}
}
}
}
这样解决的:
{
"size":0,
"aggs":{
"products":{
"nested":{
"path":"products"
},
"aggs":{
"first_filter":{
"filter":{
"term":{
"products.category":11
}
},
"aggs":{
"top_terms_aggregation":{
"terms":{
"field":"products.id",
"size":10
}
}
}
}
}
}
}
}
一定是 aggs
或 "stranger things" 的确切顺序发生了。