ElasticSearch:嵌套数组

时间:2017-03-14 13:56:27

标签: elasticsearch aggregation

有一个产品清单。

每个产品(文档)都有id,name等数据。

此外,每个文档都包含每个客户的特定信息(例如可用性: 给定的产品可供一个客户使用,而不适用于另一个客户。此特定信息是嵌套数组。

'可用性' 可能包含以下值:' sold_out ',' 可用',' ';

这是ES映射:

"mappings": {
    "products": {
        "properties": {
            ...
            "clients": {
                "type": "nested",
                "include_in_parent": true,
                "properties": {
                    ...
                    "availability": {
                        "type": "string",
                        "index": "not_analyzed" 
                    }           
                }
            } 
        }
    }
}    

我需要为给定的客户计算 sold_out 可用的产品。 (搜索参数中有客户端过滤器)

...
"query": {
    "bool": { 
      "filter": [
        { "term": {"clients.id": 123456789}},        
      ]
    }
  }
...

如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

据我所知,“clients”是一个嵌套数组,包括一个非嵌套的“可用性”过滤器。所以,你可以这样:

{
    "query": {
        "nested": {
            "path":"clients",
            "filter":{
                "term":{
                    "clients.id": <some_client_id>
                }
            }
        }
    },
    "aggs": {
        "nestedClient": {
            "nested":{
                "path": "clients",
                "aggs": {
                    "filterClient":{
                        "filter": {
                            "term":{
                                "clients.id":<same_client's_id>
                            }
                        },
                        "aggs": {
                            "availabilityTerms": {
                                "terms": {
                                    "field": "clients.availability"
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

查询是缩小包含客户信息的产品集。之后,您需要过滤嵌套文档,然后对它们运行术语聚合。这里的假设是每个产品只包含任何特定客户的一个条目。 “availabilityTerms”的存储桶将为您提供所需的数据。