应用过滤器以使用弹性搜索排除嵌套对象字段上的特定数值

Applying a filter to exclude a specific numerical value on a nested object's field with elastic search

我正在尝试通过 elasticsearch 计算我的数据库中某个字段的聚合平均值。 我在没有任何过滤的情况下计算 av 值没有任何问题:

{
    "query": {
        "match_all":{}
    },
    "size": 0,
    "aggs": {
        "avg_quantity": {
            "avg": {
                "field": "license_offer.unit_price"
            }
        }
    }   
}

但是我需要从聚合文档中排除 license_offer.unit_price 为 0 的文档(licence_offer 是许可证中的嵌套对象)。

我尝试了不同的东西,这是我最近的尝试:

{
    "size": 0,
    "query": {
        "constant_score": {
            "filter": {
                "license_offer.unit_price": {
                        "gte": 0
                }
            }
        }
    },
    "aggs": {
        "quantity_stats": {
            "stats": {
                "field": "license_offer.unit_price"
            }
        }
    }

}

但我收到一个错误:

 "type": "parsing_exception",
        "reason": "no [query] registered for [license_offer.unit_price]",

如何通过弹性搜索应用过滤器来排除嵌套对象字段上的特定数值?

您的查询不正确,您只是缺少 range 关键字:

{
    "size": 0,
    "query": {
        "constant_score": {
            "filter": {
                "range": {                           <--- add this
                     "license_offer.unit_price": {
                        "gte": 0
                     }
                }
            }
        }
    },
    "aggs": {
        "quantity_stats": {
            "stats": {
                "field": "license_offer.unit_price"
            }
        }
    }

}

您还可以将过滤器移动到聚合部分:

{
  "size": 0,
  "aggs": {
    "only_positive": {
      "filter": {
        "range": {
          "license_offer.unit_price": {
            "gt": 0
          }
        }
      },
      "aggs": {
        "quantity_stats": {
          "stats": {
            "field": "license_offer.unit_price"
          }
        }
      }
    }
  }
}