我们的 flex 映射
> {"mappings": {
> "products" : {
> "properties":{
> "name " : {
> "type" : "keyword"
> },
> "resellers" : {
> "type" : "nested",
> "properties" : {
> "name" : { "type" : "text" },
> "price" : { "type" : "double" }
> }
> }
> }
> }
> }}
在此映射中,每个产品都存储以特定价格出售产品的经销商列表。我们需要找到特定经销商的所有不同价格。
根据我的理解,我们需要查询DSL,它应该首先在给定的经销商上具有嵌套过滤器,然后再应用计数聚合。我们针对ES 5.6版本形成了以下ES查询:-
{
"query": {
"nested": {
"path": "resellers",
"query": {
"bool": {
"filter": {
"match_phrase_prefix": {
"resellers.name": "flipkart"
}
}
}
}
}
},
"aggs": {
"narrow": {
"filter": {
"nested": {
"path": "resellers",
"query": {
"bool": {
"filter": {
"term": {
"resellers.name": "flipkart"
}
}
}
}
}
},
"aggs": {
"state": {
"nested": {
"path": "resellers"
},
"aggs": {
"count": {
"terms": {
"field": "resellers.price"
}
}
}
}
}
}
}
}
该查询生成不正确的输出。输出还包含存在于 flex 文档中的其他经销商的价格(例如Amazon,Snapdeal等)。有人可以帮助纠正查询吗?
最佳答案
请改用以下查询(即在嵌套聚合内部而不是外部进行过滤):
{
"query": {
"nested": {
"path": "resellers",
"query": {
"bool": {
"filter": {
"match_phrase_prefix": {
"resellers.name": "flipkart"
}
}
}
}
}
},
"aggs": {
"resellers": {
"nested": {
"path": "resellers"
},
"aggs": {
"narrow": {
"filter": {
"term": {
"resellers.name": "flipkart"
}
},
"aggs": {
"count": {
"terms": {
"field": "resellers.price"
}
}
}
}
}
}
}
}
关于elasticsearch - 对过滤后的嵌套对象进行聚合计数会得出错误的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57507579/