我希望获得一个请求数据来构建这样的内容:
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
)
)
)
)
)
)
)
)
我接近于解决问题(在我的查询下面),但在第二级聚合中我拥有所有值(例如"解决方案"我有2048x1536
,{ {1}}和MMC
)。我希望SD
仅"resolution"
,"2048x1536"
以及其他具有键"1024x768"
的值,"resolution"
仅"card readers"
,{{1} }和其他具有键"MMC"
的值。
"SD"
答案 0 :(得分:6)
您需要更改地图并将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
}
}
}
}
}
}
}
}