我想获得一个请求数据来构建这样的东西:
Categories:
- laptops (5)
- accessories (50)
- monitors (10)
-- above part is easy --
Attributest for actual category ex. laptops:
- card reder:
- MMC (1)
- SD (5)
- resolution:
- 1024x768 (2)
- 2048x1536 (3)
首先,我在Elasticsearch上进行映射,如下所示:
{
"mappings": {
"product": {
"properties": {
"name": {
"type": "string"
},
"categoryName": {
"type": "string",
"index": "not_analyzed"
},
"priceBrutto": {
"type": "float"
},
"categoryCode": {
"type": "integer"
},
"productAttributeFields" : {
"properties" : {
"name" : {
"index" : "not_analyzed",
"type" : "string"
},
"value" : {
"index" : "not_analyzed",
"type" : "string"
}
}
}
}
}
}
}
然后我添加对象,如下所示。
在
productAttributeFields
中将有许多属性。如果笔记本电脑有许多端口,则每个端口都是productAttributeFields
中的另一个数组。Array
(
[name] => Macbook Pro
[categoryCode] => 123
[categoryName] => Notebooks
[priceBrutto] => 1500
[productAttributeFields] => Array
(
[0] => Array
(
[name] => Resolution
[value] => 2048x1536
)
[1] => Array
(
[name] => Memory Readers
[value] => MMC
)
[2] => Array
(
[name] => Memory Readers
[value] => SD
)
)
)
现在我想要这样的结果:
Array
(
[took] => 132
[timed_out] =>
[_shards] => Array
(
[total] => 1
[successful] => 1
[failed] => 0
)
[hits] => Array
(
[total] => 631
[max_score] => 0
[hits] => Array
(
)
)
[aggregations] => Array
(
[attrs] => Array
(
[doc_count_error_upper_bound] => 0
[sum_other_doc_count] => 4608
[buckets] => Array
(
[0] => Array
(
[key] => Resolution
[doc_count] => 619
[attrsValues] => Array
(
[doc_count_error_upper_bound] => 0
[sum_other_doc_count] => 14199
[buckets] => Array
(
[0] => Array
(
[key] => 2048x1536
[doc_count] => 123
)
[1] => Array
(
[key] => 1024x768
[doc_count] => 3
)
)
)
)
[1] => Array
(
[key] => Memory Readers
[doc_count] => 618
[wartosci] => Array
(
[doc_count_error_upper_bound] => 0
[sum_other_doc_count] => 14185
[buckets] => Array
(
[0] => Array
(
[key] => MMC
[doc_count] => 431
)
[1] => Array
(
[key] => SD
[doc_count] => 430
)
)
)
)
)
)
)
)
我即将解决问题(在查询下方),但是在第二级聚合中,我具有所有值(例如,在“resolution”中,我具有
2048x1536
,MMC
和SD
)。我想在"resolution"
中仅包含"2048x1536"
,"1024x768"
和其他具有键"resolution"
的值,在"card readers"
上仅具有"MMC"
,"SD"
和其他具有键"card readers"
的值。'body' => [
'query' => [
'match' => [
categoryCode = 123
],
],
'aggs' => [
'attrs' => [
'terms' => [
'field' => 'productAttributeFields.name',
],
'aggs' => [
'attrsValues' => [
'terms' => [
'field' => 'productAttributeFields.value',
'size' => 100,
],
],
],
],
],
]
最佳答案
您需要更改映射并将productAttributeFields
设置为nested
字段,以便保留productAttributeFields.name
和productAttributeFields.value
之间的关联。
映射应如下所示:
{
"mappings": {
"product": {
"properties": {
"name": {
"type": "string"
},
"categoryName": {
"type": "string",
"index": "not_analyzed"
},
"priceBrutto": {
"type": "float"
},
"categoryCode": {
"type": "integer"
},
"productAttributeFields": {
"type": "nested",
"include_in_parent": true,
"properties": {
"name": {
"index": "not_analyzed",
"type": "string"
},
"value": {
"index": "not_analyzed",
"type": "string"
}
}
}
}
}
}
}
然后查询更改为
{
"query": {
"match": {
"categoryCode": 123
}
},
"aggs": {
"attrs_root": {
"nested": {
"path": "productAttributeFields"
},
"aggs": {
"attrs": {
"terms": {
"field": "productAttributeFields.name"
},
"aggs": {
"attrsValues": {
"terms": {
"field": "productAttributeFields.value",
"size": 100
}
}
}
}
}
}
}
}