elasticsearch Elasticsearch组和聚合嵌套值
我希望输入一个请求数据来构建如下内容:elasticsearch Elasticsearch组和聚合嵌套值,elasticsearch,elasticsearch,我希望输入一个请求数据来构建如下内容: 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) {
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)
{
"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"
}
}
}
}
}
}
}
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
)
)
)
)
)
)
)
)
{
"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"
}
}
}
}
}
}
}
首先,我对Elasticsearch进行如下映射:
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)
{
"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"
}
}
}
}
}
}
}
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
)
)
)
)
)
)
)
)
{
"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"
}
}
}
}
}
}
}
然后我添加如下所示的对象。
在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
)
)
)
现在我想得到这样的结果:
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)
{
"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"
}
}
}
}
}
}
}
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
)
)
)
)
)
)
)
)
{
"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"
}
}
}
}
}
}
}
我即将解决这个问题(在我的查询下面),但在第二级聚合中,我有所有的值(例如在“resolution”中,我有2048x1536
、MMC
和SD
)。我只想在“resolution”
中有“2048x1536”
,“1024x768”
和其他具有键“resolution”
的值,在“读卡器”
上只有“MMC”
,“SD”
和其他具有键“读卡器”
的值
您需要更改映射并将
productAttributeFields
设为嵌套的字段,以便可以保留productAttributeFields.name
和productAttributeFields.value
之间的关联
映射应如下所示:
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)
{
"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"
}
}
}
}
}
}
}
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
)
)
)
)
)
)
)
)
{
"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
}
}
}
}
}
}
}
}
我在这里提出了一个类似的解决方案: