我想获得一个请求数据来构建这样的东西:
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。
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,MMC和SD)。我想有"resolution"只"2048x1536","1024x768"并具有其他关键值"resolution",对"card readers"只"MMC","SD"以及其他价值具有关键"card readers"。
2048x1536
MMC
SD
"resolution"
"2048x1536"
"1024x768"
"card readers"
"MMC"
"SD"
'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。
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 } } } } } } } }