我希望获得一个请求数据来构建这样的东西:
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)
Run Code Online (Sandbox Code Playgroud)
首先,我在我的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"
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我添加如下所示的对象.在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
)
)
)
Run Code Online (Sandbox Code Playgroud)
现在我想得到这样的结果:
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
)
)
)
)
)
)
)
)
Run Code Online (Sandbox Code Playgroud)
我接近解决问题(我下面的查询),但在第二级聚集我所有的值(例如,在"决议"我有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,
],
],
],
],
],
]
Run Code Online (Sandbox Code Playgroud)
你需要改变你的映射,使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"
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
并且查询更改为
{
"query": {
"match": {
"categoryCode": 123
}
},
"aggs": {
"attrs_root": {
"nested": {
"path": "productAttributeFields"
},
"aggs": {
"attrs": {
"terms": {
"field": "productAttributeFields.name"
},
"aggs": {
"attrsValues": {
"terms": {
"field": "productAttributeFields.value",
"size": 100
}
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6769 次 |
| 最近记录: |