ElasticSearch - 嵌套过滤聚合
ElasticSearch - Nested Filtered Aggregations
我正在寻找一种方法来从已过滤的 2 级嵌套对象中获取最小值和最大值。所以下面我试图获得具有 currencyCode
GBP 的最低和最高价格。每个产品可以有多个 SKU,每个 SKU 可以有多个价格(尽管只有 1 个是英镑):
"hits": [
{
"_index": "product",
"_type": "main",
"_id": "1",
"_score": 1,
"_source": {
"skus": [
{
"prices": [
{
"currencyCode": "GBP",
"price": 15
}
]
}
]
}
},{
"_index": "product",
"_type": "main",
"_id": "2",
"_score": 1,
"_source": {
"skus": [
{
"prices": [
{
"currencyCode": "GBP",
"price": 20
}
]
}
]
}
},
{
"_index": "product",
"_type": "main",
"_id": "3",
"_score": 1,
"_source": {
"skus": [
{
"prices": [
{
"currencyCode": "GBP",
"price": 25
}
]
}
]
}
}]
}
所以我想要最小 15,最大 25。我调查了 Filter Aggregation and Nested Aggregation 但无法得出答案。
我使用的是 ElasticSearch 5.5 版。
在转换为 Nest .net 之前,我试图先让查询正常工作。
如有任何帮助,我们将不胜感激。
您可以嵌套 "nested" 和 "filter" 聚合,如下所示:
{
"size": 0,
"aggs": {
"skus": {
"nested": {
"path": "skus"
},
"aggs": {
"prices": {
"nested": {
"path": "skus.prices"
},
"aggs": {
"gbp_filter": {
"filter": {
"term": {
"skus.prices.currencyCode": "GBP"
}
},
"aggs": {
"min_price": {
"min": {
"field": "skus.prices.price"
}
},
"max_price": {
"max": {
"field": "skus.prices.price"
}
}
}
}
}
}
}
}
}
}
但是,既然你说只有一个价格可以是英镑,那么对于每个 SKU,每种货币只能有一个价格是不是也是这样?如果是这样的话,我建议不要在这里使用嵌套数据类型来表示价格。相反,您可以使用这样的映射:
{
"product": {
"properties": {
"skus": {
"type": "nested",
"properties": {
"prices": {
"properties": {
"GBP": {"properties": {"price": {"type": "integer"}}},
"USD": {"properties": {"price": {"type": "integer"}}},
...remaining currencies...
}
}
}
}
}
}
}
映射不是很简洁,但是查询效率会更高,查询也更好看。 (几乎)任何时候你都可以对你的数据进行反规范化以摆脱嵌套,即使你必须重复信息(为了满足不同类型查询的需要),也是一个好主意。
我正在寻找一种方法来从已过滤的 2 级嵌套对象中获取最小值和最大值。所以下面我试图获得具有 currencyCode
GBP 的最低和最高价格。每个产品可以有多个 SKU,每个 SKU 可以有多个价格(尽管只有 1 个是英镑):
"hits": [
{
"_index": "product",
"_type": "main",
"_id": "1",
"_score": 1,
"_source": {
"skus": [
{
"prices": [
{
"currencyCode": "GBP",
"price": 15
}
]
}
]
}
},{
"_index": "product",
"_type": "main",
"_id": "2",
"_score": 1,
"_source": {
"skus": [
{
"prices": [
{
"currencyCode": "GBP",
"price": 20
}
]
}
]
}
},
{
"_index": "product",
"_type": "main",
"_id": "3",
"_score": 1,
"_source": {
"skus": [
{
"prices": [
{
"currencyCode": "GBP",
"price": 25
}
]
}
]
}
}]
}
所以我想要最小 15,最大 25。我调查了 Filter Aggregation and Nested Aggregation 但无法得出答案。
我使用的是 ElasticSearch 5.5 版。
在转换为 Nest .net 之前,我试图先让查询正常工作。
如有任何帮助,我们将不胜感激。
您可以嵌套 "nested" 和 "filter" 聚合,如下所示:
{
"size": 0,
"aggs": {
"skus": {
"nested": {
"path": "skus"
},
"aggs": {
"prices": {
"nested": {
"path": "skus.prices"
},
"aggs": {
"gbp_filter": {
"filter": {
"term": {
"skus.prices.currencyCode": "GBP"
}
},
"aggs": {
"min_price": {
"min": {
"field": "skus.prices.price"
}
},
"max_price": {
"max": {
"field": "skus.prices.price"
}
}
}
}
}
}
}
}
}
}
但是,既然你说只有一个价格可以是英镑,那么对于每个 SKU,每种货币只能有一个价格是不是也是这样?如果是这样的话,我建议不要在这里使用嵌套数据类型来表示价格。相反,您可以使用这样的映射:
{
"product": {
"properties": {
"skus": {
"type": "nested",
"properties": {
"prices": {
"properties": {
"GBP": {"properties": {"price": {"type": "integer"}}},
"USD": {"properties": {"price": {"type": "integer"}}},
...remaining currencies...
}
}
}
}
}
}
}
映射不是很简洁,但是查询效率会更高,查询也更好看。 (几乎)任何时候你都可以对你的数据进行反规范化以摆脱嵌套,即使你必须重复信息(为了满足不同类型查询的需要),也是一个好主意。