嵌套(Elastic)中的聚合,包含嵌套和父对象的过滤器

时间:2015-04-08 15:47:18

标签: elasticsearch nested parent-child aggregates

我有一个我想要计算聚合的产品目录。尝试使用包含嵌套字符和父字段的过滤器进行嵌套聚合时会出现问题。它可以提供错误的计数或0次点击。以下是我的产品对象映射示例:

"Products": {
        "properties": {
           "ProductID": {
              "type": "long"
           },
           "ProductType": {
              "type": "long"
           },
           "ProductName": {
              "type": "string",
              "fields": {
                 "raw": {
                    "type": "string",
                    "index": "not_analyzed"
                 }
              }
           },
           "Prices": {
              "type": "nested",
              "properties": {
                 "CurrencyType": {
                    "type": "integer"
                 },
                 "Cost": {
                    "type": "double"                        
                 }
              }
          } 
      }
  }

以下是我试图以弹性方式复制的SQL查询示例:

SELECT PRODPR.Cost AS PRODPR_Cost 
    ,COUNT(PROD.ProdcutID) AS PROD_ProductID_Count
FROM Products PROD WITH (NOLOCK)
LEFT OUTER JOIN Prices PRODPR WITH (NOLOCK) ON (PRODPR.objectid = PROD.objectid)
WHERE PRODPR.CurrencyType = 4
    AND PROD.ProductType IN (
        11273
        ,11293
        ,11294
        )
GROUP BY PRODPR.Cost

我提出的弹性搜索查询: First One(以下查询返回正确的计数,只使用CurrencyType作为过滤器,但是当我添加ProductType过滤器时,它会给我错误的计数)

GET /IndexName/Products/_search
{
  "aggs": {
    "price_agg": {
      "filter": {
        "bool": {
          **"must": [
            {
              "nested": {
                "path": "Prices",
                    "filter": {
                      "term": {
                        "Prices.CurrencyType": "8"
                      }
                }
              }
            },
            {
              "terms": {
                "ProductType": [
                  "11273",
                  "11293",
                  "11294"
                ]
              }
            }
          ]**
        }
      },
      "aggs": {
        "price_nested_agg": {
          "nested": {
            "path": "Prices"
          },
          "aggs": {
            "59316518_group_agg": {
              "terms": {
                "field": "Prices.Cost",
                "size": 0
              },
              "aggs": {
                "product_count": {
                    "reverse_nested": { },
                    "aggs": {
                        "ProductID_count_agg": {
                            "value_count": {
                                "field": "ProductID"
                            }
                        }
                    }
                }
              }
            }
          }
        }
      }
    }
  },
  "size": 0
}

Second One(以下查询返回正确的计数,仅使用CurrencyType作为过滤器,但是当我添加ProductType过滤器时,它会给我0次点击):

GET /IndexName/Prodcuts/_search
{
  "aggs": {
    "price_agg": {
      "nested": {
        "path": "Prices"
      },
      "aggs": {
        "currency_filter": {
          "filter": {
              "bool": {
                  "must": [
                     {
                         "term": {
                            "Prices.CurrrencyType": "4"
                         }
                     },
                     {
                         "terms": {
                            "ProductType": [
                               "11273",
                               "11293"
                            ]
                         }
                     }
                  ]
              }
          },
          "aggs": {
            "59316518_group_agg": {
              "terms": {
                "field": "Prices.Cost",
                "size": 0
              },
              "aggs": {
                "product_count": {
                  "reverse_nested": {},
                  "aggs": {
                    "ProductID_count_agg": {
                      "value_count": {
                        "field": "ProductID"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "size": 0
}

我已经尝试了一些查询,但上面两个是我最接近的。有没有人遇到这个用例?我究竟做错了什么?任何帮助表示赞赏。谢谢!

0 个答案:

没有答案