我们的 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/

10-13 07:48
查看更多